以下是我編譯通過的
#include<reg51.h> #include<string.h> #define uchar unsigned char; #define uint unsigned int; uchar write(); void Alarm();//報(bào)警子函數(shù) void right(); void wrong(); void dealay(unsigned char count);//申明3個(gè)子函數(shù) uchar i,j,c,temp; i=0; j=0; c=0; char str[6]={1,2,3,4,5,6};//定義初始密碼字符串(我不用123456,用和key_data[]一樣的字符) uint key_data[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,0xb7,0xbb};//(0123456789對應(yīng)的鍵盤編碼 char zhuan[16]={0,1,2,3,4,5,6,7,8,9,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};//鍵盤編號(hào)轉(zhuǎn)化為對應(yīng)的數(shù)字 char g[6]={0,0,0,0,0,0};//更改密碼緩存區(qū) uchar gai[]={0,0,0,0,0,0};
main()//////////主函數(shù)只執(zhí)行一次就復(fù)位,另外寄存器的配置呢???、 { IE=0x83; IP=0x01; for(i=0;i<6;i++) g=write(); for(i=0;i<6;i++) {if(g==str) c++; } if(c==6) right(); else wrong(); }
void delayxms(int count) { int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); }
write()//鍵值輸入子函數(shù) { P2=0xf0;//送測試數(shù)據(jù) if(P2!=0xf0)//回讀看是否有變化,如有則有鍵下 {void dealay();//有按鍵按下時(shí)延時(shí)去抖 if(P2!=0xf0)//再讀是否有鍵按下 {P2=0xf0; // 再送測試數(shù)據(jù) temp=P1;//保存行或列值 P2=0x0f;//數(shù)據(jù)反轉(zhuǎn) temp=P1|temp; for(i=0;i<16;i++) {if(temp==key_data) temp=zhuan; } return(temp); } } } void right()//正確情況下子函數(shù) {if(0x0a==write())//開鎖就按A鍵 P1=0xfe;//開鎖狀態(tài)顯示(P0.3) else {if(0x0b==write())//按B鍵進(jìn)入改密碼狀態(tài) {for(i=0;i<6;i++)//想加個(gè)時(shí)間限制 {g=write(); } for(i=0;i<6;i++) {gai=write(); } for(i=0;i<6;i++) {if(g==gai) c++; } if(c==6) {for(i=0;i<6;i++) str=gai; P1=0xef; } } else {delayxms(10);//延時(shí)子函數(shù) PCON=0x02;//單片機(jī)就進(jìn)入掉電狀態(tài)} } } } void wrong()//錯(cuò)誤情況的子函數(shù) { if(0x0a==write())//按A鍵進(jìn)入改密碼狀態(tài) {for(i=0;i<6;i++) g=write(); for(i=0;i<6;i++) {if(g==str) c++; }///////////////////2各FOR的內(nèi)容一樣,可以直接寫如下,感覺邏輯上好像有點(diǎn)問題 /* {for(i=0;i<6;i++) {g=write(); if(g==str) c++;} */ if(c==6) right(); else {for(i=0;i<6;i++) {g=write(); } for(i=0;i<6;i++) {if(g==gai) c++; } if(c==6) right(); else Alarm();//進(jìn)入報(bào)警子函數(shù) } } PCON=0x02;//單片機(jī)就進(jìn)入掉電狀態(tài) }
void exter0() interrupt 0//外部中斷0子函數(shù)喚醒單片機(jī) {PCON=0x00; } void Alarm() {while(1); //設(shè)置一個(gè)限市時(shí)標(biāo)志位,最好一分鐘 P1=0xbf;//報(bào)警信號(hào)(P1.6) }
|