led流水灯的实现是目前单片机程序中最容易实现的程序。
1.延时的实现
由于人眼的视觉暂留大约在2us左右,所以,在实现流水灯的时候有一个重要的问题——延时。如果不延时,在人眼看来,Led是全亮的。延时有两种方式可以实现:
1.调用intrins.h
_nop_( ); //延迟1us
2.自己写一个延迟函数
/*
t>0 && t<255
实际延迟2*t+12
*/
void delay_us(unsigned char t)
{
while(--t);
}
void delay_ms(unsigned char t)
{
while(t--)
{
delay_us(245);
delay_us(245);
}
}
void delay_s(unsigned char t)
{
while(t--)
{
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
}
}
2.移位的实现
流水灯的实现实际是led每次显示时只显示一个位置。有两种显示方式:
1.调用intrins.h
unsigned char temp = 0x7f;
while(1)
{
temp = _crol_(temp,1);
LED = temp;
delay_s(1);
}
2.自己写一个数组来实现(此方法占用较大空间)
unsigned char leddate[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main()
{
unsigned char i = 0;
while(1)
{
LED = leddate[i++];
if(8 == i)
{
i = 0;
}
delay_s(1);
}
}