论坛» DIY与开源设计» 电子DIY

AVR ATMEGA16 MCU DIY进程-LED流水灯

菜鸟
2011-12-13 18:13 1楼
下面给大家演示下流水灯程序,我用的是AVR单片机,AVR单片机板载资源丰富,驱动能力较强。每个管脚可以驱动20ma的电流,所以驱动led灯没问题。led灯电流5-10ma左右,所以单片机管脚直接连接led加个电阻(自己算下,300欧就行)到地,就能直接驱动led灯。

程序比较简单,不过没用过avr的人要看懂程序估计还要熟悉avr atmega16的寄存器,这要看数据手册的,都是中文的,很方便。

编译环境是ICC AVR7.2

#include
#define uchar unsigned char
#define uint unsigned int

void Delay(uchar i)//延时函数
{
uchar j;
for(;i!=0;i--)
{
for(j=250;j!=0;j--);
}
}

void Horse(uchar i)//流水模式选择
{
switch(i)
{
case 0:PORTA=0x00;break;
case 1:PORTA=0x01;break;
case 2:PORTA=0x03;break;
case 3:PORTA=0x07;break;
case 4:PORTA=0x0f;break;
case 5:PORTA=0x1f;break;
case 6:PORTA=0x3f;break;
case 7:PORTA=0x7f;break;
case 8:PORTA=0xff;break;
default:break;
}
}

void main()
{
uchar i;
DDRA=0xff;//置为输出
PORTA=0xff;//初始为高电平
Delay(10);
PORTA=0x00;
while(1)
{
for(i=0;i<9;i++)
{
Horse(i);
Delay(100);
}
for(i=8;i!=0;i--)
{
Horse(i);
Delay(100);
}
}
}

院士
2011-12-14 08:52 2楼
谢谢分享~~~
菜鸟
2011-12-14 09:31 3楼
谢谢分享!
你的代码还可以继续改进,void Horse(uchar i)函数可以用一句代码代替,用位运算符(左移,右移)实现会更简洁。
助工
2011-12-14 09:36 4楼
哦,这样啊!
菜鸟
2011-12-14 10:51 5楼

恩,看到3楼说到可以改进的,感谢他的意见。我本意是初学者能看的明白点,如果知道<<和>>的运算符,那下面就用左移来实现下跑马灯吧。
#include
#define uchar unsigned char
#define uint unsigned int

void Delay(uchar i)//延时函数,和晶振有关系的
{
uchar j;
for(;i!=0;i--)
{
for(j=250;j!=0;j--);
}
}

void main(void)
{
uchar i;
DDRA=0xff;//置为输出
PORTA=0xff;//初始为高电平
Delay(10);
PORTA=0x00;
while(1)
{
for(i=0;i<8;i++)
{
PORTA=PORTA&(1<Delay(100);//延时长点,可看出效果,太短看不出来
}
for(;i>0;i--)
{
PORTA=PORTA &(1<Delay(100);
}

}

}

菜鸟
2012-01-28 14:01 6楼
共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]