51单片机一个按键控制2个灯产生四种状态
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define unchar unsigned char
#define unint unsigned int
sbit key=P3^7;
sbit Light1=P1^1;
sbit Light2=P1^2;//定义独立键盘,定义小灯1、2
bit flag=1;//定义控制运行符
unchar Mod;//定义亮灯模式
unint tt;//定义中断次数
void Init_Mod() //初始化函数
{
Mod=0;
Light1=0;
Light2=0;
}
void Init_Timer()
{
TMOD=0x01;
TR0=1;
EA=1;
ET0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void delay(unint z)//延时函数,延时z(ms)
{
unint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Input_Mod()//状态模式标记函数
{
if(Mod==4)
Mod=0;
if(key==0)
{
delay(5);
if(key==0) //延时消抖
Mod++;//按键次数标记
}
while(!key)//松手检测(容易忘记= =)
{; ;}
}
void run()//4种模式下的执行
{
switch(Mod)
{
case 0:{ET0=0;Light1=0;Light2=0;}break; //全亮
case 1:{ET0=1;}break; //同步闪烁
case 2:{ET0=0;Light1=1;Light2=1;}break; //全灭
case 3:{ET0=0;Light1=1;Light2=0;ET0=1;}break; //异步闪烁
}
}
void main()
{
Init_Mod();
Init_Timer();
while(1)
{
Input_Mod();
if(flag==1) //flag 控制run的运行
{
run();
if(Mod==1||Mod==3)
flag=0;
}
if(Mod==0||Mod==2)
flag=1;
}
}
void Timer_interrupt(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)//1s的变换间隔
{
tt=0;
Light1=~Light1;
Light2=~Light2;
}
}