4*4键盘密码锁

继上次关于4*4矩阵式键盘学习之后,于是乎,我就想为何不将他制作成一个简单的类似于密码锁的小玩意。

首先,我们先构思这个密码锁应该有什么功能,当然最重要的是,他能够输入数字,其次我们得要一个初始密码,如果输入值与初始密码相匹配,打印出“welcome”,如果不匹配则输入清零并且提示输入错误,总共有四次错误机会,如果超过四次,则需要等待30秒直到显示“try again"时才能再次输入。

首先我们需要准备的材料有:

  1. 4*4矩阵式键盘
  2. Arduino 板
  3. lcd1602液晶显示器

对于初始密码的设定,我们需要用到EEPROM。在这里,简单介绍一下EEPROM

EEPROM(带电可擦写可编程读写存储器)是用户可更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。EEPROM是一种特殊形式的闪存,其应用通常是个人电脑中的电压来擦写和重编程

electrically erasable programmable read only memory(EEPROM)
电气可拭除可编程只读存储器

lcd1602的接线图忘记了的可以看这个
在这里插入图片描述

之后就是我们的原密码代码部分,当然,大家可以按照自己的喜好随意更改。

#include <EEPROM.h>
void setup() {
	EEPROM.write(0,0);
  	EEPROM.write(1,3);
	EEPROM.write(2,0);
  	EEPROM.write(3,6);
  }
  void loop() {
  }

码先烧录到 Arduino中为0306,之后我们就能开始编写密码锁。(烧录完初始密码后,再烧录密码锁程序并不会清除原来的密码)

#include <EEPROM.h>
#include <LiquidCrystal.h>
#include <Key.h>
#include <Keypad.h>
LiquidCrystal mylcd(0, 1, 9, 10, 11, 12);
const byte ROWS = 4;
const byte COLS = 4;
int a;
char keys[ROWS][COLS] = {
    {'1', '2', '3', 'A'},
    {'4', '5', '6', 'B'},
    {'7', '8', '9', 'C'},
    {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8, 13};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
String opw = "";                //oldpassword
String npw = "";             //这里可以在修改密码使用到
int falsh = 0;                   //记录输入错误次数
String input = "";            //输入
void setup() 
{
	Serial.begin(9600);
	mylcd.begin(16, 2);
	for (int i = 0; i < 4; i++)
	{
   		 opw += EEPROM.read(i);        //读取之前烧录进去的密码
  	  }
	Serial.println("The oldpassword is ");   //串口打印出初始密码
	Serial.println(opw);
	delay (5000);
	Serial.flush();             //清除串口的数据
	mylcd.setCursor(0, 0);
	mylcd.print("input");
}
void loop()
 {
 	char key = keypad.getKey();
 	if (key)               //当有按键按下时
 	{
 	 	input += key;
		mylcd.setCursor(a, 1);
		mylcd.print("*");
		Serial.println("input=");
		Serial.println(input);
		if (a > 3)
		{
			a = 0;        //当输入超过四位时,清零
		}
		if (input == opw)     //当密码匹配
		{
			falsh = 0;   //错误次数清零
			Serial.flush(); 
			Serial.println("welcome");
			delay (500);
			mylcd.clear();
			mylcd.setCursor(0, 1);
			mylcd.print("welcome");
			input = "";
			mylcd.clear();	
			mylcd.setCursor(0, 0);
			mylcd.print("input");
			}
		 else if (input.length() == 4 && input != opw)
		 {
		 	 Serial.flush(); 
		 	 Serial.println("wrong");
		 	 mylcd.clear();
		 	 mylcd.setCursor(0, 1);
		 	 mylcd.print("wrong");
		 	 input = "";
		 	 falsh ++;
		 	 Serial.print("input wrong ");
		 	 Serial.print(falsh);
		 	 Serial.println("times");
			 delay(500);
			 Serial.flush(); 
			 Serial.print("please input again:");
			 mylcd.clear();
			 mylcd.setCursor(0, 1);
			 mylcd.print("again");
			 if (falsh > 3)
			 {
			 	mylcd.clear();
				mylcd.setCursor(0, 1);
				mylcd.print("wait 30s");
				Serial.println("you have already tried four times");
				Serial.println("please try again after 30s");
				delay(30000);
				Serial.println("try again");
				falsh = 0;
				input = "";
				}
			}
		}
    

串口经过实验可以完成他的功能,但是lcd1602 的部分,大家需按照自己的需求更改,在这里我的1602一直显示乱码,其原因还未找出,如果是程序的问题还请大家指出。

  • 10
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值