|
本帖最后由 daniu 于 2014-12-27 16:55 編輯
 這是流程圖
- //===============================================================
- //程序編寫人:蘭建文
- //編寫地點
- //時間7月9日晚上 星期四
- //功能:本程序?qū)崿F(xiàn)任意四個按鍵長按3S,連按3次(兩次按鍵間隔不得等
- //于1S),再按一下密碼確認鍵,正確顯示“GOOD”,不正確顯示“BAD”,
- //實現(xiàn)獨立按鍵密碼鎖功能。利用定時器實現(xiàn)按鍵消抖。數(shù)碼管為共陽極,
- //低電平點亮.
- //===============================================================
- #include <reg51.h> //定義8051單片機所有I/O口
- #define uchar unsigned char
- #define Key P1 //定義按鍵輸入口
- #define OutPut P2 //定義輸出口
- #define PianXuan P3 //定義片選口
- bit Bt0; //節(jié)拍標志位
- bit AnJian1; //按鍵標志位
- bit AnJian2; //有按鍵按下標志位
- bit ChangAn; //長按標志位
- bit LianAn; //連按標志位
- uchar TimeCount1; //長按計時1S變量
- uchar TimeCount2; //連按間隔計時1S變量
- uchar LianAnCount; //連按次數(shù)變量
- uchar code tempt1[]={0x0c0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90};//共陽數(shù)據(jù)代碼
- uchar code tempt2[]={0x90,0xc0,0xc0,0xa1}; //“GOOD”代碼
- uchar code tempt3[]={0x83,0x88,0xa1}; //“BAD”代碼
- void DeLayMS(uchar N); //聲明延時函數(shù)
- main() //主函數(shù)
- {
- 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) //死循環(huán)
- {
- 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) //等待節(jié)拍
- {
- Bt0=0; //節(jié)拍標志位清零
- if(AnJian2==1) //判斷是否有鍵按下
- {
- if(TimeCount2--==0) //判斷下一次按鍵間隔是否為1S
- {
- LianAnCount=0; //為1S,復位
- TimeCount2=50;
- AnJian2=0;
- }
- else
- {
- if(LianAnCount==3) //不為1S,則判斷是否連續(xù)按鍵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++; //按鍵次數(shù)加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 //定時器服務函數(shù)
- {
- TH0=0xb1;
- TL0=0xe0;
- Bt0=1;
- }
- void DeLayMS(uchar N) //延時函數(shù)
- {
- uchar i,j;
- for(i=N;i>0;i--)
- for(j=50;j>0;j--);
- }
復制代碼
|
|