1.要求
1.1-每次按下一个按键时,加快8只LED发光二极管的流水显示速度;
1.2-每次按下另一个按键时,降低8只LED的流水显示速度;
1.3-拓展两个功能,拉幕式闪烁与闭幕式闪烁。
2.设计思路
2.1-基本的流水功能是采用的数组来实现的,先把八个LED哪个LED亮哪个LED灭用0和1表示出来(本例I/O输出0,LED点亮,I/O输出1,LED熄灭),并且换算成16进制的0-F,然后将这些16进制的数装在数组里面,要将哪个LED点亮或者熄灭,就只需要对应去去取数组里面的数就行了,所以使用了一个全局变量j,用它去取数组里面的数值,实现了功能切换LED流水的连续性。
2.2-用按键控制速度,采用定时器中断来实现,定时50ms,每隔50ms就进入定时器中断,对按键的状态进行扫描,如果扫描到按键的状态发生了改变,则说明有按键按下,就会进入按键判断的函数,进一步判断是哪一个按键的状态发生了改变。
3.程序流程图
4.程序代码
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define LED_Port P1//定义LED端口
sbit k1=P3^0;//定义按键k1
sbit k2=P3^1;//定义按键k2
sbit k3=P3^2;//定义按键k3
sbit k4=P3^3;//定义按键k4
uint j=0;//全局变量j
uint speed=0;//全局变量speed
/********流水方式数组********/
uint LED1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/********拉幕式与闭幕式数组********/
uint LED2[8]={0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7};
/********函数声明********/
void delay(uint a);
void timer0Init();
void speed1();
void speed2();
void speed3();
void speed4();
void delay(uint a)//延时函数,a=1,大约延时1ms
{
uint i,j;
for(i=a;i>0;i--)
for(j=123;j>0;j--);
}
void timer0Init()//定时器0初始化
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
void timer0() interrupt 1//定时器0中断服务函数
{
TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
if(k1==0){speed=1;while(!k1);}
if(k2==0){speed=2;while(!k2);}
if(k3==0){speed=3;while(!k3);}
if(k4==0){speed=4;while(!k4);}
}
/********慢速流水********/
void speed1()
{
while(1)
{
LED_Port=LED1[j];
delay(200);
if(speed!=1)break;
j++;
if(j>7)j=0;
}
}
/********快速流水********/
void speed2()
{
while(1)
{
LED_Port=LED1[j];
delay(50);
if(speed!=2)break;
j++;
if(j>7)j=0;
}
}
/********快闪********/
void speed3()
{
while(1)
{
LED_Port=0xff;
delay(150);
if(speed!=3)break;
LED_Port=0x00;
delay(100);
if(speed!=3)break;
}
}
/********拉幕式与闭幕式********/
void speed4()
{
j=4;
while(1)
{
LED_Port=LED2[j];
delay(250);
if(speed!=4)break;
j++;
if(j>7)j=0;
}
}
void main()
{
timer0Init();
while(1)
{
if(speed==1){speed1();}
if(speed==2){speed2();}
if(speed==3){speed3();}
if(speed==4){speed4();}
}
}
5.仿真电路