这就是我想要弄清楚的,我有一个 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();
}
最佳答案
首先,您可能想使用 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)
}
关于c - 循环和微 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13958631/