实现的功能
设计一个密码锁设置四字密码,通过矩阵按键输入,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