标题:
单片机+LCD1602+16点键盘电子密码锁设计
[打印本页]
作者:
liu_111011
时间:
2020-1-14 20:56
标题:
单片机+LCD1602+16点键盘电子密码锁设计
基于51单片机
51hei.png
(16.62 KB, 下载次数: 14)
下载附件
2020-1-15 00:55 上传
单片机源程序如下:
#include <intrins.h>
#include <reg52.h>
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
uchar temp,num,flag,r;
/******************************/
//显示字符串定义
uchar code table1[]="You are welcome";
uchar code table3[]="******";
uchar code table4[]="code is wrong!";
uchar code table5[]="you are right!";
uchar code table6[]="the second time!";
uchar code table7[]="the last time!";
uchar code table8[]="Input new password:";
uchar code table9[]="Modify right!!!";
uchar code table10[]="password:";
uchar code table12[]=" calling....";
uchar code table13[]=" ";
uchar code table14[]="Input again:";
uchar code table15[]="Modify error!!!";
/******************************/
uchar init_password[6]={1,2,3,4,5,6};//定义原始密码存放的数组
uchar password[6]={0};//定义输入密码存放的数组
/******************************/
//1602位定义
sbit lcdrs=P2^0;// 数据/指令
sbit lcdrw=P2^1;// 读/写
sbit lcden=P2^2;// 使能端
/******************************/
sbit beep=P3^7;
/******************************/
void delay(uint z);
void init();
void write_com(uchar com);
void write_data(uchar dat1);
void keyscan();
void mima();
void mima1();
void delete();
/******************************/
//1602初始化设置
void init()
{
lcden=0;//使能
write_com(0x38);//显示模式设置
write_com(0x0e);//显示开关设置(显示有效、光标显示有效、光标闪烁无效)?
write_com(0x06);//光标移动设置(读或写一个字符后地址指针加一,光标加一,写一个字符串后,整屏显示不移动)
write_com(0x01);//显示清屏
write_com(0x80);//读忙
}
/******************************/
//向1602写指令
void write_com(uchar com)
{
lcdrs=0;//指令
lcdrw=0;//写
P0=com;//将指令代码送到P0口,通过数据线给1602
delay(5);
lcden=1;
delay(5);
lcden=0;//下降沿使能
}
/******************************/
//向1602写数据
void write_data(uchar dat1)
{
lcdrs=1;//数据
lcdrw=0;//写
P0=dat1;
delay(5);
lcden=1;
delay(5);
lcden=0;//下降沿使能
}
/******************************/
//延时子程序
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******************************/
//按键扫描子程序
void keyscan()
{
P1=0x7f;
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
delay(5);
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P1;//按键消抖
switch(temp)
{
case 0x7e:num=0;flag=1;//按键0被按下,且0为有效的按键
break;
case 0x7d:num=1;flag=1;//按键1被按下,且1为有效的按键
break;
case 0x7b:num=2;flag=1;//按键2被按下,且2为有效的按键
break;
case 0x77:num=3;flag=1;//按键3被按下,且3为有效的按键
break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xbf;
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
delay(5);
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P1;//消抖
switch(temp)
{
case 0xbe:num=4;flag=1;//按键4被按下,且4为有效的按键
break;
case 0xbd:num=5;flag=1;//按键5被按下,且5为有效的按键
break;
case 0xbb:num=6;flag=1;//按键6被按下,且6为有效的按键
break;
case 0xb7:num=7;flag=1;//按键7被按下,且7为有效的按键
break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xdf;
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
delay(5);
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xde:num=8;flag=1;//按键8被按下,且8为有效的按键
break;
case 0xdd:num=9;flag=1;//按键9被按下,且9为有效的按键
break;
case 0xdb:num=10;//按键10被按下,且该键无效
break;
case 0xd7:num=11;//按键11被按下,且该键无效
break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
P1=0xef;
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
delay(5);
temp=P1;
temp=temp&0x0f;
while(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0xee:num=12;//按键12被按下,且该键无效
break;
case 0xed:num=13;flag=1;//按键13,即修改密码键被按下,且13为有效的按键
break;
case 0xeb:num=14;flag=1;//按键14,即退格键被按下,且14为有效的按键
break;
case 0xe7:num=15;flag=1;//按键15,即输入密码键被按下,且15为有效的按键
break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
}
}
/******************************/
void main()
{
uchar m=0,w=0;
init();//1602初始化
for(r=0;r<15;r++)
{
delay(5);
write_data(table1[r]);
}//显示欢迎界面
write_com(0x0c);//显示,关光标
do
{
keyscan();
}
while(num!=15);//在输入密码键按下之前一直进行键盘扫描
mima();//子程序调用
while((password[m]==init_password[m])&m<6)
{
m++;
}
if(m>=6)
{
mima1();//子程序调用
}
else
{
m=0;
write_com(0x80+0x40);//显示从第二行开始
for(r=0;r<14;r++)
{
delay(20);
write_data(table4[r]);
}//显示密码错误
delay(2000);//延时
init();//1602初始化
for(r=0;r<16;r++)
{
delay(20);
write_data(table6[r]);
}//显示第二次输入
delay(2000);
mima();
while((password[m]==init_password[m])&m<6 )
{
m++;
}
if(m>=6)
{
mima1();
}
else
{
m=0;
write_com(0x80+0x40);
for(r=0;r<14;r++)
{
delay(20);
write_data(table4[r]);
}//显示密码错误
delay(2000);
init();//1602初始化
for(r=0;r<14;r++)
{
delay(20);
write_data(table7[r]);
}//最后一次机会
delay(2000);
mima();
while((password[m]==init_password[m])&m<6)
{
m++;
}
if(m>=6)
{
mima1();
}
else
{
init();
write_com(0x80+0x40);
for(r=0;r<14;r++)
{
delay(20);
write_data(table12[r]);
}//显示报警
write_com(0x0c);
while(1)
{
delay(1);
beep=~beep;
}//喇叭发出警报音
}
}
}
}
void mima()
{
uchar w=0;
init();
for(r=0;r<9;r++)
{
delay(20);
write_data(table10[r]);
}//显示请输入密码
do
{
flag=0;
keyscan();
write_com(0x80+9+w);//接着password:后第w位处显示
if(flag==1&&num<=9)//输入的是0—9的情况下
{
password[w]=num;//将输入的数存入数组的相应位
write_data(table3[w]);//1602显示*
w++;//位数加一
if(w==6)
write_com(0x0c);//六位都输入后,显示从屏幕左方开始
}
if(flag==1&&num==14)//如果退格键被按下
{
w--;//位数减一
if(w==255)
w=w+1;//如果位数变成-1,即255,则加一,变成0
write_com(0x80+9+w);//从字符串后第w位处开始显示
write_data(table13[w+1]);//显示*
if(flag==1&&num<=9)
{
password[w]=num;
write_data(table3[w]);
}
}
} while(w<=5);
}
void mima1()
{
uchar f=0,n=0,d=0;
write_com(0x80+0x40); //从第二行开始显示
for(r=0;r<14;r++)
{
delay(20);
write_data(table5[r]);//显示密码正确
}
delay(2000);
do
{
num=16;
keyscan();
}while(num!=13);//在改密码键按下前一直扫描键盘
if(flag==1&&num==13)
{
init();//显示初始化
for(r=0;r<15;r++)
{
delay(20);
write_data(table8[r]);//显示输入新密码
}
write_com(0x0c);//显示,关光标
write_com(0x80+0x40+n);//从第二行开始显示
write_com(0x0e);//显示开关初始化
}
do{
num=16;
keyscan();
write_com(0x80+0x40+n);
if(flag==1&&num<=9)
{
init_password[n]=num;//将输入值存入新的密码数组的相应位
write_data(table3[n]);//显示*
n++;
if(n==6)
write_com(0x0c);
}
if(flag==1&&num==14)
{
n--;//如果退格键按下,左移一位
if(n==255)
n=n+1;//如果n减为负值则从0开始
write_com(0x80+0x40+n);//从相应位置开始显示
write_data(table13[n]);//显示空字符
if(flag==1&&num<=9)
{
password[n]=num;
write_data(table3[n]);
}
}
}
while(n<=5);
init();
for(r=0;r<12;r++)
{
delay(20);
write_data(table14[r]);
}//显示重新输入
do
{
flag=0;
keyscan();
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
LCD1602 16点键盘.zip
(44.44 KB, 下载次数: 31)
2020-1-14 20:56 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1