/*************************************************************************************************
**** 調(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};//鍵盤編號(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ù):
**** 功能描述:
**** 其他說明:
**** 創(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);//如果沒有鍵按下返回?zé)o效值
}/*********************************************************************
**** 子 程 序:延時(shí)去抖
**** 入口參數(shù):
**** 出口參數(shù):
**** 功能描述:
**** 其他說明:
**** 創(chuàng) 建 人:周繼承
**** 日 期:2009.06.17
**** 版 本:v1.0
**** 公司名稱:
**********************************************************************/
void delay(void)//延時(shí)去抖
{
for(j=0;j<3000;j++);
}
/*********************************************************************
**** 子 程 序:定時(shí)中斷0
**** 入口參數(shù):
**** 出口參數(shù):
**** 功能描述:
**** 其他說明:
**** 創(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ù):
**** 功能描述:
**** 其他說明:
**** 創(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ù):
**** 功能描述:
**** 其他說明:
**** 創(chuàng) 建 人:周繼承
**** 日 期:2009.06.17
**** 版 本:
**** 公司名稱:
**********************************************************************/
void EXT1() interrupt 2
{PCON=0x00;
}
/*問題有兩個(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)意見,共同進(jìn)步!周繼承在此感謝!QQ:551684929*/
| 歡迎光臨 (http://m.raoushi.com/bbs/) | Powered by Discuz! X3.1 |