/************************************************************************************************* **** 調(diào) 試:周繼承 **** Email: zhoujichengxi@163.com ************************************************************************************************* **** 1. MCU:at89s51 **** 2. 晶振:12MH **** 3. 2009.06. 完成 ************************************************************************************************* ************************************************************************************************/ #include<reg51.h> #define uchar unsigned char; #define uint unsigned int; void delay(void); void delay1(void); void right(void); write(void); uchar A[]={0,1,2,3,4,5}; uchar B1[]={0,0,0,0,0,0}; uchar B2[]={0,0,0,0,0,0}; uint key_data[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,0xb7,0xbb,0xbd,0xbe}; char zhuan[12]={0,1,2,3,4,5,6,7,8,9,0x0a,0x0b};//鍵盤(pán)編號(hào)轉(zhuǎn)化為對(duì)應(yīng)的數(shù)字 uchar temp,temp1,i,y,c,c1; c=0; uint s,j; main() { EX1=1; PX1=1; IT1=1; c1=0; begin: s=5000; EA=1; ET0=1; TMOD=0x01; //定時(shí)器0為工作方式1 TH0=(65535-5000)/256; TL0=(65535-5000)%256; //初植 TR0=1;//啟動(dòng)定時(shí)器 P1=0xfe; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[0]=y; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[1]=y; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[2]=y; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[3]=y; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[4]=y; while(1) {if(s==0) goto loop; y=write(); if(y!=0x0c) break; } B1[5]=y; TR0=0; P1=0xff; if(B1[0]==A[0]) {if(B1[1]==A[1]) {if(B1[2]==A[2]) {if(B1[3]==A[3]) {if(B1[4]==A[4]) {if(B1[5]==A[5]) P1=0x00; delay1(); right(); loop: TR0=0; P1=0xff; PCON=0x01; goto begin;}}}}} {P1=0xf0; delay1(); c1++; if(c1<3) goto begin; c1=0;//還原C1的值 for(i=0;i<100;i++) { P1=0xf0; delay(); P1=0xff; delay(); } P1=0xff; PCON=0x01;// 進(jìn)入休眠 goto begin; } } /********************************************************************* **** 子 程 序:讀取鍵值服務(wù)程序 **** 入口參數(shù): **** 出口參數(shù): **** 功能描述: **** 其他說(shuō)明: **** 創(chuàng) 建 人:周繼承 **** 日 期:2009.06.17 **** 版 本: **** 公司名稱: **********************************************************************/ write()//鍵值輸入子函數(shù) { P0=0xf0;//送測(cè)試數(shù)據(jù) if(P0!=0xf0)//回讀看是否有變化,如有則有鍵下 {void delay();//有按鍵按下時(shí)延時(shí)去抖 if(P0!=0xf0)//再讀是否有鍵按下 {P0=0xf0; // 再送測(cè)試數(shù)據(jù) temp=P0;//保存行或列值 P0=0x0f;//數(shù)據(jù)反轉(zhuǎn) temp=P0|temp; P1=0xbe; for(i=0;i<16;i++) {if(temp==key_data) temp=zhuan; } P0=0xf0;//送測(cè)試數(shù)據(jù) delay(); if(P0==0xf0) { P1=0xfe; return(temp);}//如果有鍵按下返回鍵值 } } return(0x0c);//如果沒(méi)有鍵按下返回?zé)o效值 }/********************************************************************* **** 子 程 序:延時(shí)去抖 **** 入口參數(shù): **** 出口參數(shù): **** 功能描述: **** 其他說(shuō)明: **** 創(chuàng) 建 人:周繼承 **** 日 期:2009.06.17 **** 版 本:v1.0 **** 公司名稱: **********************************************************************/ void delay(void)//延時(shí)去抖 { for(j=0;j<3000;j++); } /********************************************************************* **** 子 程 序:定時(shí)中斷0 **** 入口參數(shù): **** 出口參數(shù): **** 功能描述: **** 其他說(shuō)明: **** 創(chuàng) 建 人:周繼承 **** 日 期:2009.06.17 **** 版 本:v1.0 **** 公司名稱: **********************************************************************/ void timer0() interrupt 1//延時(shí)用于控制密碼輸入時(shí)間 {TMOD=0x01; //定時(shí)器0為工作方式1 TH0=(65535-5000)/256; TL0=(65535-5000)%256;//初植 TR0=1;//啟動(dòng)定時(shí)器 s--; } /********************************************************************* **** 子 程 序:讀取密碼正確狀態(tài)服務(wù)程序 **** 入口參數(shù): **** 出口參數(shù): **** 功能描述: **** 其他說(shuō)明: **** 創(chuàng) 建 人:周繼承 **** 日 期:2009.06.17 **** 版 本: **** 公司名稱: **********************************************************************/ void right()//正確情況下子函數(shù) { c=0; c1=0; TR0=0; P1=0xff; loop5: s=5000; EA=1; ET0=1; TMOD=0x01; //定時(shí)器0為工作方式1 TH0=(65535-5000)/256; TL0=(65535-5000)%256; //初植 TR0=1;//啟動(dòng)定時(shí)器 P1=0xfe; while(1) { y=write(); if(y==0x0a) goto loop2; if(y==0x0b) goto loop3; if(s==0) break; } P1=0xff; goto loop4; loop2: P1=0xfc; //kai mem delay1(); P1=0xff; goto loop4; loop3: P1=0x00; delay1(); s=5000; EA=1; ET0=1; TMOD=0x01; //定時(shí)器0為工作方式1 TH0=(65535-5000)/256; TL0=(65535-5000)%256; //初植 TR0=1;//啟動(dòng)定時(shí)器 P1=0xfe; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[0]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[1]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[2]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[3]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[4]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B1[5]=y; P1=0x00; delay1(); P1=0xff; /********************************/ s=5000; EA=1; ET0=1; TMOD=0x01; //定時(shí)器0為工作方式1 TH0=(65535-5000)/256; TL0=(65535-5000)%256; //初植 TR0=1;//啟動(dòng)定時(shí)器 P1=0xfe; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[0]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[1]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[2]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[3]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[4]=y; while(1) {if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2[5]=y; /* for(i=0;i<6;i++) { while(1) { if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2=y; }*/ P1=0x00; delay1(); P1=0xff; for(i=0;i<6;i++) {if(B1==B2) c++; } if(c<5) {P1=0xf0; delay1(); c1++; if(c1<3) goto loop5; for(i=0;i<100;i++) { P1=0xf0; delay(); P1=0xff; delay(); } goto loop4; } for(i=0;i<6;i++) A=B1; P1=0x55; delay1();
loop4: TR0=0; P1=0xff; } /********************************************************************* **** 子 程 序: **** 入口參數(shù): **** 出口參數(shù): **** 功能描述: **** 其他說(shuō)明: **** 創(chuàng) 建 人:周繼承 **** 日 期:2009.06.17 **** 版 本: **** 公司名稱: **********************************************************************/ void EXT1() interrupt 2 {PCON=0x00; } /*問(wèn)題有兩個(gè)不能理解: *1,為什么讀取鍵值的時(shí)候不能用循環(huán),循環(huán) for(i=0;i<6;i++) { while(1) { if(s==0) goto loop4; y=write(); if(y!=0x0c) break; } B2=y; } 使用時(shí)跳出break后不再循環(huán)for(i=0;i<6;i++) 2,為什么把原始密碼更改為有6的后就不能識(shí)別密碼了,希望大家給點(diǎn)意見(jiàn),共同進(jìn)步!周繼承在此感謝!QQ:551684929*/
[此貼子已經(jīng)被作者于2009-6-27 11:03:16編輯過(guò)]
|