c - 循环和微 Controller

标签 c loops while-loop microcontroller

这就是我想要弄清楚的,我有一个 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/

相关文章:

php while循环不会增加数据库列

java - if/while 循环不会在 while java 之后继续进行

c++ - 如何生成大于 10 000 的数字

php - 如何在使用 MAKE_STD_ZVAL 创建的 PHP5 中释放 zval?

c - 使用 OpenGL 进行多纹理绘图?

c - 使用 GetAdaptersAddresses 查找临时 IPv6 地址

python - 如何对多张图像进行傅里叶变换并将输出保存到单个对象中

loops - 遍历文件并删除几行不同的文本

Python:如何要求字符串作为输入而不是特定值

c++ - 如何读取大 json?