本設(shè)計(jì)僅供學(xué)習(xí)參考
基于51單片機(jī)LCD1602矩陣鍵盤(pán)密碼鎖proteus仿真設(shè)計(jì)(程序+仿真)
原理圖:Altium Designer
仿真圖proteus 7.8
程序編譯器:keil 4/keil 5
編程語(yǔ)言:C語(yǔ)言
編號(hào)C0035
【騰訊文檔】C0035 網(wǎng)盤(pán)鏈接
資料下載鏈接
一、主要功能:
1.按鍵設(shè)置6位密碼,輸入密碼若密碼正確,則鎖打開(kāi)。顯示open!
2.密碼可以自己修改(6位密碼),必須是鎖打開(kāi)時(shí)才能改密。為防止誤操作,修改密碼得輸入兩次。
3.若密碼輸入錯(cuò)誤次數(shù)超過(guò)3次,蜂鳴器報(bào)警并且鎖定鍵盤(pán)。
4.24C02有復(fù)位、掉電保存密碼功能。
5.液晶屏亮度會(huì)隨光線自動(dòng)調(diào)整。
二、按鍵說(shuō)明:
排列方式:
1 2 3 A
4 5 6 B
7 8 9 C
0 # D
- ABC無(wú)定義、 *號(hào)鍵為取消當(dāng)前操作、#號(hào)鍵為確認(rèn)、D鍵為修改密碼
三、其他說(shuō)明:
1、首次使用時(shí)輸入:131420,對(duì)密碼進(jìn)行初始化,當(dāng)顯示:initpassword,證明密碼初始化完成,此時(shí)的密碼為:000000。然后可以改密了。(如密碼忘記就再輸入131420初始化,然后密碼就是000000了,不要告訴別人哦~~~)
2、按下 * 鍵或復(fù)位鍵,可以關(guān)鎖并退出。
3、當(dāng)輸入密碼錯(cuò)誤后,報(bào)警并鎖定鍵盤(pán)3秒鐘。
4、修改密碼:在開(kāi)鎖狀態(tài)下,再次輸入正確的密碼并按下 # 鍵,此時(shí)聽(tīng)到兩聲提示,輸入新的六位密碼并按 D 鍵,再重復(fù)輸入一次新密碼并按 D ,會(huì)聽(tīng)到兩聲提示音,表示重設(shè)密碼成功,內(nèi)部保存新密碼并存儲(chǔ)。如兩次輸入的新密碼不一樣,則重設(shè)密碼失敗。
仿真圖(提供源文件):
程序(提供源文件源碼):
LCD1602
//==================================================================================================
//=======================================LCD1602====================================================
//==================================================================================================
#define yi 0x80 //LCD第一行的初始位置,因?yàn)長(zhǎng)CD1602字符地址首位D7恒定為1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因?yàn)榈诙械谝粋€(gè)字符位置地址是0x40)
//----------------延時(shí)函數(shù),后面經(jīng)常調(diào)用----------------------
void delay(uint xms)//延時(shí)函數(shù),有參函數(shù)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
//--------------------------寫(xiě)指令---------------------------
void write_1602com(uchar com)//****液晶寫(xiě)入指令函數(shù)****
{
lcd1602_rs=0;//數(shù)據(jù)/指令選擇置為指令
lcd1602_rw=0; //讀寫(xiě)選擇置為寫(xiě)
P0=com;//送入數(shù)據(jù)
delay(1);
lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
delay(1);
lcd1602_en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}
//-------------------------寫(xiě)數(shù)據(jù)-----------------------------
void write_1602dat(uchar dat)//***液晶寫(xiě)入數(shù)據(jù)函數(shù)****
{
lcd1602_rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
lcd1602_rw=0; //讀寫(xiě)選擇置為寫(xiě)
P0=dat;//送入數(shù)據(jù)
delay(1);
lcd1602_en=1; //en置高電平,為制造下降沿做準(zhǔn)備
delay(1);
lcd1602_en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}
//-------------------------初始化-------------------------
void lcd_init(void)
{
write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
write_1602com(0x0c);//開(kāi)顯示不顯示光標(biāo)
write_1602com(0x06);//整屏不移動(dòng),光標(biāo)自動(dòng)右移
write_1602com(0x01);//清顯示
}
按鍵和聲音提示
//=====================按鍵檢測(cè)并返回按鍵值===============================
unsigned char keynum(void)
{
unsigned char row,col,i;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
Delay5Ms();
Delay5Ms();
if((P1&0xf0)!=0xf0)
{
row=P1^0xf0; //確定行線
i=0;
P1=a[i]; //精確定位
while(i<4)
{
if((P1&0xf0)!=0xf0)
{
col=~(P1&0xff); //確定列線
break; //已定位后提前退出
}
else
{
i++;
P1=a[i];
}
}
}
else
{
return 0;
}
while((P1&0xf0)!=0xf0);
return (row|col); //行線與列線組合后返回
}
else return 0; //無(wú)鍵按下時(shí)返回0
}
//=======================一聲提示音,表示有效輸入========================
void OneAlam(void)
{
ALAM=0;
Delay5Ms();
ALAM=1;
}
//========================二聲提示音,表示操作成功========================
void TwoAlam(void)
{
ALAM=0;
Delay5Ms();
ALAM=1;
Delay5Ms();
ALAM=0;
Delay5Ms();
ALAM=1;
}
//========================三聲提示音,表示錯(cuò)誤========================
void ThreeAlam(void)
{
ALAM=0;
Delay5Ms();
ALAM=1;
Delay5Ms();
ALAM=0;
Delay5Ms();
ALAM=1;
Delay5Ms();
ALAM=0;
Delay5Ms();
ALAM=1;
}
重置密碼
//========================重置密碼==================================================
//==================================================================================
void ResetPassword(void)
{
unsigned char i;
unsigned char j;
if(pass==0)
{
pass=0;
DisplayChar(); //顯示錯(cuò)誤
ThreeAlam(); //沒(méi)開(kāi)鎖時(shí)按下重置密碼報(bào)警3聲
}
else //開(kāi)鎖狀態(tài)下才能進(jìn)行密碼重置程序
{
if(ReInputEn==1) //開(kāi)鎖狀態(tài)下,ReInputEn置1,重置密碼允許
{
if(N==6) //輸入6位密碼
{
ReInputCont++; //密碼次數(shù)計(jì)數(shù)
if(ReInputCont==2) //輸入兩次密碼
{
for(i=0;i<6;)
{
if(TempPassword[i]==InputData[i]) //將兩次輸入的新密碼作對(duì)比
i++;
else //如果兩次的密碼不同
{
//DisplayListChar(0,1,Error);
write_1602com(er);
for(j=0;j<16;j++)
{
write_1602dat(Error[j]); //顯示錯(cuò)誤Error
}
ThreeAlam(); //錯(cuò)誤提示
pass=0; //關(guān)鎖
ReInputEn=0; //關(guān)閉重置功能,
ReInputCont=0;
DisplayChar();
break;
}
}
if(i==6)
{
//DisplayListChar(0,1,ResetOK);
write_1602com(er);
for(j=0;j<16;j++)
{
write_1602dat(ResetOK[j]); //密碼修改成功,顯示
}
TwoAlam(); //操作成功提示
WrToROM(TempPassword,0,6); //將新密碼寫(xiě)入24C02存儲(chǔ)
ReInputEn=0;
}
ReInputCont=0;
CorrectCont=0;
}
else //輸入一次密碼時(shí)
{
OneAlam();
//DisplayListChar(0, 1, again); //顯示再次輸入一次
write_1602com(er);
for(j=0;j<16;j++)
{
write_1602dat(again[j]); //顯示再輸入一次
}
for(i=0;i<6;i++)
{
TempPassword[i]=InputData[i]; //將第一次輸入的數(shù)據(jù)暫存起來(lái)
}
}
N=0; //輸入數(shù)據(jù)位數(shù)計(jì)數(shù)器清零
}
}
}
}