我的一位同事向我展示了以下C AVR代码:

#include <avr/io.h>
#include <stdlib.h>

#define byte uint8_t

byte button[8];
byte play[8];
byte licz;
byte pind_in;
uint16_t freq[8]= {3822, 3405, 3033, 2863, 2551, 2272, 2024, 1911};
uint32_t count[8];

int main (void)
{
  DDRD = 0;
  PORTD = 0xff;
  DDRB = 0b00000010;

  while (1)
  {
    pind_in = PIND;
    licz += 16;

    for (byte i = 0; i < 8; i++)
    {
      button[i] = !(pind_in&(1<<i));
      if ((button[i]) && (play[i] < 255))
        play[i]++;
      if ((!button[i]) && (!(licz)) && (play[i] > 0))
        play[i]-- ;

      count[i] += freq[i];
      if ((count[i] & (0x4000)) && (play[i]))
        PORTB = 0b00000010;
      else
        PORTB = 0;
    }
  }
}

我知道这是基于AVR微控制器的声音生成,但我无法确定为什么在无限循环中使用licz+=16,以及后面的算法是什么。这里有人能解密吗?

最佳答案

我真的不知道你的AVR有什么关系,所以这只是一个受过教育的
猜猜看。
假设一个声音是输出的,而PORTB.2 == 1则为静音。
PORTB位设置为只要play[i] > 0play[i]
button[i]已设置,可能是外部按钮或其他
类似的。松开按钮后,play再次倒计时为零。
也许这会使最后的声音比按按钮的时间长一点。
licz变量使向下计数变慢。每16圈(假设
该字节==8位),licz将再次为零,并跳过递减的play。例如,如果将licz += 16;更改为licz += 128;,则在第二个循环中跳过递减,使声音在按钮释放后持续更长时间。

关于c - AVR/C代码含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28556932/

10-09 05:38