=byte_read(0x2000+i);//讀取EEPROM中數(shù)據(jù)保存在table2
}
EA = 1; //開總中斷
if((table1[0]==table2[0])&&(table1[1]==table2[1])&&(table1[2]==table2[2])
&&(table1[3]==table2[3])&&(table1[4]==table2[4])&&(table1[5]==table2[5])) //核對(duì)密碼
{
Q1=1; //門鎖狀態(tài)
Q2=0; //門鎖狀態(tài)
P_bit=0; //密碼的位次變量清0
}
else
{
ERROR++; //密碼錯(cuò)誤計(jì)數(shù)
Buzzer_sign=2;//警示錯(cuò)誤
}
}
else Buzzer_sign=2;//警示錯(cuò)誤
break;
}
}
}
}
/************數(shù)碼管動(dòng)態(tài)顯示程序**************/
void display()
{
static uchar num=0; //時(shí)分顯示變量
switch(num)
{
case 0:
P0=0xff; //不選擇位
wela=1;
wela=0;
if(P_bit==0)
P0=0x00; //消隱
num++;
break;
case 1:
P0=0x00; //消隱
dula=1;
dula=0;
P0=0xdf; //第1位位碼
wela=1;
wela=0;
if(P_bit<1)
P0=0x00;
else
{
if(P_bit==1)P0=table[table1[0]];//第1位段碼
if(P_bit==2)P0=table[table1[1]];
if(P_bit==3)P0=table[table1[2]];
if(P_bit==4)P0=table[table1[3]];
if(P_bit==5)P0=table[table1[4]];
if(P_bit==6)P0=table[table1[5]];
}
dula=1;
dula=0;
num++;
break;
case 2:
P0=0x00; //消隱
dula=1;
dula=0;
P0=0xef; //第2位位碼
wela=1;
wela=0;
if(P_bit<2)
P0=0x00;
else
{
if(P_bit==2)P0=table[table1[0]];//第2位段碼
if(P_bit==3)P0=table[table1[1]];
if(P_bit==4)P0=table[table1[2]];
if(P_bit==5)P0=table[table1[3]];
if(P_bit==6)P0=table[table1[4]];
}
dula=1;
dula=0;
num++;
break;
case 3:
P0=0x00; //消隱
dula=1;
dula=0;
P0=0x77; //第3位位碼
wela=1;
wela=0;
if(P_bit<3)
P0=0x00;
else
{
if(P_bit==3)P0=table[table1[0]];//第3位段碼
if(P_bit==4)P0=table[table1[1]];
if(P_bit==5)P0=table[table1[2]];
if(P_bit==6)P0=table[table1[3]];
}
dula=1;
dula=0;
num++;
break;
case 4:
P0=0x00; //消隱
dula=1;
dula=0;
P0=0x7b; //第4位位碼
wela=1;
wela=0;
if(P_bit<4)
P0=0x00;
else
{
if(P_bit==4)P0=table[table1[0]];//第4位段碼
if(P_bit==5)P0=table[table1[1]];
if(P_bit==6)P0=table[table1[2]];
}
dula=1;
dula=0;
num++;
break;
case 5:
P0=0x00; //消隱
dula=1;
dula=0;
P0=0x7d; //第5位位碼
wela=1;
wela=0;
if(P_bit<5)
P0=0x00;
else
{
if(P_bit==5)P0=table[table1[0]];//第5位段碼
if(P_bit==6)P0=table[table1[1]];
}
dula=1;
dula=0;
num++;
break;
case 6:
P0=0x00; //消隱
dula=1;
dula=0;
P0=0x7e; //第6位位碼
wela=1;
wela=0;
if(P_bit<6)
P0=0x00;
else
P0=table[table1[0]]; //第6位段碼
dula=1;
dula=0;
num=0;
break;
}
}
/*****************************
蜂鳴器間歇響鈴
*****************************/
void Buzzer_second()
{
if((second==1)&&(Buzzer_sign>0))//響鈴允許1與響鈴次數(shù)
{
second=0; //響鈴允許清0,等待下一秒
Buzzer=0; //蜂鳴器響
Buzzer_sign--; //響鈴次數(shù)減1
TR0=1; //開定時(shí)器
}
}
/*-----------------------------
定時(shí)器0中斷服務(wù)程序 50毫秒
------------------------------*/
void timer0() interrupt 1
{
static uchar count=0; //中斷計(jì)數(shù)變量
count++; //中斷計(jì)數(shù)變量count3自+1
if(count==1) //0.1秒時(shí)間到
Buzzer=1; //蜂鳴器端口復(fù)位
if(count>=2) //1秒
{
count=0; //中斷計(jì)數(shù)變量清0
second=1; //響鈴允許置1
TR0 = 0; //定時(shí)器0關(guān)閉
}
}
/* ================ 打開 ISP,IAP 功能 ================= */
void ISP_IAP_enable()
{
EA = 0; /* 關(guān)中斷 */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WaitTime; /* 寫入硬件延時(shí) */
ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */
}
/* =============== 關(guān)閉 ISP,IAP 功能 ================== */
void ISP_IAP_disable()
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA = 1; /* 開中斷 */
}
/* ================ 公用的觸發(fā)代碼 ==================== */
void ISPgoon()
{
ISP_IAP_enable(); /* 打開 ISP,IAP 功能 */
ISP_TRIG = 0x46; /* 觸發(fā)ISP_IAP命令字節(jié)1 */
ISP_TRIG = 0xb9; /* 觸發(fā)ISP_IAP命令字節(jié)2 */
_nop_();
}
/* ==================== 字節(jié)讀 ======================== */
uchar byte_read(uint byte_addr)
{
ISP_ADDRH = (uchar)(byte_addr >> 8);/* 地址賦值 */
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */
ISP_CMD = ISP_CMD | RdCommand; /* 寫入讀命令 */
ISPgoon(); /* 觸發(fā)執(zhí)行 */
ISP_IAP_disable(); /* 關(guān)閉ISP,IAP功能 */
return (ISP_DATA); /* 返回讀到的數(shù)據(jù) */
}
/* ================== 扇區(qū)擦除 ======================== */
void SectorErase(uint sector_addr)
{
uint iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* 取扇區(qū)地址 */
ISP_ADDRH = (uchar)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */
ISPgoon(); /* 觸發(fā)執(zhí)行 */
ISP_IAP_disable(); /* 關(guān)閉ISP,IAP功能 */
}
/* ==================== 字節(jié)寫 ======================== */
void byte_write(uint byte_addr, uchar original_data)
{
ISP_ADDRH = (uchar)(byte_addr >> 8); /* 取地址 */
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
ISP_CMD = ISP_CMD | PrgCommand; /* 寫命令2 */
ISP_DATA = original_data; /* 寫入數(shù)據(jù)準(zhǔn)備 */
ISPgoon(); /* 觸發(fā)執(zhí)行 */
ISP_IAP_disable(); /* 關(guān)閉IAP功能 */
}
/**********萬能密鑰***********/
void Universal_key()
{
while(!key_1&&!key_2&&!key_3)
{
delayms(5000); //延時(shí)5秒
while(!key_1&&!key_2&&!key_3)
{
Set_up=1; //萬能密鑰設(shè)置標(biāo)志置1
LED=0;
while(!key_1&&!key_2&&!key_3); //等待鍵抬起
delayms(200); //延時(shí)
}
}
while(Set_up) //萬能密鑰設(shè)置標(biāo)志為1
{
if(key_4==0)
{
Set_up=0; //萬能密鑰設(shè)置標(biāo)志清0
LED=1;
}
keyscan(); //矩陣按鍵掃描程序
key_service(); //按鍵服務(wù)程序
Buzzer_second(); //蜂鳴器響鈴
display(); //數(shù)碼管顯示程序
}
}
/*-------------------------------
1ms延時(shí)子程序(11.0592MHz 12T)
-------------------------------*/
void delayms(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=114;j>0;j--);
}
/*-------------------------------
報(bào)警程序
-------------------------------*/
void baojing()
{
if(ERROR>=3) //密碼錯(cuò)誤3次
{
Buzzer_sign=255; //響鈴次數(shù)
P0=0x00;
dula=1;
dula=0;
while(Buzzer_sign)
{
Buzzer_second(); //蜂鳴器響鈴
// display();
}
ERROR=0;
}
}
作者: 78558mo 時(shí)間: 2018-4-15 10:22
感謝大神
作者: 78558mo 時(shí)間: 2018-4-15 10:22
嗯,謝謝。我試一試
作者: zl2168 時(shí)間: 2018-4-15 13:27
本帖最后由 zl2168 于 2018-4-15 13:40 編輯
這里有2個(gè)問題,一是輸入識(shí)別鍵號(hào),二是12864顯示,宜分別弄懂弄通后合并。
介紹你幾個(gè)實(shí)例,其中,下面第一個(gè)實(shí)例是識(shí)別鍵號(hào),第二個(gè)實(shí)例是12864顯示,第三個(gè)實(shí)例是保留前幾個(gè)鍵號(hào),顯示新的鍵號(hào)。
自己去研讀吧!
作者: zl2168 時(shí)間: 2018-4-15 13:28
本帖最后由 zl2168 于 2018-4-15 13:29 編輯
矩陣式鍵盤
先Proteus仿真一下,確認(rèn)有效。
實(shí)例75 4×4矩陣式鍵盤.rar
(44.8 KB, 下載次數(shù): 6)
2018-4-15 13:29 上傳
點(diǎn)擊文件名下載附件
4×4矩陣式鍵盤.jpg (190.17 KB, 下載次數(shù): 34)
下載附件
2018-4-15 13:29 上傳
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil C和Proteus》清華大學(xué)出版社ISBN 978-7-302-41682-1.。書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。
作者: zl2168 時(shí)間: 2018-4-15 13:31
本帖最后由 zl2168 于 2018-4-15 13:32 編輯
LCD12864顯示屏顯示漢字
先Proteus仿真一下,確認(rèn)有效。
12864.jpg (153.39 KB, 下載次數(shù): 26)
下載附件
2018-4-15 13:32 上傳
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil C和Proteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實(shí)驗(yàn)操作,電路與程序真實(shí)可靠可信可行,可演示,可觀測(cè),程序語句條條有注解。
作者: 遠(yuǎn)野貴樹 時(shí)間: 2018-4-15 13:32
首先要定義引腳。然后令其低電平觸發(fā)(也就是按下的狀態(tài)為低電平)。中間定義一個(gè)變量,根據(jù)按下的按鍵不同,來判斷按下的數(shù)值
作者: zl2168 時(shí)間: 2018-4-15 13:33
本帖最后由 zl2168 于 2018-4-15 13:34 編輯
實(shí)例76 8279擴(kuò)展8×8鍵盤
先Proteus仿真一下,確認(rèn)有效。
8279.jpg (186.93 KB, 下載次數(shù): 28)
下載附件
2018-4-15 13:34 上傳
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil C和Proteus》清華大學(xué)出版社ISBN 978-7-302-41682-1.。書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。
作者: nealby 時(shí)間: 2018-4-15 14:19
建數(shù)組,存數(shù)值,按鍵后刷新
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |