IMG_20181114_185612.jpg (172.39 KB, 下載次數: 64)
下載附件
2018-11-14 21:40 上傳
代碼:
//LCD12864+4x4鍵盤 密碼開門
//輸入四位字符數字密碼,按 # 鍵結束,按 * 鍵重來
#include <Wire.h>
#include <Keypad.h>
#include "LCD12864RSPI.h"
#define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
//12864顯示屏三腳 PIN 3 8 9
//漢字顯示
unsigned char show0[]={0xB5, 0xE7,0xD7, 0xD3,0xC3, 0xC5,0xBD, 0xFB,0xCF, 0xB5,0xCD, 0xB3}; //電子門禁系統
unsigned char show1[]={0xC7, 0xEB,0xCA, 0xE4,0xC8, 0xEB,0xCB, 0xC4,0xCE, 0xBB,0xC3, 0xDC,0xC2, 0xEB}; //請輸入四位密碼
unsigned char show2[]={ 0xC3, 0xDC,0xC2, 0xEB,0x3A, 0x00}; //密碼:
unsigned char show3[]={0xBB, 0xB6,0xD3, 0xAD,0xBB, 0xD8,0xBC, 0xD2}; //歡迎回家
unsigned char show4[]={0xC3, 0xDC,0xC2, 0xEB,0xB4, 0xED,0xCE, 0xF3}; //密碼錯誤
unsigned char show5[]={0xCE, 0xBB,0xCA, 0xFD,0xB2, 0xBB,0xB6, 0xD4,0xB0, 0xB4,0x2A, 0x00,0xBB, 0xD6,0xB8, 0xB4}; //位數不對按*恢復
//4x4鍵盤設置
const byte ROWS = 4; // 4行
const byte COLS = 4; // 4列
//鍵盤字符定義
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
//鍵盤連接腳.
byte rowPins[ROWS] = {12,11,7,6}; //行Pin腳
byte colPins[COLS] = {5,4,10,2}; //列Pin腳
//生成鍵盤
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
String passcode = "1234"; // 預先設置的密碼
String inputCode = ""; // 暫存用戶的按鍵字串
bool acceptKey = true; // 代表是否接受用戶按鍵輸入的變數,預設為「接受」
// 顯示「歡迎回家」后,重設LCD顯示文字和輸入狀態。
void resetLocker() {
LCDA.CLEAR();//清屏
LCDA.DisplayString(1,0,show1,AR_SIZE(show1)); //顯示"請輸入四位密碼"
LCDA.DisplayString(2,0,show2,AR_SIZE(show2)); //顯示"密碼: "
acceptKey = true;
inputCode = "";
}
// 比對用戶輸入的密碼
void checkPinCode() {
acceptKey = false; // 暫時不接受用戶按鍵輸入
// 比對密碼
if (inputCode == passcode) {
LCDA.DisplayString(3,2,show3,AR_SIZE(show3)); //顯示"歡迎回家"
} else {
LCDA.DisplayString(3,2,show4,AR_SIZE(show4));//顯示"密碼錯誤"
}
delay(5000); //延時5秒
resetLocker(); // 重設LCD顯示文字和輸入狀態
}
void setup() {
Serial.begin(9600);
LCDA.Initialise(); // 屏幕初始化
delay(100);
LCDA.CLEAR();//清屏
delay(100);
LCDA.DisplayString(0,1,show0,AR_SIZE(show0));//顯示"電子門禁系統"
delay(100);
resetLocker();
}
void loop() {
LCDA.DisplayString(0,1,show0,AR_SIZE(show0));//顯示"電子門禁系統"
delay(100);
char key = keypad.getKey(); // 若目前接受用戶輸入,而且有新的字元輸入…
if (acceptKey && key != NO_KEY) {
if (key == '*') { // 清除畫面
LCDA.DisplayString(2,3," ",AR_SIZE(" ")); //顯示" "
LCDA.DisplayString(3,0," ",AR_SIZE(" ")); //顯示" "
inputCode = "";
} else if (key == '#') { // 比對輸入密碼
checkPinCode();
} else {
inputCode += key; // 儲存用戶的按鍵字元
if(inputCode.length()==1){ //長度為1位
LCDA.DisplayString(2,3,"*",AR_SIZE("*"));//顯示"*"
}
if(inputCode.length()==2){ //長度為2位
LCDA.DisplayString(2,4,"*",AR_SIZE("*"));//顯示"*"
}
if(inputCode.length()==3){
LCDA.DisplayString(2,5,"*",AR_SIZE("*"));//顯示"*"
}
if(inputCode.length()==4){
LCDA.DisplayString(2,6,"*",AR_SIZE("*"));//顯示"*"
}
if(inputCode.length()==5){
LCDA.DisplayString(2,3," ",AR_SIZE(" "));//顯示" "
LCDA.DisplayString(3,0,show5,AR_SIZE(show5)); //顯示"位數不對按*恢復"
}
}
}
}
|