正在利用空闲的时间制作一个51单片机控制,LCD1602显示,矩阵按键的电子密码锁。制作时间可能会很多,会不定期记录制作过程。(注:不作任何指导和参考,仅个人记录)
于2023年8月2日之前已经开始制作一部分:1、已完成LCD1602屏幕成功显示;2、矩阵按键成功运行;3、OK键能控制屏幕翻页。
下一步完成矩阵按键的密码输入,密码输入函数的建立。
目前问题1:矩阵按键数值输入到LCD屏幕显示位置错位;
预期效果为:输入面后,短暂显示,再以*隐藏。即整个输入密码过程。
2023/8/3,周四晚21.00:
昨日问题1解决,完成密码输入及删除。
插入完整输入密码函数。
void Input_PW() //输入密码子程序
{
if(KeyValue!=0x7e) //
{
if(DisFlag == 1) //1-9按下标志
{
DisFlag = 0;
if(Password_num<6) //
{
// Input_Password[Password_num]=KeyNumber; //将密码存起来
LCDLine2[Password_num+5] = KeyNumber + 0x30; //把密码显示500ms
LCD_Display();
Delay10ms(10); //延时一下
LCDLine2[Password_num+5] = '*'; //将输入的密码以 “*” 隐藏
Password_num++; //密码位数 +1
}
}
else
{
if(Delete_Flag==1) //删除标志 将密码进行删除或者回退
{
Delete_Flag=0;
Password_num--; //密码位数 -1
if((Password_num>=0)&&(Password_num<7))
{
Input_Password[Password_num] = 0;
LCDLine2[Password_num+5] = ' ';
}
else if(Password_num == -1)
//没有密码时 ,再按一次删除(返回)键,回到1屏 或6屏
{
if(Screen_No == 2)
{
WriteCmd(0x01); //清屏
Screen_No=1;
}
}
}
}
}
else Input_suc_flag=1;
}
代码的精简读一直是我的痛点 ,缺乏一定的逻辑性。
2023年8月4日 周五晚22:00:
修改密码输入函数,并插入密码校对函数(密码校对函数分为正常输入密码时校对和修改密码时前后密码的校对,目前仅使用0),如下:
void PasswordCompare(bit x) //密码校对子函数 将输入的密码与当前正确密码进行比对
{
unsigned char i,j=0;
if(x==0) //0 正常的面校对
{
for(i=0;i<Password_Length;i++)
{
if(Password[i]!=Input_Password[i])
{
result_flag=0; break; //密码错误
}
else result_flag=1; //密码一致
Input_Password[i]=0;
}
}
else if(x==1) //1 修改密码时 ,前后密码的校对
{
for(i=0;i<6;i++)
{
if(Password_one[i]!=Input_Password[i])
{
result_flag=0; break; //密码错误
}
else result_flag=1; //密码一致
}
}
}
目前基本完成密码的输入和删除、密码校对。还需设计在输入正确密码后的UI页面设计,虽然就两行字。以及输入正确密码后,定时器完成页面跳转。
电子密码锁LCD1602版, 一切正常执行。
2023年8月7日 星期一晚上22:00
添加 大返回按键。
2023年8月10日星期四晚上22:18
无题(一) ——ChatGPT
月明星稀夜深沉, 枕边鼾声似雷霆。 寤寐难安梦断绝, 心怀愁苦无止宁。
无奈之下出门行, 离舍背井求宁静。 陌路街头寻避隐, 避开鼾声觅宿舍。
无题(二) ——ChatGPT
皎月当空照夜静,鼾声又至梦难成。忧心忡忡睡不得,情绪郁结倍困扰。
寂夜无眠思纷乱,打鼾声响似奇冤。床前明月似无辜,只我独受睡意攀。
盼晓星沉睡时分,鼾声终止入梦心。锁住烦忧这一刻,寻觅宁静恢复真。
2023年8月13日星期日晚上21:59
确认显示效果 ,并添加第五屏“已开锁”页面。
添加:输入错误密码超过3次后,并锁定。
2023年8月15日星期二晚22:05:36
添加返回锁定倒计时和输入密码界面的无操作倒计时。
2023年8月16日 星期三晚21:00
添加继电器、指示灯等外围电路。开锁指示灯工作,继电器、关锁指示灯、报警指示灯还需要进一步调试。
2023年8月17日 星期四晚21:39
调试开锁电路。
门锁状态。
门开状态。
目前还差的功能:
1、修改密码程序
2、AT24C02掉电存储
3、报警程序
2023年8月22日 星期二晚2234
简单添加修改密码函数:仅加入7,8屏显示。
2023年10月20日 星期五晚22:25
(时隔2月,愁绪万千,贵在坚持啊。书到用时方恨少,一定得抓住机会。)
修改密码程序,能在输入正确密码后,长按确认键进入修改密码程序。
后续继续完成二次输入密码确认。
2023年10月30日 星期一 晚22:34
完善修改密码程序,二次输入密码进行确认,若正确,修改密码成功,否则重新输入新的密码。
else if((Screen_No == 8)&&(Password_num == 6)) //第8屏 第二次输入密码
{
Flash_LCD = 1;
PasswordCompare(1);
if(result_flag == 1)
{
if(Input_suc_flag == 1)
{
Input_suc_flag = 0;
// At24c02Write(0,Load_first_flag);
Delay10ms(20);
// At24c02Write(1,6);
Delay10ms(20);
for(j=0;j<6;j++)
{
Password[j]=Input_Password[j]; //读取密码
// At24c02Write(j + 2,Input_Password[j]); //保存密码至EEPROM
Delay10ms(20);
}
}
// sound2(2,500,1); //蜂鸣器
Lock_Led = 0;
Door_Open = 1;
Screen_No = 9;
Time1 = 15;
}
else
{
Flash_LCD = 1;
Screen_No = 7;
// Password_flag = 1;
Password_num = 0;
}
}
下一步是添加AT24C02掉电存储功能。
2023年10月31日周二晚22:19
添加掉电存储,如下。将正确的密码存储在AT24C02。
if(result_flag==1)
{
if(Input_suc_flag==1)
{
Input_suc_flag=0;
At24c02Write(0,Load_first_flag);
Delay10ms(20);
At24c02Write(1,6);
Delay10ms(20);
for(j=0;j<6;j++)
{
Password[j]=Input_Password[j]; //读取密码
At24c02Write(j+2,Input_Password[j]); //保存密码至EEPROM
Delay10ms(20);
}
}
}
添加报警程序,如下。会在输入错误密码时短暂报警,输入3次错误密码时长时报警。在仿真和硬件电路中均以LED代替蜂鸣器。
void sound2(unsigned char flag,unsigned int i,unsigned char j) //i 时间长短 , j 次数 ,flag 模式
{
if(flag==1)
{
while(j)
{
while(i--)
BEEP=0;
LED3=0;
Delay10ms(100);
BEEP=1;
LED3=1;
j--;
}
}
else if(flag==2)
{
while(j)
{
while(i--)
BEEP=0;
Delay10ms(600);
BEEP=1;
j--;
}
}
}
至此,历时近2个月时间完成基于单片机的电子密码锁LCD版,仅完成代码及Proteus仿真,并且均有待于完善和优化。代码总占code 3.08K,较于OLED版的7.87k,是相当节省存储空间。同时也因为OLED版,许多的程序都是直接copy。但是完整程度在80%,缺少蜂鸣器以及原理图,也包括硬件部分的debug次数较少,还存在些许bug。
THE END!!