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