51hei圖片20201230233743.png (69 KB, 下載次數: 39)
下載附件
2020-12-30 23:38 上傳
功能描述,開機無顯示。
按下除號,開始輸入密碼,顯示短線,初始密碼為0000。
輸入完后,按下on/c鍵,確定。正確顯示open,錯誤顯示err。
=鍵為取消鍵,輸入密碼過程中,按下取消鍵,數碼管全亮1s,然后滅掉。恢復初始狀態。
按下乘號,設置密碼,此時數碼管顯示短線。
輸入正確密碼后,進入更改密碼狀態,顯示全F。
輸入更改后密碼,按下on/C鍵,確認。
PS:1輸入任意時刻,都可按等號返回初始狀態。2輸入時,數字會相應的顯示。
通過Protues仿真,電路圖為protues輸出的。
單片機源程序如下:
- #include <reg52.h>
- #define uint8 unsigned char
- #define uint16 unsigned int
- //數碼管編碼。
- uint8 code SEG7LED[26] = {0x3f,0x06,0x5b,0X4F,
- 0x66,0x6D,0x7D,0x07,
- 0x7F,0x6F,0x77,0x7C,
- 0x39,0x5E,0x79,0x71,
- 0x00,0x40,0xff,
- 0x3f,0x73,0x79,0x37, //open
- 0x79,0x77,0x77}; //err
- //變量聲明
- uint8 Ge,Shi,Bai,Qian;//數碼管各個位
- uint8 WeiNum=1;
- uint8 code P1Pin[9] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
- uint8 state=0;//記錄密碼鎖狀態,0為待機狀態,1為輸入密碼,2,3為設置密碼
- uint8 InputNum=1;//記錄輸入密碼時,目前密碼的位數。
- uint8 InPassWord[4];
- uint8 PassWord[4]={0,0,0,0};
- //函數聲明
- void initTimer0();
- void display(uint8 WeiNum);
- uint8 keyscan();
- void delayms(uint16 Xms);
- void password(uint8 key);
- uint8 Compare(uint8 InPassWord[4]);
- void main()
- {
- uint8 key;
- initTimer0();
- while(1)
- {
- key = keyscan();
- password(key);
- }
- }
- void initTimer0()
- {
- EA = 1;
- ET0 = 1;
- TMOD = 0X01;
- TH0 = (65535-5000)/256;
- TL0 = (65535-5000)%256;
- TR0 = 1;
- }
- void Timer0() interrupt 1
- {
- TH0 = (65535-5000)/256;
- TL0 = (65535-5000)%256;
- display(WeiNum);
- WeiNum ++;
- if(WeiNum==5)
- WeiNum = 1;
- }
- void display(uint8 WeiNum)
- {
- switch(WeiNum)
- {
- case 1:
- {
- P2 = 0xff;
- P0 = SEG7LED[Qian];
- P2 = 0xfe;
- break;
- }
- case 2:
- {
- P2 = 0xff;
- P0 = SEG7LED[Bai];
- P2 = 0xfd;
- break;
- }
- case 3:
- {
- P2 = 0xff;
- P0 = SEG7LED[Shi];
- P2 = 0xfb;
- break;
- }
- case 4:
- {
- P2 = 0xff;
- P0 = SEG7LED[Ge];
- P2 = 0xf7;
- break;
- }
- default:
- {
- P2 = 0xff;
- P0 = 0xff;
- P2 = 0xff;
- break;
- }
- }
- }
- void delayms(uint16 Xms)
- {
- uint16 i,j;
- for(i=Xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- uint8 keyscan()
- {
- uint8 i=0;
- uint8 key8=0xff;
- uint8 key=0xff;
- uint8 Button;
- for(i=0;i<4;i++)
- {
- P1 = P1Pin[ i];
- Button = P1;
- if(Button != P1Pin[ i])
- {
- delayms(5);
- Button = P1;
- if(Button != P1Pin[ i])
- {
- key8 = Button;
- }
- while(Button != P1Pin[ i])
- { Button = P1; }
- }
- }
- switch(key8)
- {//0~9數字鍵,12確定,14取消,10輸入密碼,11設置密碼。
- case 0xee:{key = 7;break;}
- case 0xde:{key = 8;break;}
- case 0xbe:{key = 9;break;}
- case 0x7e:{key = 10;break;}
- case 0xed:{key = 4;break;}
- case 0xdd:{key = 5;break;}
- case 0xbd:{key = 6;break;}
- case 0x7d:{key = 11;break;}
- case 0xeb:{key = 1;break;}
- case 0xdb:{key = 2;break;}
- case 0xbb:{key = 3;break;}
- case 0x7b:{key = 15;break;}
- case 0xe7:{key = 12;break;}
- case 0xd7:{key = 0;break;}
- case 0xb7:{key = 14;break;}
- case 0x77:{key = 16;break;}
- default:{key = 0xff;break;}
- }
- return key;
- }
- void password(uint8 key)
- {//0~9數字鍵,12確定,14取消,10輸入密碼,11設置密碼。
- uint8 i;
- if(key!=0xff)
- {
- switch(state)
- {
- case 0:
- {
- if(key == 10)
- {
- state = 1;
- Ge =17;Shi=17;Bai=17;Qian=17;
- }
- else if(key == 11)
- {
- state = 2;
- Ge =17;Shi=17;Bai=17;Qian=17;
- }
- break;
- }
- case 1:
- {
- if(key>=0 && key <= 9)
- {
- switch(InputNum)
- {
- case 1:
- Ge = key;InPassWord[0]=key;
- break;
- case 2:
- Shi = key;InPassWord[1]=key;
- break;
- case 3:
- Bai = key;InPassWord[2]=key;
- break;
- case 4:
- Qian =key;InPassWord[3]=key;
- break;
- default:
- break;
- }
- if(InputNum<5)
- InputNum++;
- }
- else if(key == 12)
- {
- if(Compare(InPassWord))
- {
- Ge =22;Shi=21;Bai=20;Qian=19;
- for(i=0;i<4;i++)
- InPassWord[ i] = 0xff;
- }//open
- else
- { Ge =16;Shi=25;Bai=24;Qian=23;}//err
- delayms(1000);
- InputNum =1;
- state = 0;
- }
- else if(key == 14)
- {
- Ge =18;Shi=18;Bai=18;Qian=18;//全亮
- delayms(1000);
- state = 0;
- InputNum =1;
- }
- break;
- }
- case 2:
- {
- if(key>=0 && key <= 9)
- {
- switch(InputNum)
- {
- case 1:
- Ge = key;InPassWord[0]=key;
- break;
- case 2:
- Shi = key;InPassWord[1]=key;
- break;
- case 3:
- Bai = key;InPassWord[2]=key;
- break;
- case 4:
- Qian =key;InPassWord[3]=key;
- break;
- default:
- break;
- }
- if(InputNum<5)
- InputNum++;
- }
- else if(key == 12)
- {
- if(Compare(InPassWord))
- { Ge =15;Shi=15;Bai=15;Qian=15;
- for(i=0;i<4;i++)
- InPassWord[ i] = 0xff;
- state =3;
- }//ffff
- else
- { Ge =16;Shi=25;Bai=24;Qian=23;
- state =0;
- }//err
- delayms(1000);
- InputNum =1;
- }
- else if(key == 14)
- {
- Ge =18;Shi=18;Bai=18;Qian=18;//全亮
- delayms(1000);
- state = 0;
- InputNum =1;
- }
- break;
- }
- case 3:
- {
- if(key>=0 && key <= 9)
- {
- switch(InputNum)
- {
- case 1:
- Ge = key;PassWord[0]=key;
- break;
- case 2:
- Shi = key;PassWord[1]=key;
- break;
- case 3:
- Bai = key;PassWord[2]=key;
- break;
- case 4:
- Qian =key;PassWord[3]=key;
- break;
- default:
- break;
- }
- if(InputNum<5)
- InputNum++;
- }
- else if(key == 12)
- {
- Ge =16;Shi=16;Bai=16;Qian=16;
- delayms(250);
- Ge =17;Shi=17;Bai=17;Qian=17;
- delayms(250);
- Ge =16;Shi=16;Bai=16;Qian=16;
- delayms(250);
- Ge =17;Shi=17;Bai=17;Qian=17;
- state = 0;
- InputNum =1;
- }
- else if(key ==14)
- {
- Ge =18;Shi=18;Bai=18;Qian=18;//全亮
- delayms(1000);
- for(i=0;i<4;i++)
- PassWord[ i] = InPassWord[ i];
- state = 0;
- InputNum =1;
- }
- }
- }
- }
- else//如果沒有按鍵按下
- {
- if(state == 0)
- {
- Ge =16;Shi=16;Bai=16;Qian=16;//不顯示
- }
- }
- }
- uint8 Compare(uint8 InPassWord[4])
- {
- uint8 i;
- uint8 out=1;
- for (i=0;i<4;i++)
- if(InPassWord[ i]==PassWord[ i])
- out = out & 1;
- else
- out = 0;
- return out;
- }
復制代碼
|