#include <reg51.h>
#include <intrins.h>
sbit DX=P2^0;
sbit WX=P2^1;
sbit red=P2^2;
sbit green=P2^3;
unsigned char flag=0,esc=0;
unsigned char admin[8]={0,1,2,3,4,5,6,7};
unsigned char password[8]={16,16,16,16,16,16,16,16};//存放輸入的按鍵,初始為16,不顯示
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char code keycode[]={
0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77
};
void delay(unsigned int xms)//延時xms 毫秒
{
unsigned int i,j;
for(i=0;i<=xms;i++)
for(j=0;j<=110;j++);
}
unsigned char cmpstr(unsigned char p[],unsigned char q[])
{
unsigned char j=1;
int i;
for(i=7;i>=0;i--)
if(p[i]!=q[i])
{
j=0;
break;
}
return j;
}
unsigned char keyscan()//4*4矩陣按鍵掃描函數:(要去抖) 掃描哪個鍵被按下。若有按鍵按下,返回對應的按鍵值(0-15),否則返回16
{ unsigned char i=16,hang,temp;//初值設置為16,目的是:沒有按鍵按下時返回16;
//若不設初值(默認值為0) ,沒有按鍵按下時,將返回0,會顯示0,誤認為0被按下
P1=0x0f;//列輸出全0,行輸出全1
temp=P1;//讀行列輸入
if(temp!=0x0f) //若無按鍵按下,輸入仍為0x0f ;若有按鍵按下對應行輸入變為0,其他不變
{ delay(10);//去抖
temp=P1;//再次讀行列輸入
if(temp!=0x0f)
{ hang=temp^0xf0;
P1=hang;//輸出行掃描信號
temp=P1;//讀行列輸入
for(i=0;i<16;i++)
if(temp==keycode[i])
break;
P1=0x0f;//檢測按鍵是否釋放
while((temp=P1)!=0x0f);
}
}
return(i);
}
void display()//數碼管動態顯示一個字符串(不超過8位)函數*/
{
unsigned char i;
unsigned char wtemp=0xfe;//位選
unsigned char tag=0;//高位連續0標記
for(i=1;i<=8;i++)
{
P0=0xff;//位選消影
WX=1;//開位選
P0=wtemp;//送位選
WX=0;//鎖存位選
wtemp=_crol_(wtemp,1);//更新位選變量
P0=0x00; //段選消影
DX=1;//開段選
P0=table[password[i-1]]; //送段選
DX=0;//鎖存段選
delay(1);
}
}
void clear()
{
unsigned char i;
for(i=0;i<8;i++)
password[i]=16;
display();
}
void main()
{
//外部中斷初始化
EA=1;//總中斷允許
EX0=1;//INT0中斷允許
IT0=1;//下降沿觸發中斷
while(1)
{
P1=0xf0;//送測試信號,若有按鍵按下,與門輸出0,觸發外部中斷,否則與門輸出1,不會產生外部中斷
display(); //顯示輸入的數據
if(flag==1)
{
if(cmpstr(password,admin)==1)
{
green=0;
}
else
{
red=0;
}
clear();
delay(3000);
flag=0;
}
else
{
green=1;
red=1;
}
if(esc==1)
{
clear();
esc=0;
}
}
}
void EX_INT0() interrupt 0
{
unsigned char i,y;
y=keyscan();
if(y<10)
{
for(i=0;i<7;i++)
{
password[i]=password[i+1];//左移
}
password[7]=y;
}
if(y==10)
esc=1;
if(y==11)
flag=1;
}
|