这是我想弄清楚的,我有一个MC9S08AW60。它有两个定时器,我试图配置或只是检查定时器的勾号,即,我只想检查溢出标志何时改变。代码的基本设计是:
PTFDD = 0xFF;
int j,ch_nbr;
// LED mask values:
#define mLED0 0x01
#define mLED1 0x02
#define mLED2 0x04
#define mLED3 0x08
#define mLED4 0x10
#define mLED5 0x20
#define mLED6 0x40
#define mLED7 0x80
void main()
{
While(j>0){
ch_nbr++;
if (ch_nbr == 8) ch_nbr = 0;
if (ch_nbr == 0) PTFD = mLED0; // Turn LED0 on, other LEDs off
if (ch_nbr == 1) PTFD = mLED1; // Turn LED1 on, other LEDs off
if (ch_nbr == 2) PTFD = mLED2; // Turn LED2 on, other LEDs off
if (ch_nbr == 3) PTFD = mLED3; // Turn LED3 on, other LEDs off
if (ch_nbr == 4) PTFD = mLED4; // Turn LED4 on, other LEDs off
if (ch_nbr == 5) PTFD = mLED5; // Turn LED5 on, other LEDs off
if (ch_nbr == 6) PTFD = mLED6; // Turn LED6 on, other LEDs off
if (ch_nbr == 7) PTFD = mLED7; // Turn LED7 on, other LEDs off
Mydelay();
}
}
void Mydelay(int *j)
{
if (TPM1SC_TOF == 0) j=0;
else j=1;
return j;
}
我们的想法是检查价值" j"并同时决定LED是否应该点亮! 这段代码不起作用。自从我使用C编程以来,它已经有一段时间了。我有点不稳定,需要一些帮助。一个正确的解释会很好。 请考虑MCU的数据表的以下链接: http://cache.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08AW60.pdf
可以替换以下功能而不是现有的Mydelay:
int Mydelay(int& j)
{
if(TPM1SC_TOF == 0) j=0;
else j=1;
return j;
}
void main()
{
PTFDD = 0xFF;
int j,ch_nbr;
// LED mask values:
#define mLED0 0x01
#define mLED1 0x02
#define mLED2 0x04
#define mLED3 0x08
#define mLED4 0x10
#define mLED5 0x20
#define mLED6 0x40
#define mLED7 0x80
While(j==1)
{
ch_nbr++;
if (ch_nbr == 8) ch_nbr = 0;
if (ch_nbr == 0) PTFD = mLED0; // Turn LED0 on, other LEDs off
if (ch_nbr == 1) PTFD = mLED1; // Turn LED1 on, other LEDs off
if (ch_nbr == 2) PTFD = mLED2; // Turn LED2 on, other LEDs off
if (ch_nbr == 3) PTFD = mLED3; // Turn LED3 on, other LEDs off
if (ch_nbr == 4) PTFD = mLED4; // Turn LED4 on, other LEDs off
if (ch_nbr == 5) PTFD = mLED5; // Turn LED5 on, other LEDs off
if (ch_nbr == 6) PTFD = mLED6; // Turn LED6 on, other LEDs off
if (ch_nbr == 7) PTFD = mLED7; // Turn LED7 on, other LEDs off
}
Mydelay();
}
答案 0 :(得分:3)
首先,您可能希望使用bit shifting来显着简化代码(因为这正是您实际所做的,转移一点)。
这意味着每个位置不需要有8个常量,但只需使用<<
运算符在每次迭代时将位移到左侧:
int MoveToLeft(int bitPosition)
{
// shift left
bitPosition = bitPosition << 1;
// reset to '1' when we shift through all 8 bits
if ((bitPosition & 0xFF) == 0)
bitPosition = 1;
return bitPosition;
}
接下来,比轮询计时器值更好的方法是使用interrupt routines。您需要设置一个函数,只要您的计时器完成计数,它就会自动调用。
我不确定你的代码是否真的像这样。您的计时器的目的是在LED更改之间创建延迟吗?你的计时器会自动重置吗?如果计时器仅用于在转换之前等待,那么这样的事情会更合乎逻辑:
while (1) // repeat indefinitely
{
// shift the bit
ch_nbr = MoveLeft(ch_nbr);
PTFD = ch_nbr;
// while the timer is counting, do nothing
while (TPM1_TOF == 0)
{ }
// reset the timer
(not sure about this part, check your docs)
}
答案 1 :(得分:1)
如果这是您的代码的剪切粘贴,那么您需要解决一些问题:
第1行:While(j>0){
我没有在任何地方看到j声明或定义。编译器应该为此生成错误,While
应该是小写的while ( j > 0 )
。
与ch_nbr
相同。
当你致电MyDelay()
时,你写了&int
而你可能意味着(int *j)
,那么你没有传递任何东西。
If
必须为小写if
是的,因为评论显示您有3个左括号{
和5个结束}
。
修复这些问题,确保它现在可以编译然后处理任何逻辑。
答案 2 :(得分:0)
您的结束括号多于左括号。尝试通过匹配括号来修正此问题(缩进将有所帮助)。
您没有在任何地方声明变量j
和cn_nbr
,但您可以使用它们。
C语句是小写的(while
,而不是While
)。
当Mydelay()
期望参数时,您正在调用不带参数的Mydelay(int &j)
。此外,&j
返回变量j
的地址。我想你想要int *j
。阅读有关指针的更多信息。
使用switch
或if ... else if
代替if ... if ... if ...
。您的代码可以双向工作,但使用switch或if else更快。
请考虑在此处了解有关C编程的更多信息:http://www.cprogramming.com/