#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit rs=P1^0; // LCD1602數據命令選擇輸入
sbit rw=P1^1; // LCD1602讀寫數據端
sbit en=P1^2; // LCD1602使能信號端
sbit ledg=P2^0; // 綠色二極管
sbit ledr=P2^7; //紅色二極管
sbit relay=P1^5;
sbit buzz=P1^4;
char table0[]="error"; //提示輸入錯誤
char table1[]="open"; //提示輸入正確
char table2[]="password:****"; // //提示輸入密碼
int temp,ch,m0,m1,p=0,n0,n1,n2,n3,a=0;//,n4,n5;
sbit led=P2^1;
sbit BF = P0^7; //定義讀忙
uchar busytest(); //讀忙函數
void delay(int z) //延時程序
{
int x,c;
for(x=z;x>0;x--)
for(c=100;c>0;c--);
}
keyscan() // 掃描輸入的鍵值
{
temp=P3&0xf0;
P3=0xfe;
delay(1);
temp=P3&0xf0;
//led=0;
while(temp!=0xf0)
{
switch(temp)
{
case 0xe0:ch='7';
break;
case 0xd0:ch='8';
break;
case 0xb0:ch='9';
break;
default:ch=p;
break;
//led=0;
}
//led=0;
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
P3=0xfd;
delay(1);
temp=P3&0xf0;
while(temp!=0xf0)
{
switch(temp)
{
case 0xe0:ch='4';
break;
case 0xd0:ch='5';
break;
case 0xb0:ch='6';
break;
default:ch=p;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
P3=0xfb;
delay(1);
temp=P3&0xf0;
while(temp!=0xf0)
{
switch(temp)
{
case 0xe0:ch='1';
break;
case 0xd0:ch='2';
break;
case 0xb0:ch='3';
break;
default:ch=p;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
P3=0xf7;
delay(1);
temp=P3&0xf0;
while(temp!=0xf0)
{
switch(temp)
{
case 0xe0: ch='A';
break;
case 0xd0:ch='0';
break;
case 0xb0:ch='B';
break;
default: ch=p;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
//led=0;
return ch;
//led=0;
}
void wcom(uchar com) //LCD寫指令
{
busytest();
en=0;
rs=0;
rw = 0; //選擇寫入
en=1;
P0=com;
//delay(1); //延時程序
en=0;
delay(1); //延時程序
// en=0;
}
uchar busytest(void)// 讀忙 1為忙 0為不忙
{
// bit result;// 位定義,一字節
// en = 1;
rs = 0;
rw = 1;
en = 1;
en = 0;
while(P0 & 0x80)
{
en = 0;
en = 1;
}
delay(1);
// result=BF; //確定是否等于忙碌狀態
// en=0;
// return result;
}
void wdat(uchar dat) //LCD中寫入數據
{
busytest();//判斷是否讀忙
en=0;
rs=1;
rw=0;
en=1;
P0=dat;
// delay(1);
en=0;
delay(4);
// en=0;
}
void init() //LCD1602初始化
{
//en=0;
//led=0;
wcom(0x38);
wcom(0x00);
wcom(0x0e);
wcom(0x14);
/*wcom(0x38);
wcom(0x06);
wcom(0x01);
wcom(0x80); */
//led=0;
}
void error() // 提示錯誤
{
char m2;
wcom(0xc6);
for(m2=0;m2<5;m2++)
{
wdat(table0[m2]);
}
}
void open() //提示輸入正確
{
char m2;
wcom(0xc6);
for(m2=0;m2<4;m2++)
{
wdat(table1[m2]);
}
}
void pass() //提示輸入密碼
{
//char m5=1;
char m2;
wcom(0x80); //有問題
// led=0;
for(m2=0;m2<13;m2++)
{
wdat(table2[m2]); //有問題
//led=0;
}
}
change(int m)
{
delay(500);
wcom(m);
wdat('*');
}
void main() //主函數
{
rw=0;
ledg=1;
ledr=1;
// relay=0;
buzz=1;
init();
delay(5);
wcom(0x89);
pass();
wcom(0x89);
//led=0;
//led=1;
while(keyscan()==p) //輸入第一個鍵值
{
delay(3);
// P2 =
keyscan();
}
//led=0;
wdat(keyscan());
n0=keyscan();
change(0x89);
delay(10);
ch=p;
//led=0;
while(keyscan()==p) //輸入第二個鍵值
{
delay(3);
keyscan();
}
wdat(keyscan());
n1=keyscan();
change(0x8a);
ch=p;
while(keyscan()==p) //輸入第三個鍵值
{
delay(3);
keyscan();
}
wdat(keyscan());
n2=keyscan();
change(0x8b);
ch=p;
while(keyscan()==p) //輸入第四個鍵值
{
delay(3);
keyscan();
}
wdat(keyscan());
n3=keyscan();
change(0x8c);
/*
ch=p;
while(keyscan()==p) //輸入第五個鍵值
{
delay(3);
keyscan();
}
wdat(keyscan());
n4=keyscan();
change(0x8d);
ch=p;
while(keyscan()==p) //輸入第六個鍵值
{
delay(3);
keyscan();
}
wdat(keyscan());
n5=keyscan();
change(0x8e);
*/ // led=0;
// while(1);
while(1)
{
if(n0=='2'&&n1=='0'&&n2=='1'&&n3=='8') //設定密碼值 2 0 1 8 并判斷輸入的是否是設定的密碼值
{
int m3=1;
open();
ledg=0;
//relay=1;
delay(3000);
//relay=0;
ledg=1;
while(m3)
{
int m4,m5;
//ledg=0;
for(m4=200;m4>0;m4--)
{
keyscan();
if(keyscan()=='A')
{
m4=0;
m3=0;
}
}
//ledg=1;
if(m3!=0)
{
for(m5=200;m5>0;m5--)
{
keyscan();
if(keyscan()=='A')
{
m3=0;
}
}
}
}
}
else
{
//ledr=0;
error();
// buzz=0;
delay(2000);
wcom(0x01);
a++;
}
//ledr=0 ;
// delay(2000);
if(a==3)
{
ledr=0;
}
else
{
break;
}
//init();
break;
//init();
}
}
|