51单片机用矩阵按键实现密码锁,含撤销和修改密码

实现的功能

设计一个密码锁设置四字密码,通过矩阵按键输入,LCD1602显示密码。输入正确时显示OK并清0,错误时显示ERR并清0,并设置清0键。(和撤销键,手动改密码)

部分重要代码

用Password*=10实现密码左移一位,用Password+=KeyNum%10获取一位密码

代码,第一版本,实现基础功能

在这里插入图片描述
【MatrixKey.c】【MatrixKey.h】和其他模块文件参考前文
以下对【main.c】作展示

// An highlighted block
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
 
unsigned char KeyNum;//定义KeyNum承接MatrixKey
unsigned int  Password,count;//定义密码,计次
 
void main()
	{
	LCD_Init();//LCD初始化
	LCD_ShowString(1,1,"Password:"); 
	while(1)
	{
		   KeyNum=MatrixKey();
		   if(KeyNum)
		   {
		       if(KeyNum<=10)//如果s1~s10按键按下,输入密码
			   {
			   	  if(count<4)
							{	 //如果次数小于4
				  	Password*=10;		  //密码左移一位
				    Password+=KeyNum%10;//获取一位密码
				  	count++;//计次加一
				       }
				  LCD_ShowNum(2,1,Password,4);//更新显示
			   }
			   if(KeyNum==11)//如果s11键按下,为确认
			   {
			   		if(Password==1888)
					{	//如果密码等于正确密码
						LCD_ShowString(1,14,"OK "); //显示ok
						Password=0;	//密码清0
						count=0;  //计次清零
						LCD_ShowNum(2,1,Password,4); //更新显示
					}
					else 					   //否则
					{
					    LCD_ShowString(1,14,"ERR");//显示错误
					    Password=0;	//密码清0
						count=0;  //计次清零
						LCD_ShowNum(2,1,Password,4);//更新显示
					}
			   }
				 
			   if(KeyNum==12)//如果s12按键按下,为清0键
			   {
				    Password=0;	//密码清0
					count=0;  //计次清零
					LCD_ShowString(1,14,"000");//原来的ERR位置显示000
					LCD_ShowNum(2,1,Password,4); //更新显示
			   }
				 }
			 }	 
		 }

结果缺陷是正确密码需要在代码修改,正确显示OK,错误显示ERR,结果图放在拓展模块。

一些拓展,比如设定密码锁撤销键,手动改密码

设定S13为撤销前一位键

// An highlighted block
    if(KeyNum==13)//如果s13按键按下,为撤销键
			   {
				    Password/=10;	//密码右移一位
					LCD_ShowNum(2,1,Password,4);//更新显示
					 if (count>0)
					 {count--;}//收回次数

终版,实现手动改密码,S14为修改键,S15为确认修改键

把上文基础版的main也改进了,主要用到了很多定义变量来存储修改的密码、修改时输入的次数,以及注意整体写代码时候分成两个模式并分块,即Changemode为1和0,main.c文件如下

// An highlighted block
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"

 
//unsigned char KeyNum;//定义KeyNum承接MatrixKey
//unsigned int  Password,count,OKnumber,OKnumberI;//定义密码,计次,正确密码,预定密码
  #define  ui unsigned int//与以上两句重复

 void main()
	{
	 ui KeyNum;//矩阵键值,定义KeyNum承接MatrixKey
   ui Password;//密码
   ui count;//计次
   ui OKnumber=1888;//定义初始正确密码
   ui OKnumberI;//预定密码
	 ui Changecount;//修改密码的输入次数
	 ui Changemode=0;//切换模式,0为普通模式,1为修改模式
	 LCD_Init();//LCD初始化
	 LCD_ShowString(1,1,"Password:"); //LCD第一排显示"Password:"
	while(1)
	{
		KeyNum=MatrixKey();
		   if(KeyNum)
		   {
				 if (Changemode==0)//普通模式
				 {
		       if(KeyNum<=10)//如果s1~s10按键按下,输入密码
			   {
			   	  if(count<4)
							{	 //如果次数小于4
				  	Password*=10;		  //密码左移一位
				    Password+=KeyNum%10;//获取一位密码
				  	count++;//计次加一
				       }
				  LCD_ShowNum(2,1,Password,4);//更新显示
			   }
			   
				 
				 if(KeyNum==11)//如果s11键按下,为确认键
			   {
			   		if(Password==OKnumber)//如果密码等于正确密码
					{	
						LCD_ShowString(1,14,"OK "); //显示OK正确
						Password=0;	//密码清0
						count=0;  //计次清零
						LCD_ShowNum(2,1,Password,4); //更新显示
					}
					   else 					   //否则
					    {
					    LCD_ShowString(1,14,"ERR");//显示ERR错误
					    Password=0;	//密码清0
						  count=0;  //计次清零
						  LCD_ShowNum(2,1,Password,4);//更新显示
					     }
			   }
				 
				 
			   if(KeyNum==12)//如果s12按键按下,为取消键
			   {
				    Password=0;	//密码清0
					  count=0;  //计次清零
					 LCD_ShowString(1,14,"000");//第一排右边显示000表示取消
					LCD_ShowNum(2,1,Password,4); //更新显示
			   }
				 
				 
				 if(KeyNum==13)//如果s13按键按下,为撤销键
			   {
				    Password/=10;	//密码右移一位
					 LCD_ShowString(1,14,"111");//第一排右边显示表示撤销
					LCD_ShowNum(2,1,Password,4);//更新显示
					 if (count>0)
					 {count--;}
				 }
			 
				 
				if(KeyNum==14)//如果s14按键按下,修改密码
				 {  
					
					OKnumberI=0;					//输入预定密码清0
					Changecount=0;
					Changemode=1;
				 }
			 }//普通模式结束
				 
			 else if(Changemode==1)//进入修改模式
			 {
				 
					LCD_ShowNum(2,1,OKnumberI,4);
					LCD_ShowString(1,14,"EXG");//第一排右边显示EXG表示正在修改
		       if(KeyNum<=10)//如果s1~s10按键按下,输入设定的密码
			   {
			   	  if(Changecount<4)
							{	 //如果次数小于4
				  	OKnumberI*=10;		  //密码左移一位
				    OKnumberI+=KeyNum%10;//获取一位密码
				  	Changecount++;//计次加一
				       }
				  LCD_ShowNum(2,1,OKnumberI,4);//更新显示预定密码
					
			   }
			  
			 if(KeyNum==15)//如果s15按键按下且计次为4,确定修改的密码
			 {
			  OKnumber=OKnumberI;//正确密码等于预定密码
			  LCD_ShowString(1,14,"SUC");//第一排右边显示SUC表示确定修改
				Password=0;	//密码清0
				count=0;  //计次清零
				 Changemode=0;
		   LCD_ShowNum(2,1,Password,4);//更新显示
			 }
				
				 }}}}

结果:
修改密码为1234
在这里插入图片描述
修改确认
在这里插入图片描述
再次输入1234按确认键显示OK
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值