我的一位同事向我展示了以下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] > 0
。play[i]
在button[i]
已设置,可能是外部按钮或其他
类似的。松开按钮后,play
再次倒计时为零。
也许这会使最后的声音比按按钮的时间长一点。licz
变量使向下计数变慢。每16圈(假设
该字节==8位),licz
将再次为零,并跳过递减的play
。例如,如果将licz += 16;
更改为licz += 128;
,则在第二个循环中跳过递减,使声音在按钮释放后持续更长时间。
关于c - AVR/C代码含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28556932/