#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(uint x,uint y);//申明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對(duì)應(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)化為對(duì)應(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();
}
write()//鍵值輸入子函數(shù)
{
P2=0xf0;//送測(cè)試數(shù)據(jù)
if(P2!=0xf0)//回讀看是否有變化,如有則有鍵下
{void dealay();//有按鍵按下時(shí)延時(shí)去抖
if(P2!=0xf0)//再讀是否有鍵按下
{P2=0xf0; // 再送測(cè)試數(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
{delay();//延時(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
void Alarm();//進(jìn)入報(bào)警子函數(shù)
}
}
PCON=0x02;//單片機(jī)就進(jìn)入掉電狀態(tài)
}
void dealay(uint x,uint y)
{uint m,n;
for(m=x;m>0;m--)
for(n=y;n>0;n--)
}
void exter0() interupt 0//外部中斷0子函數(shù)喚醒單片機(jī)
{PCON=0x00;
}
void Alarm()
{while() //設(shè)置一個(gè)限市時(shí)標(biāo)志位,最好一分鐘
P1=0xbf;//報(bào)警信號(hào)(P1.6)
}
wo xie l hen jiu wo zi ji dou bu hao yi si l
以下是我編譯通過的
#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對(duì)應(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)化為對(duì)應(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;//送測(cè)試數(shù)據(jù)
if(P2!=0xf0)//回讀看是否有變化,如有則有鍵下
{void dealay();//有按鍵按下時(shí)延時(shí)去抖
if(P2!=0xf0)//再讀是否有鍵按下
{P2=0xf0; // 再送測(cè)試數(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)
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |