我用mega2560尝试制作一个密码锁,核心就是矩阵键盘和lcd1601。现在遇到的问题是我在仿真平台上运行得非常流畅,但是烧录到单片机里运行后很慢。包括显示和按键,需要很久才能做出反应。
下面是我的代码,因为是我自己写的,所以很大可能是代码太长,所以时间耗费大?但是仿真运行丝毫没有问题
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h> //舵机类库
#define PIN_TRIG 2
#define PIN_ECHO 3
Servo myservo; //创建对象myservo
int pos = 0; //初始化舵机角度
LiquidCrystal_I2C lcd(0x27,16,2);
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {8, 10, 11, 12}; //定义按键行引脚
byte colPins[COLS] = {7, 6, 5, 4}; //定义按键列引脚
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
char password[6]={'1','2','3','4','5','6'};//预设密码
char password1[6]={};//密码输入
char Key1,Key2,Key3,Key4,Key5,Key6,Key7;//密码位数
int a=1,b=1,c=1,d=1,e=1,f=1,g=1,h=0;//密码输入判定
int warning=0;//输入错误次数
int open=0;//密码正确指令
long distance;
void setup(){
myservo.attach(9);
myservo.write(pos);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("PASSWORD:");
pinMode(13, OUTPUT);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
}
void loop(){
sr04();
input();
buzzer();
}
//sr04检测函数
void sr04(){
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
distance = pulseIn(PIN_ECHO, HIGH)/58;
}
//密码输入函数
void input(){
char Key = customKeypad.getKey();
//第一位密码
if(Key != NO_KEY && a==1 && b==1 && c==1 && d==1 && e==1 &&f==1 && g==1 ){
lcd.setCursor(0,1);
Key1=Key;
lcd.print(Key1);
h=1;
}
if(Key == NO_KEY && a==1 && b==1 && c==1 && d==1 && e==1 && f==1 && g==1 && h==1){
a=0;
h=0;
}
//第二位密码
if(Key != NO_KEY && a==0 && b==1 && c==1 && d==1 && e==1 &&f==1 && g==1 ){
if(Key=='#'){
a=1;
lcd.setCursor(0,1);
lcd.print(" ");
}
lcd.setCursor(1,1);
Key2=Key;
lcd.print(Key2);
h=1;
}
if(Key == NO_KEY && a==0 && b==1 && c==1 && d==1 && e==1 && f==1 && g==1 && h==1){
b=0;
h=0;
}
//第三位密码
if(Key != NO_KEY && a==0 && b==0 && c==1 && d==1 && e==1 &&f==1 && g==1 ){
if(Key=='#'){
b=1;
lcd.setCursor(1,1);
lcd.print(" ");
}
else{
lcd.setCursor(2,1);
Key3=Key;
lcd.print(Key3);
h=1;
}
}
if(Key == NO_KEY && a==0 && b==0 && c==1 && d==1 && e==1 && f==1 && g==1 && h==1){
c=0;
h=0;
}
//第四位密码
if(Key != NO_KEY && a==0 && b==0 && c==0 && d==1 && e==1 &&f==1 && g==1 ){
if(Key=='#'){
c=1;
lcd.setCursor(2,1);
lcd.print(" ");
}
else{
lcd.setCursor(3,1);
Key4=Key;
lcd.print(Key4);
h=1;
}
}
if(Key == NO_KEY && a==0 && b==0 && c==0 && d==1 && e==1 && f==1 && g==1 && h==1){
d=0;
h=0;
}
//第五位密码
if(Key != NO_KEY && a==0 && b==0 && c==0 && d==0 && e==1 &&f==1 && g==1 ){
if(Key=='#'){
d=1;
lcd.setCursor(3,1);
lcd.print(" ");
}
else{
lcd.setCursor(4,1);
Key5=Key;
lcd.print(Key5);
h=1;
}
}
if(Key == NO_KEY && a==0 && b==0 && c==0 && d==0 && e==1 && f==1 && g==1 && h==1){
e=0;
h=0;
}
//第六位密码
if(Key != NO_KEY && a==0 && b==0 && c==0 && d==0 && e==0 &&f==1 && g==1 ){
if(Key=='#'){
e=1;
lcd.setCursor(4,1);
lcd.print(" ");
}
else{
lcd.setCursor(5,1);
Key6=Key;
lcd.print(Key6);
h=1;
}
}
if(Key == NO_KEY && a==0 && b==0 && c==0 && d==0 && e==0 && f==1 && g==1 && h==1){
f=0;
h=0;
}
//*号确认密码
if(Key != NO_KEY && a==0 && b==0 && c==0 && d==0 && e==0 &&f==0 && g==1 ){
if(Key=='#'){
f=1;
lcd.setCursor(5,1);
lcd.print(" ");
}
else{
lcd.setCursor(6,1);
Key7=Key;
lcd.print(Key7);
if(Key7=='*')
h=1;
}
}
if(Key == NO_KEY && a==0 && b==0 && c==0 && d==0 && e==0 && f==0 && g==1 && h==1){
g=0;
h=0;
}
//判断调用函数
if(a==0 && b==0 && c==0 && d==0 && e==0 && f==0 && g==0){
password1[0]=Key1;
password1[1]=Key2;
password1[2]=Key3;
password1[3]=Key4;
password1[4]=Key5;
password1[5]=Key6;
judgment();
if(Key=='A' && open==0){
password_init();
}
}
}
//舵机旋转函数
void servo(){
if(open==1){
pos=90;
myservo.write(pos);
}
if(open==0){
pos=0;
myservo.write(pos);
}
if(distance>10){
pos=0;
myservo.write(pos);
}
}
//蜂鸣器报警函数
void buzzer(){
if(warning==3){
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13,LOW);
}
if(distance>10){
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13,LOW);
}
}
//数码管初始化函数
void password_init(){
for(int i=0;i<6;i++){
password1[i]=0;
}
a=b=c=d=e=f=g=1;
lcd.init();
lcd.setCursor(0,0);
lcd.print("PASSWORD:");
}
//判断输入是否为正确密码
void judgment(){
int xx=1;
for(int x=0;x<6;x++){
if(password[x]!=password1[x]){
xx=0;
}
}
if(xx==1){
lcd.setCursor(0,1);
lcd.print("WELCOME!");
open=1;
servo();
delay(3000);
warning=0;
open=0;
servo();
password_init();
}
else{
lcd.setCursor(0,1);
lcd.print("ERROR!!!");
xx=1;
warning+=1;
}
}
我认为可能是我的代码不行但是仿真平台功能太强大,让我的错误显得微不足道。
也有可能是我的开发板是残次品,运行能力不太行?
或者是我的矩阵键盘出了问题,但是LCD1602显示也很慢。