|
密碼箱的設(shè)計
0.png (20.7 KB, 下載次數(shù): 42)
下載附件
2018-7-17 16:33 上傳
0.png (50.11 KB, 下載次數(shù): 56)
下載附件
2018-7-17 16:33 上傳
單片機源程序如下:
- #include<AT89x52.h>
- unsigned int num=10; //開始讓數(shù)碼管什么都顯示
- bit set=0; //定義設(shè)置密碼的位
- char count=-1; //開始讓COUNT=-1,方便后面顯示數(shù)碼管
- sbit Beep=P1^2; //蜂鳴器
- unsigned char temp;
- unsigned char pws[6]={1,2,3,4,5,6}; //原始密碼
- unsigned char pwx[6]; //按下的數(shù)字存儲區(qū)
- bit rightflag; //密碼正確標志位
- unsigned char workbuf[6];
- unsigned char code tabledu[]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40
- }; //段選碼,共陰極
- unsigned char code tablewe[]={
- 0xfe,0xfd,0xfb,0xf7,0xef,0xdf
- }; //位選碼
- unsigned int keyscan();
- void delay(unsigned char z) //延時,ms級
- {
- unsigned char y;
- for(;z>0;z--)
- for(y=120;y>0;y--);
- }
- void setpw() //設(shè)置密碼函數(shù)
- {
- keyscan();
- }
- unsigned int keyscan() //鍵盤掃描函數(shù)
- {
- P3=0xfe;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(5); //鍵盤去抖,最好20ms以上,這里用了5ms
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- count++;//按鍵計數(shù)加1
- temp=P3;
- switch(temp)
- {
- case 0xee:
- {
- num=7;
- if(count<6) //六位密碼,所以COUNT<6
- {
- if(set==0) //設(shè)置密碼鍵沒有按下時
- pwx[count]=num; //存儲按下的數(shù)字
- else
- pws[count]=num; //設(shè)置密碼鍵按下時,設(shè)置新密碼
- workbuf[count]=tabledu[11]; //相應(yīng)位的數(shù)碼管顯示"--",不顯示相應(yīng)的數(shù)字,密碼是保密的
- }
- }
- break;
- case 0xde:
- {
- num=8;
- if(count<6) //以下掃描鍵盤的原理差不多同上
- {
- if(set==0)
- pwx[count]=num;
- else
- pws[count]=num;
- workbuf[count]=tabledu[11];
- }
- }
- break;
- case 0xbe:
- {
- num=9;
- {
- if(count<6)
- {
- if(set==0)
- pwx[count]=num;
- else
- pws[count]=num;
- workbuf[count]=tabledu[11];
- }
- }
- }
- break;
- case 0x7e: //設(shè)置密碼鍵按下
- {
- set=1; //設(shè)置密碼標志位置1
- P1_3=0; //設(shè)置密碼指示燈亮
- workbuf[0]=0x00;//數(shù)碼管第一位不顯示
- workbuf[1]=0x00;//......
- workbuf[2]=0x00;//......
- workbuf[3]=0x00;
- workbuf[4]=0x00;
- workbuf[5]=0x00;//......
- count=-1; //按鍵計數(shù)復(fù)位為-1
- if(count<6) //密碼沒有設(shè)置完,繼續(xù)設(shè)置密碼
- {
- setpw(); //設(shè)置密碼
- }
- }
- break;
- }
- while(temp!=0xf0) //按鍵抬起檢測
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- P3=0xfd;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(5);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- count++;
- temp=P3;
- switch(temp)
- {
- case 0xed:
- {
- num=4;
- if(count<6)
- {
- if(set==0)
- pwx[count]=num;
- else
- pws[count]=num;
- workbuf[count]=tabledu[11];
- }
- }
- break;
- case 0xdd:
- {
- num=5;
- if(count<6)
- {
- if(set==0)
- pwx[count]=num;
- else
- pws[count]=num;
- workbuf[count]=tabledu[11];
- }
- }
- break;
- case 0xbd:
- {
- num=6;
- if(count<6)
- {
- if(set==0)
- pwx[count]=num;
- else
- pws[count]=num;
- workbuf[count]=tabledu[11];
- }
- }
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- P3=0xfb;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(5);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- count++;
- temp=P3;
- switch(temp)
- {
- case 0xeb:
- {
- num=1;
- if(count<6)
- {
- if(set==0)
- pwx[count]=num;
- else
- pws[count]=num;
- workbuf[count]=tabledu[11];
- }
- }
- break;
- case 0xdb:
- {
- num=2;
- if(count<6)
- {
- if(set==0)
- pwx[count]=num;
- else
- pws[count]=num;
- workbuf[count]=tabledu[11];
- }
- }
- break;
- case 0xbb:
- {
- num=3;
- if(count<6)
- {
- if(set==0)
- pwx[count]=num;
- else
- pws[count]=num;
- workbuf[count]=tabledu[11];
- }
- }
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- P3=0xf7;
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(5);
- temp=P3;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- count++;
- temp=P3;
- switch(temp)
- {
- case 0xd7:
- {
- num=0;
- if(count<6)
- {
- if(set==0)
- pwx[count]=num;
- else
- pws[count]=num;
- workbuf[count]=tabledu[11];
- }
- }
- break;
- case 0xe7: num=20;break; //確定鍵按下檢測
- case 0x77: //復(fù)位鍵或者輸入密碼全部一次刪除
- {
- P1_1=0; //鎖關(guān)
- P1_3=1; //密碼設(shè)置指示燈滅
- set=0; //不設(shè)置密碼
- num=10; //num復(fù)位
- count=-1; //COUNT復(fù)位
- workbuf[0]=tabledu[10]; //第一位數(shù)碼管不顯示
- workbuf[1]=tabledu[10]; //第二位數(shù)碼管不顯示
- workbuf[2]=tabledu[10];
- workbuf[3]=tabledu[10];
- workbuf[4]=tabledu[10];
- workbuf[5]=tabledu[10]; //......
- P1_0=1; //鎖關(guān)
- }
- break;
- case 0xb7: //輸入密碼刪除鍵(一位一位刪除)
- {
- count--;
- workbuf[count]=0x00; //因確定鍵按下時,COUNT也會加1,而確定鍵不是密碼,所以這里是COUNT,而不是COUNT+1
- count--; //因確定鍵按下時,確定鍵不是密碼,COUNT也會加1,這里COUNT再自減1
- if(count<=-1)
- count=-1;
- }
- break;
- }
- while(temp!=0xf0)
- {
- temp=P3;
- temp=temp&0xf0;
- }
- }
- }
- return(num);
- }
- void init() //利用定時顯示數(shù)碼管
- {
- TMOD=0x01;
- TH0=(65536-500)/200;
- TL0=(65536-500)%200;
- ET0=1;
- EA=1;
- TR0=1;
- }
- bit compare() //密碼比較函數(shù)
- {
- if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pwx[5]==pws[5]))
- rightflag=1;
- else
- rightflag=0;
- return(rightflag);
- }
- void main()
- {
- unsigned int i,j;
- init();
- P0=0;
- P1_1=0; //鎖關(guān)
- while(1)
- {
- keyscan();
- if(num==20) //如果確定鍵按下(修改密碼和輸入密碼共用的確定鍵)
- {
- if(count==6)
- {
- if(set==1) //修改密碼確定
- {
- P1_3=1;
- workbuf[0]=0;
- workbuf[1]=0;
- workbuf[2]=0;
- workbuf[3]=0;
- workbuf[4]=0;
- workbuf[5]=0;
- }
- else //輸入密碼確定
- {
- set=0;
- compare();
- if(rightflag==1) //如果密碼正確
- {
- P1_0=0; //鎖開
- P1_1=1;
- workbuf[0]=tabledu[8]; //數(shù)碼管第一位顯示"8"
- workbuf[1]=tabledu[8]; //數(shù)碼管第二位顯示"8"
- workbuf[2]=tabledu[8];
- workbuf[3]=tabledu[8];
- workbuf[4]=tabledu[8];
- workbuf[5]=tabledu[8]; //......
- }
- else
- {
- P1_1=0; //鎖仍然是關(guān)
- workbuf[0]=0X71; //數(shù)碼管第一位顯示"F"
- workbuf[1]=0X71;
- workbuf[2]=0X71;
- workbuf[3]=0X71;
- workbuf[4]=0X71;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
應(yīng)用實例20 密碼保險箱.zip
(94.61 KB, 下載次數(shù): 23)
2018-7-17 10:23 上傳
點擊文件名下載附件
密碼箱 下載積分: 黑幣 -5
|
|