|
本帖最后由 daniu 于 2014-12-27 16:55 编辑
 这是流程图
- //===============================================================
- //程序编写人:兰建文
- //编写地点
- //时间7月9日晚上 星期四
- //功能:本程序实现任意四个按键长按3S,连按3次(两次按键间隔不得等
- //于1S),再按一下密码确认键,正确显示“GOOD”,不正确显示“BAD”,
- //实现独立按键密码锁功能。利用定时器实现按键消抖。数码管为共阳极,
- //低电平点亮.
- //===============================================================
- #include <reg51.h> //定义8051单片机所有I/O口
- #define uchar unsigned char
- #define Key P1 //定义按键输入口
- #define OutPut P2 //定义输出口
- #define PianXuan P3 //定义片选口
- bit Bt0; //节拍标志位
- bit AnJian1; //按键标志位
- bit AnJian2; //有按键按下标志位
- bit ChangAn; //长按标志位
- bit LianAn; //连按标志位
- uchar TimeCount1; //长按计时1S变量
- uchar TimeCount2; //连按间隔计时1S变量
- uchar LianAnCount; //连按次数变量
- uchar code tempt1[]={0x0c0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90};//共阳数据代码
- uchar code tempt2[]={0x90,0xc0,0xc0,0xa1}; //“GOOD”代码
- uchar code tempt3[]={0x83,0x88,0xa1}; //“BAD”代码
- void DeLayMS(uchar N); //声明延时函数
- main() //主函数
- {
- TMOD=0x01; //开定时器及开定时器中断
- TH0=0xb1;
- TL0=0xe0;
- TR0=1;
- EA=1;
- ET0=1;
- LianAn=0; //标志位复位
- ChangAn=0;
- Bt0=0;
- TimeCount1=150;
- TimeCount2=50;
- AnJian1=0;
- AnJian2=0;
- LianAnCount=0;
- while(1) //死循环
- {
- if((Key&0x10)==0x10) //判断确认密码按键是否按下
- {
- OutPut=0xbf; //没按下就显示“------”
- PianXuan=0xff;
- }
- else
- {
- if(ChangAn&&LianAn) //按下了,判断是否有长按和连按
- {
- while(1) //有长按和连按,则显示“GOOD”
- {
- uchar i,b=0x02;
- for(i=0;i<4;i++)
- {
- OutPut=tempt2;
- PianXuan=b;
- DeLayMS(1);
- PianXuan=0x00;
- b=b<<1;
- }
- }
- }
- else //没长按和连按,则显示“BAD”
- {
- while(1)
- {
- uchar i,b=0x02;
- for(i=0;i<3;i++)
- {
- OutPut=tempt3;
- PianXuan=b;
- DeLayMS(1);
- PianXuan=0x00;
- b=b<<1;
- }
- }
- }
- }
- if(Bt0==1) //等待节拍
- {
- Bt0=0; //节拍标志位清零
- if(AnJian2==1) //判断是否有键按下
- {
- if(TimeCount2--==0) //判断下一次按键间隔是否为1S
- {
- LianAnCount=0; //为1S,复位
- TimeCount2=50;
- AnJian2=0;
- }
- else
- {
- if(LianAnCount==3) //不为1S,则判断是否连续按键3次
- {
- LianAn=1; //有3次则连按标志位置1
- TimeCount2=50;
- AnJian2=0;
- LianAnCount=0;
- }
- }
- }
- if((Key&0x0f)!=0x0f) //判断是否有键按下
- {
- if(AnJian1==0) //有键按下,判断按键标志位是否为0,20MS消抖作用
- {
- AnJian1=1; //为1,则按键标志位置1
- AnJian2=1; //有键按下标志位置1
- TimeCount2=50; //连按计时复位
- LianAnCount++; //按键次数加1
- }
- else
- {
- if(TimeCount1--==0) //为1判断按键是否一直按了3S
- ChangAn=1; //按了3S,则长按标志位置1
- if((Key&0x0f)==0x0f) //判断按键是否还按着
- {
- TimeCount1=150; //抬起了,则长按计时复位
- AnJian1=0; //按键标志位清0
- }
- }
- }
- else
- {
- if((Key&0x0f)==0x0f)
- {
- TimeCount1=150;
- AnJian1=0;
- }
- }
- }
- }
- }
- void T0Ser(void) interrupt 1 using 0 //定时器服务函数
- {
- TH0=0xb1;
- TL0=0xe0;
- Bt0=1;
- }
- void DeLayMS(uchar N) //延时函数
- {
- uchar i,j;
- for(i=N;i>0;i--)
- for(j=50;j>0;j--);
- }
复制代码
|
|