白呀呀 2022-11-17 20:21 采纳率: 0%
浏览 39
已结题

Mega2560矩阵键盘在lcd显示输出非常慢,需要很久才能给出反应,但是我的代码里几乎没有用到延时

我用mega2560尝试制作一个密码锁,核心就是矩阵键盘和lcd1601。现在遇到的问题是我在仿真平台上运行得非常流畅,但是烧录到单片机里运行后很慢。包括显示和按键,需要很久才能做出反应。
下面是我的代码,因为是我自己写的,所以很大可能是代码太长,所以时间耗费大?但是仿真运行丝毫没有问题

https://wokwi.com/projects/347813918755783251%E8%BF%99%E4%B8%AA%E6%98%AF%E6%88%91%E4%BB%BF%E7%9C%9F%E7%9A%84%E9%A1%B9%E7%9B%AE%E7%BD%91%E5%9D%80%EF%BC%8C%E6%98%AF%E5%BE%88%E6%B5%81%E7%95%85%E7%9A%84%E3%80%82

#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显示也很慢。

我想要达到和仿真平台一样的效果,非常迅速的就给出反应
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月25日
    • 创建了问题 11月17日

    悬赏问题

    • ¥15 依据报错在原代吗格式的基础上解决问题
    • ¥15 在虚拟机中安装flash code
    • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
    • ¥20 verilog状态机方法流水灯
    • ¥15 pandas代码实现不了意图
    • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
    • ¥25 LT码在高斯信道下的误码率仿真
    • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
    • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
    • ¥15 电视版的优酷可以设置电影连续播放吗?