|
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
#include "i2c.h"
#include "XPT2046.h"
#include "lcd.h"
#define GPIO_KEY P1
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
u8 mimaweishu=0;//用于判斷輸入密碼位數
u8 count1,count2,count3,count4;//指針標志
u8 a=0;//密碼錯誤次數
u8 p,q;
u8 temp;
bit querenwei=0;//確認鍵標志位
bit mimawei=0;//用于確認密碼是否正確
bit FANGSHI=0;//用于確認開鎖時是否需要密碼
bit k=1;//判斷繼電器開關狀態1為關 0為開
sbit jidianqi=P2^2;
sbit red=P2^3;
sbit bell=P2^4;//繼電器,蜂鳴器,警示燈控制
u16 yaoshi=0; //用于判斷鑰匙狀態,為0時鑰匙插入并轉到底
float dyz;
int tem;
int d0;
int d1;
int d2;
int d3; //d0-d3是電位AD值處理過后的四位數值,用于判斷是否插入鑰匙并轉到底
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 mima[8];//初始密碼存儲數組
u8 shurumima[30];//輸入密碼存儲數組
u8 xitongmima[8]={8,8,8,8,8,8,8,8};//系統密碼數組
u8 code table1[]="input the passco";
u8 code table2[]="de: --------";
u8 code table3[]="*";
u8 code table4[]="right (^_^) ";
u8 code table5[]="first error!!!!";
u8 code table6[]="second error!!!!";
u8 code table7[]="third error see ";
u8 code table8[]="u tomorrow (^_^)";
u8 code table9[]=" welcom ";
u8 code table10[]=" (^_^) ";
u8 code table11[]=" no passcode "; //指令數組
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay2(u8 x)
{
u8 a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void delay(u16 z)
{
u16 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay0(u16 r)
{
while(r--);
}
/*******************************************************************************
* 函 數 名 : yaoshichuli
* 函數功能 : 用于轉換鑰匙轉動所改變的電位器AD值
*******************************************************************************/
void yaoshichuli()
{
u16 temp;
static u8 z;
if(z==50)
{
z=0;
temp = Read_AD_Data(0x94); // AIN0 電位器
dyz=(float)temp/4096.*5;
tem=dyz*1000;
d0=tem/1000;
d1=tem%1000/100;
d2=tem%100/10;
d3=tem%10;
yaoshi=d0+d1;
}
z++;
}
void Timer1Init()
{
TMOD|=0X10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET1=1;
EA=1;
TR1=0;
}
/*******************************************************************************
* 函 數 名 : mimabijiao
* 函數功能 : 用于確認密碼是否正確?
*******************************************************************************/
bit mimabijiao()
{
bit i;
u8 m;
for(m=0;m<8;m++)
{
if(mima[m]==shurumima[m])
i=1;
else
{
i=0;
m=8;
}
}
return i;
}
///**********************************LCD跟隨密碼顯示’*‘函數**************************************
void lcd_display()
{
u8 i=0;
LcdWriteCom(0x80+0x40+8);
for(i=0;i<mimaweishu;i++)
{
LcdWriteData(table3[0]);
}
}
/*******************************************************************************
* 函 數 名 : k1-k16chuli
* 函數功能 : 處理各個按鍵功能
k1-k10為數字:0-9
k11 k12 為無效鍵 k13用于取消密碼鎖 k14為關鎖鍵 k15 k16分別是確認鍵和取消鍵
*******************************************************************************/
void k1chuli()
{
shurumima[mimaweishu]=0;
mimaweishu++;
}
void k2chuli()
{
shurumima[mimaweishu]=1;
mimaweishu++;
}
void k3chuli()
{
shurumima[mimaweishu]=2;
mimaweishu++;
}
void k4chuli()
{
shurumima[mimaweishu]=3;
mimaweishu++;
}
void k5chuli()
{
shurumima[mimaweishu]=4;
mimaweishu++;
}
void k6chuli()
{
shurumima[mimaweishu]=5;
mimaweishu++;
}
void k7chuli()
{
shurumima[mimaweishu]=6;
mimaweishu++;
}
void k8chuli()
{
shurumima[mimaweishu]=7;
mimaweishu++;
}
void k9chuli()
{
shurumima[mimaweishu]=8;
mimaweishu++;
}
void k10chuli()
{
shurumima[mimaweishu]=9;
mimaweishu++;
}
void k11chuli()
{
shurumima[mimaweishu]=10;
mimaweishu++;
}
void k12chuli()
{
shurumima[mimaweishu]=11;
mimaweishu++;
}
//方式改變鍵每按一次方式轉換一次,只有兩種方式
void k13chuli()
{
if(a==0&&(yaoshi==0))
{
FANGSHI=~FANGSHI;
} //修改.............................
if(FANGSHI==1)
{
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table11[count3]); //????,?? first erro
delay(5);
}
}
else if(FANGSHI==0)
{
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table1[count3]);
}
LcdWriteCom(0x80+0x40);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table2[count3]);
}
}
}
void k14chuli()
{
jidianqi=1;
k=1;
}
//確認鍵函數****************************************************、//
void k15chuli()
{
querenwei=1;
if(mimaweishu==8)
{
mimawei=mimabijiao();
}
else
{
mimawei=0;
}
if(querenwei==1)
{
querenwei=0;
mimaweishu=0;
for(count3=0;count3<8;count3++)
{
delay(5);
shurumima[count3]=0x0f;
}
TR1=1;
count1=0;
if(mimawei==1)
{
a=0;
jidianqi=0;
k=0;
mimawei=0;
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table4[count3]);
delay(5);
}
}
else
{
mimaweishu=0;
red=0;
bell=0;//開啟警示燈和電鈴
delay0(100);
a++;
if(a==1)
{
for(count3=0;count3<8;count3++)
{
delay(5);
shurumima[count3]=0x0f;
}
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table5[count3]);
delay(5);
}
TR1=1;
}
if(a==2)
{
for(count3=0;count3<8;count3++)
{
delay(5);
shurumima[count3]=0x0f;
}
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table6[count3]);
delay(5);
}
TR1=1;
}
if(a==3)
{
for(count3=0;count3<8;count3++)
{
delay(5);
shurumima[count3]=0x0f;
}
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table7[count3]);
delay(5);
}
LcdWriteCom(0x80+0x40);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table8[count3]);
delay(5);
}
TR1=0;
}
}
}
}
void k16chuli()
{
mimaweishu=0;
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table1[count3]);
delay(5);
}
LcdWriteCom(0x80+0x40);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table2[count3]);
delay(5);
shurumima[count3]=0x0f;
}
}
//**************************************************第一行掃描********************************
void key_scan()
{
GPIO_KEY=0XFE;
temp=GPIO_KEY&0Xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=GPIO_KEY;
switch(temp)
{
case 0xee:
k1chuli();
break;
case 0xde:
k2chuli();
break;
case 0xbe:
k3chuli();
break;
case 0x7e:
k4chuli();
break;
}
while(temp!=0xf0)
{
temp=GPIO_KEY&0xf0;
red=0;
}
}
}
GPIO_KEY=0xfd;
temp=GPIO_KEY;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=GPIO_KEY;
switch(temp)
{
case 0xed:
k5chuli();
break;
case 0xdd:
k6chuli();
break;
case 0xbd:
k7chuli();
break;
case 0x7d:
k8chuli();
break;
}
while(temp!=0xf0)
{
temp=GPIO_KEY;
temp=temp&0xf0;
}
}
}
GPIO_KEY=0xfb;
temp=GPIO_KEY;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=GPIO_KEY;
switch(temp)
{
case 0xeb:
k9chuli();
break;
case 0xdb:
k10chuli();
break;
case 0xbb:
k11chuli();
break;
case 0x7b:
k12chuli();
break;
}
while(temp!=0xf0)
{
temp=GPIO_KEY;
temp=temp&0xf0;
}
}
}
GPIO_KEY=0xf7;
temp=GPIO_KEY;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=GPIO_KEY;
switch(temp)
{
case 0xe7:
k13chuli();
break;
case 0xd7:
k14chuli();
break;
case 0xb7:
k15chuli();
break;
case 0x77:
k16chuli();
break;
}
while(temp!=0xf0)
{
temp=0xf7;
temp=temp&0xf0;
}
}
}
}
//用于無鑰匙工作方式時掃描按鍵,專門改變工作方式無其他功能
void key_scan1()
{
u16 temp;
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
if(temp==0xe7)
{
k13chuli();
}
}
}
}
//初始化函數,集合定時器,LCD顯示,初始顯示,以及各種變量希望的初始值
void chushihua()
{
u8 i;
Timer1Init();
LcdInit();
for(i=0;i<8;i++)
{
At24c02Write(i,xitongmima[i]);
delay2(100);
}
for(i=0;i<8;i++)
{
mima[i]=At24c02Read(i);
delay(5);
}
count1=0;
count3=0;
jidianqi=1;
k=1;
red=1;
bell=1;
p=2;
q=2;
a=0;
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table9[count3]);
}
LcdWriteCom(0x80+0x40);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table10[count3]);
}
}
void chuli()
{
if((yaoshi!=0)&&(a!=3))
{
q=2;
for(;p>1;p--)
{
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table9[count3]);
}
LcdWriteCom(0x80+0x40);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table10[count3]);
}
}
mimaweishu=0;
}
else
{
p=2;
if(FANGSHI==1)
{
if(yaoshi==0&&(a!=3))
{
jidianqi=0;
}
key_scan1();
}
else if(FANGSHI==0)
{
if(yaoshi==0&&(a!=3))
{
// key_scan();
// lcd_display();
if(mimaweishu==0)
{
if(k==1)
{
for(;q>1;q--)
{
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table1[count3]);
}
LcdWriteCom(0x80+0x40);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table2[count3]);
}
}
}
}
key_scan();
lcd_display();
}
}
}
}
void main()
{
chushihua();
while(1)
{
yaoshichuli();
chuli();
}
}
//****************************************定時器1中斷函數*****************************
void Timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(count1<20)
{
count1++;
}
else
{
TR1=0;
count1=0;
mimawei=0;
red=1;
bell=1;
if(a!=0)
{
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table1[count3]);
}
LcdWriteCom(0x80+0x40);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table2[count3]);
}
}
else
{
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table9[count3]);
}
LcdWriteCom(0x80+0x40);
for(count3=0;count3<16;count3++)
{
LcdWriteData(table10[count3]);
}
}
}
}
|
-
-
6、鑰匙電子鎖.zip
2018-4-15 16:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
82.82 KB, 下載次數: 8, 下載積分: 黑幣 -5
評分
-
查看全部評分
|