提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
一、仿真图
二、步骤
1.矩阵按键
2.串口配置
3.串口接收数据判断
4.修改密码+密码输入
总结
前言
LCD1602+矩阵按键+串口上锁解锁+修改密码 提供参考
一、仿真图
二、步骤
1.矩阵按键
代码如下:
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P7=0xFF;
P70=0;
if(P74==0){Delay(20);while(P74==0);Delay(20);KeyNumber=1;}
if(P75==0){Delay(20);while(P75==0);Delay(20);KeyNumber=5;}
if(P76==0){Delay(20);while(P76==0);Delay(20);KeyNumber=9;}
if(P77==0){Delay(20);while(P77==0);Delay(20);KeyNumber=13;}
P7=0xFF;
P71=0;
if(P74==0){Delay(20);while(P74==0);Delay(20);KeyNumber=2;}
if(P75==0){Delay(20);while(P75==0);Delay(20);KeyNumber=6;}
if(P76==0){Delay(20);while(P76==0);Delay(20);KeyNumber=10;}
if(P77==0){Delay(20);while(P77==0);Delay(20);KeyNumber=14;}
P7=0xFF;
P72=0;
if(P74==0){Delay(20);while(P74==0);Delay(20);KeyNumber=3;}
if(P75==0){Delay(20);while(P75==0);Delay(20);KeyNumber=7;}
if(P76==0){Delay(20);while(P76==0);Delay(20);KeyNumber=11;}
if(P77==0){Delay(20);while(P77==0);Delay(20);KeyNumber=15;}
P7=0xFF;
P73=0;
if(P74==0){Delay(20);while(P74==0);Delay(20);KeyNumber=4;}
if(P75==0){Delay(20);while(P75==0);Delay(20);KeyNumber=8;}
if(P76==0){Delay(20);while(P76==0);Delay(20);KeyNumber=12;}
if(P77==0){Delay(20);while(P77==0);Delay(20);KeyNumber=16;}
return KeyNumber;
}
2.串口配置
代码如下(示例):文章来源:https://www.toymoban.com/news/detail-551199.html
/**
* @brief 串口初始化,4800bps@12.000MHz
* @param 无
* @retval 无
*/
void Uart_Init(void)
{
SCON = 0X50;
AUXR |= 0X40;
AUXR &= 0XFE;
TMOD &= 0X0F;
TL1 = 0XE0;
TH1 = 0XFE;
ET1 = 0;
TR1 = 1;
ES = 1;
EA = 1;
}
/**
* @brief 串口发送一个字节数据
* @param Byte 要发送的一个字节数据
* @retval 无
*/
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
3.串口接收数据判断
这里把判断拿出来不放在串口中断中是因为LCD显示函数放在里面会造成函数重进入,具体是什么原因网上找了会资料也没解决所以我就把判断给拿出来单独弄了一个函数。文章来源地址https://www.toymoban.com/news/detail-551199.html
void Uart1_isr(void) interrupt 4
{
if(RI)
{
RI = 0;
LCD_clar();//清屏
temp = SBUF;
}
}
/**
* @brief 串口判断函数
* @param 上锁:0x01 解锁:0x02
* @retval
*/
void Uart_Control()
{
if(temp == 0x01)//串口值判断
{
temp = 0;
LCD_ShowString(1,1,"Locking!");//锁定
flag = 1;
}
if(temp == 0x02)//串口值判断
{
temp = 0;
LCD_ShowString(1,1,"Password:");//解锁
flag = 0;
}
}
4.修改密码+密码输入
if(KeyNum)
{
if(flag == 0)
{
if(KeyNum<=10) //如果S1~S10按键按下,输入密码
{
if(Count<4) //如果输入次数小于4
{
Password*=10; //密码左移一位
Password+=KeyNum%10; //获取一位密码
Count++; //计次加一
Password_Data++;
}
LCD_ShowString(2,Password_Data,"*"); //更新显示
}
if(KeyNum==11) //如果S11按键按下,确认
{
if( Change_flag == 0) //没修改密码之前此标志位一直为0 修改密码之后此标志位为1 进入另外一个判断
{
if(Password==2345) //如果密码等于正确密码
{
LCD_ShowString(1,14,"OK "); //显示OK
Password=0; //密码清零
Count=0; //计次清零
Password_Data=0;
LCD1602_Clear_2LINE(); //清除第2行
for(i = 0;i < 1; i++) //蜂鸣器
{
P22 = 0;
Delay(500);
P22 = 1;
Delay(1000);
}
}
else //否则
{
LCD_ShowString(1,14,"ERR"); //显示ERR
Password=0; //密码清零
Count=0; //计次清零
LCD1602_Clear_2LINE(); //清除第2行
Password_Data=0;
for(i = 0;i < 3; i++)//蜂鸣器
{
P22 = 0;
Delay(500);
P22 = 1;
Delay(1000);
}
}
}
if( Change_flag == 1 ) //修改密码之后为1 进入此判断
{
if(Password==Password1) //如果密码等于正确密码
{
LCD_ShowString(1,14,"OK "); //显示OK
Password=0; //密码清零
Count=0; //计次清零
Password_Data=0;
LCD1602_Clear_2LINE(); //清除第2行
for(i = 0;i < 1; i++) //蜂鸣器
{
P22 = 0;
Delay(500);
P22 = 1;
Delay(1000);
}
}
else //否则
{
LCD_ShowString(1,14,"ERR"); //显示ERR
Password=0; //密码清零
Count=0; //计次清零
LCD1602_Clear_2LINE(); //清除第2行
Password_Data=0;
for(i = 0;i < 3; i++)//蜂鸣器
{
P22 = 0;
Delay(500);
P22 = 1;
Delay(1000);
}
}
}
}
if(KeyNum==12) //如果S12按键按下,取消
{
Password=0; //密码清零
Count=0; //计次清零
Password_Data=0;
LCD1602_Clear_2LINE(); //清除第2行
}
if(KeyNum==14) //修改密码按键
{
LCD_clar();//清屏
Password1=0;//新密码清除
flag = 2; //修改密码标志位
}
}
if(flag == 2) //修改密码标志位判断
{
LCD_ShowString(1,1,"Change Password:"); //更新显示
if(KeyNum<=10) //如果S1~S10按键按下,输入密码
{
if(Count1<4) //如果输入次数小于4
{
Password1*=10; //密码左移一位
Password1+=KeyNum%10; //获取一位密码
Count1++; //计次加一
Password_Data++;//清除*号显示位置
}
LCD_ShowString(2,Password_Data,"*"); //更新显示
}
if(KeyNum==11) //如果S11按键按下,确认
{
LCD_clar();//清屏
Count1 = 0; //输入密码位数清除
flag = 0; //输入密码标志位
Password_Data = 0; //清除*号显示位置
Change_flag = 1; //更新密码判断标志位
LCD_ShowString(1,1,"Password:");//输入密码界面
}
if(KeyNum==12) //如果S12按键按下,取消
{
Password1=0; //密码清零
Count1=0; //计次清零
Password_Data=0;//清除*号显示位置
LCD1602_Clear_2LINE(); //清除第2行
}
}
if(KeyNum==13) //上锁解锁
{
flag = !flag; //上锁解锁标志位
if(flag==1)
{
LCD_clar();//清屏
LCD_ShowString(1,1,"Locking!");//锁定
}
else
{
LCD_clar();//清屏
LCD_ShowString(1,1,"Password:");//解锁
}
}
}
到了这里,关于基于51单片机密码锁(修改密码,串口上锁解锁,仿真)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!