密码锁+1602液晶显示C程序.docx
《密码锁+1602液晶显示C程序.docx》由会员分享,可在线阅读,更多相关《密码锁+1602液晶显示C程序.docx(24页珍藏版)》请在冰豆网上搜索。
密码锁+1602液晶显示C程序
#include
#defineuintunsignedint
#defineucharunsignedchar
voidkey_scan();
ucharcount0,count1,count3,num,n=0,temp,a,j,count4;
ucharmima[8];//初始密码存储区
uchartab_key[50];//输入密码存储区
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
bitenterflag;//确认键按下与否的标志
bitmimaflag;//密码正确与否的标志
bitxiugaiflag;//修改密码标志
bitenter1flag;//修改密码确认键标志
sbitred=P3^7;
sbitbell=P3^6;
sbitrs=P2^0;
sbitrw=P2^1;
sbitlcden=P2^2;
sbitscl=P3^4;
sbitsda=P3^5;
ucharcodetable1[]="inputthepassco";
ucharcodetable2[]="de:
--------";
ucharcodetable3[]="*";
ucharcodetable4[]="right(^_^)";
ucharcodetable5[]="firsterror!
!
";
ucharcodetable6[]="seconderror!
ucharcodetable7[]="thirderrorsee";
ucharcodetable8[]="utomorrow(^_^)";
ucharcodetable9[]="definethepassc";
ucharcodetable10[]="ode:
ucharcodetable11[]="codeisnew";
//******************************键盘消抖函数*******************************
voiddelay1()
{;;}
voiddelay2(ucharx)
{
uchara,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
voiddelay(uintz)
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
//****************************e^2room的初始化*******************************
voidstart()//开始信号
sda=1;
delay1();
scl=1;
sda=0;
voidstop()//停止
//****************************应答信号*************************************
voidrespond()
uchari;
while((sda==1)&&(i<250))i++;
scl=0;
//*****************************写字节操作函数**********************************
voidwrite_byte(uchardate)
uchari,temp;
temp=date;
for(i=0;i<8;i++)
temp=temp<<1;//保持最高位,左移到进位CY
sda=CY;
sda=1;//总线释放
//*******************************读字节操作函数*****************************
ucharread_byte()
uchari,k;
k=(k<<1)|sda;//或运算,放到最低位
returnk;
//**********************************写地址函数******************************
voidwrite_add(ucharaddress,uchardate)
start();
write_byte(0xa0);
respond();
write_byte(address);
write_byte(date);
stop();
//*******************************读地址函数*************************************
ucharread_add(ucharaddress)
uchardate;
write_byte(0xa1);
date=read_byte();
returndate;
//****************************LCD1602的初始化*******************************
voidwrite_com(ucharcom)
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
voidwrite_date(uchardate)
rs=1;
P0=date;
//***************************************密码比较函数********************************
bitmimacmp()
bitflag;
if(mima[i]==tab_key[i])
flag=1;
else
flag=0;
i=8;
return(flag);//返回flag
////**********************************LCD显示函数开始**************************************
voidlcd_display()
uchari=0;
write_com(0x80+0x40+8);
for(i=0;i{write_date(table3[0]);}}//****************************************键盘功能分配函数群开始****************************//**0**1**2**3**//**4**5**6**7**//**8**9**确认(A)**无效(B)//**取消(C)**修改密码键(D)**确认修改键(E)**无效(F)voidkey_manage1(){tab_key[n]=0;n++;if(xiugaiflag==1){mima[count4]=0;count4++;}}voidkey_manage2(){tab_key[n]=1;n++;if(xiugaiflag==1){mima[count4]=1;count4++;}}voidkey_manage3(){tab_key[n]=2;n++;if(xiugaiflag==1){mima[count4]=2;count4++;}}voidkey_manage4(){tab_key[n]=3;n++;if(xiugaiflag==1){mima[count4]=3;count4++;}}voidkey_manage5(){tab_key[n]=4;n++;if(xiugaiflag==1){mima[count4]=4;count4++;}}voidkey_manage6(){tab_key[n]=5;n++;if(xiugaiflag==1){mima[count4]=5;count4++;}}voidkey_manage7(){tab_key[n]=6;n++;if(xiugaiflag==1){mima[count4]=6;count4++;}}voidkey_manage8(){tab_key[n]=7;n++;if(xiugaiflag==1){mima[count4]=7;count4++;}}voidkey_manage9(){tab_key[n]=8;n++;if(xiugaiflag==1){mima[count4]=8;count4++;}}voidkey_manage10(){tab_key[n]=9;n++;if(xiugaiflag==1){mima[count4]=9;count4++;}}//**********************************确认键**************************************************************voidkey_manage11(){enterflag=1;//确认键按下if(n==8)//只有输入8个密码后按确认才做比较mimaflag=mimacmp();elsemimaflag=0;if(enterflag==1){enterflag=0;n=0;//用FFFFFFFF清除已经输入的密码for(count3=0;count3<8;count3++){delay(5);tab_key[count3]=0x0f;}TR1=1;//打开计数器1count1=0;//定时器1由50MS累计到1S所用的计数器if(mimaflag==1){a=0;write_com(0x01);write_com(0x80);for(count3=0;count3<16;count3++){write_date(table4[count3]);//密码正确,显示RIGHT,绿灯亮delay(5);}}else{n=0;red=0;bell=0;a++;if(a==1){for(count3=0;count3<8;count3++)//ffffffff清除密码{delay(5);tab_key[count3]=0x0f;}write_com(0x01);write_com(0x80);for(count3=0;count3<16;count3++){write_date(table5[count3]);//密码错误,显示firsterror,红灯亮delay(5);}TR1=1;}if(a==2){for(count3=0;count3<8;count3++)//ffffffff清除密码{delay(5);tab_key[count3]=0x0f;}write_com(0x01);write_com(0x80);for(count3=0;count3<16;count3++){write_date(table6[count3]);//密码错误,显示SECONDERROR,红灯亮delay(5);}TR1=1;}if(a==3){for(count3=0;count3<8;count3++)//ffffffff清除密码{delay(5);tab_key[count3]=0x0f;}write_com(0x01);write_com(0x80);for(count3=0;count3<16;count3++){write_date(table7[count3]);//密码错误,显示thirderrorsee,红灯亮delay(5);}write_com(0x80+0x40);for(count3=0;count3<16;count3++){write_date(table8[count3]);//密码错误,显示UTOMORROW,红灯亮delay(5);}TR1=0;}}}}voidkey_manage12(){tab_key[n]=11;n++;//密码计数清零}//****************************************************取消键********************************************voidkey_manage13(){n=0;//密码计数清零write_com(0x80);//指针所指位置for(count3=0;count3<16;count3++){write_date(table1[count3]);//第一行显示INPUTTHEPASSPORD:delay(5);}write_com(0x80+0x40);for(count3=0;count3<16;count3++){write_date(table2[count3]);//开机显示--------delay(5);tab_key[count3]=0x0f;//用FFFFFFFF清楚已经输入的密码}}//*******************************************修改密码键**********************************voidkey_manage14(){ucharaa=0;n=0;xiugaiflag=1;write_com(0x01);write_com(0x80);for(count3=0;count3<16;count3++){write_date(table9[count3]);//显示definethepassworddelay(5);tab_key[count3]=0x0f;//用FFFFFFFF清楚已经输入的密码}write_com(0x80+0x40);for(count3=0;count3<16;count3++){write_date(table10[count3]);//显示--------delay(5);}TR0=1;}//******************************************修改密码键的确认键********************************voidkey_manage15(){n=0;enter1flag=1;if(enter1flag==1){enter1flag=0;count4=0;for(count3=0;count3<16;count3++){tab_key[count3]=0x0f;//用FFFFFFFF清楚已经输入的密码}write_com(0x01);write_com(0x80);for(count3=0;count3<16;count3++){write_date(table11[count3]);delay(100);}TR1=1;count1=0;}}voidkey_manage16(){tab_key[n]=15;n++;}//****************************************定时器1的50MS,共延时1秒*****************************voidtime_1()interrupt3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;if(count1<20){count1++;}else//计时到1S{TR1=0;count1=0;mimaflag=0;red=1;bell=1;//显示FFFFFFFFwrite_com(0x01);write_com(0x80);for(count3=0;count3<16;count3++){write_date(table1[count3]);//显示INPUTTHEPASSCODEdelay(5);}write_com(0x80+0x40);for(count3=0;count3<16;count3++){write_date(table2[count3]);//开机显示FFFFFFFFdelay(5);}}}//***********************************************定时0**********************************************voidtime_0()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(count4<8){key_scan();}else{TR0=0;count4=0;}}//初始化函数voidinit(){uchari;lcden=0;write_com(0x38);//打开显示模式设置write_com(0x0c);//打开显示,光标等等设置未零write_com(0x06);//当读或写一个字符后地址指针加一,且光标加一,当写一个字符后整频显示左移,write_com(0x01);//清零指令write_com(0x80);//指针所指位置//定时器初始化TMOD=0x11;//T0,T1工作方式1TH0=(65536-2000)/256;TL0=(65536-2000)%256;//T0初始化2MSTH1=(65536-50000)/256;TL1=(65536-50000)%256;//T1初始化50MSTR1=0;ET1=1;EA=1;TR0=0;ET0=1;count0=0;//初始没有密码输入,故为零enterflag=0;//没有确认键按下mimaflag=0;//密码正确与否键先置零red=1;//红灯不亮//************密码存入EPROM中**********************************sda=1;delay(5);scl=1;delay(5);for(i=0;i<8;i++){write_add(i,8);delay2(100);}for(i=0;i<8;i++){mima[i]=read_add(i);delay(5);}}voidmain(){rw=0;init();write_
write_date(table3[0]);
//****************************************键盘功能分配函数群开始****************************
//**0**1**2**3**
//**4**5**6**7**
//**8**9**确认(A)**无效(B)
//**取消(C)**修改密码键(D)**确认修改键(E)**无效(F)
voidkey_manage1()
tab_key[n]=0;
n++;
if(xiugaiflag==1)
mima[count4]=0;
count4++;
voidkey_manage2()
tab_key[n]=1;
mima[count4]=1;
voidkey_manage3()
tab_key[n]=2;
mima[count4]=2;
voidkey_manage4()
tab_key[n]=3;
mima[count4]=3;
voidkey_manage5()
tab_key[n]=4;
mima[count4]=4;
voidkey_manage6()
tab_key[n]=5;
mima[count4]=5;
voidkey_manage7()
tab_key[n]=6;
mima[count4]=6;
voidkey_manage8()
tab_key[n]=7;
mima[count4]=7;
voidkey_manage9()
tab_key[n]=8;
mima[count4]=8;
voidkey_manage10()
tab_key[n]=9;
mima[count4]=9;
//**********************************确认键**************************************************************
voidkey_manage11()
enterflag=1;//确认键按下
if(n==8)//只有输入8个密码后按确认才做比较
mimaflag=mimacmp();
mimaflag=0;
if(enterflag==1)
enterflag=0;
n=0;
//用FFFFFFFF清除已经输入的密码
for(count3=0;count3<8;count3++)
tab_key[count3]=0x0f;
TR1=1;//打开计数器1
count1=0;//定时器1由50MS累计到1S所用的计数器
if(mimaflag==1)
a=0;
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
write_date(table4[count3]);//密码正确,显示RIGHT,绿灯亮
red=0;
bell=0;
a++;
if(a==1)
for(count3=0;count3<8;count3++)//ffffffff清除密码
write_date(table5[count3]);//密码错误,显示firsterror,红灯亮
TR1=1;
if(a==2)
write_date(table6[count3]);//密码错误,显示SECONDERROR,红灯亮
if(a==3)
write_date(table7[count3]);//密码错误,显示thirderrorsee,红灯亮
write_com(0x80+0x40);
write_date(table8[count3]);//密码错误,显示UTOMORROW,红灯亮
TR1=0;
voidkey_manage12()
tab_key[n]=11;
n++;//密码计数清零
//****************************************************取消键********************************************
voidkey_manage13()
n=0;//密码计数清零
write_com(0x80);//指针所指位置
write_date(table1[count3]);//第一行显示INPUTTHEPASSPORD:
write_date(table2[count3]);//开机显示--------
tab_key[count3]=0x0f;//用FFFFFFFF清楚已经输入的密码
//*******************************************修改密码键**********************************
voidkey_manage14()
ucharaa=0;
xiugaiflag=1;
write_date(table9[count3]);//显示definethepassword
write_date(table10[count3]);//显示--------
TR0=1;
//******************************************修改密码键的确认键********************************
voidkey_manage15()
enter1flag=1;
if(enter1flag==1)
enter1flag=0;
count4=0;
write_date(table11[count3]);
delay(100);
count1=0;
voidkey_manage16()
tab_key[n]=15;
//****************************************定时器1的50MS,共延时1秒*****************************
voidtime_1()interrupt3
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(count1<20)
count1++;
else//计时到1S
red=1;
bell=1;
//显示FFFFFFFF
write_date(table1[count3]);//显示INPUTTHEPASSCODE
write_date(table2[count3]);//开机显示FFFFFFFF
//***********************************************定时0**********************************************
voidtime_0()interrupt1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(count4<8)
key_scan();
TR0=0;
//初始化函数
voidinit()
write_com(0x38);//打开显示模式设置
write_com(0x0c);//打开显示,光标等等设置未零
write_com(0x06);//当读或写一个字符后地址指针加一,且光标加一,当写一个字符后整频显示左移,
write_com(0x01);//清零指令
//定时器初始化
TMOD=0x11;//T0,T1工作方式1
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;//T0初始化2MS
TL1=(65536-50000)%256;//T1初始化50MS
ET1=1;
EA=1;
ET0=1;
count0=0;//初始没有密码输入,故为零
enterflag=0;//没有确认键按下
mimaflag=0;//密码正确与否键先置零
red=1;//红灯不亮
//************密码存入EPROM中**********************************
write_add(i,8);
delay2(100);
mima[i]=read_add(i);
voidmain()
{rw=0;
init();
write_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1