首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Led-矩阵和推送按钮中控制开关

在Led-矩阵和推送按钮中控制开关
EN

Stack Overflow用户
提问于 2019-10-27 06:53:16
回答 1查看 442关注 0票数 1

先生,我使用的是3*3 -matrix和3*3按钮,我需要一个程序,应该点燃左上角,等待用户的反应。如果按下相应的按钮,则led关闭,相邻的led灯亮起,进程继续进行。此代码适用于此,问题是当用户按下第一个led的第一个按钮和第二个led的启动时,当第二个按键被按下,第二个led启动和第三个led启动时,但是当用户在进程中间再次错误地触摸第二个按钮时,随机的led就会开始发光,这是不应该发生的,代码应该等到正确的按钮被按下,进程才会继续,谁能帮我处理代码吗?谢谢。

代码语言:javascript
复制
#include <Keypad.h>

int led_rows[]={ 2 , 3 , 4 };
int led_cols[]={ 5 , 6 , 7 };

int led_matriz[3][3]= {     
    {0, 0, 0}, 
    {0, 0, 0},  
    {0, 0, 0}, };

const byte rows = 3; 
const byte cols = 3; 

char keys[rows][cols] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
};

byte rowPins[rows] = {10,9,8}; 
byte colPins[cols] = {13,12,11}; 

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

void setup(){
  Serial.begin(9600);

  for(int i=0;i<3;i++){
  pinMode(led_cols[i], OUTPUT);
  digitalWrite (led_cols[i], HIGH);
  }

  for(int i=0;i<3;i++){
  pinMode(led_rows[i], OUTPUT);
  digitalWrite (led_rows[i], LOW);
  }
  Led1_On();
}

void Led1_On(){
  digitalWrite (led_rows[0], HIGH);
  digitalWrite (led_cols[0], LOW);
}

void Led1_Off(){
  digitalWrite (led_rows[0], LOW);
  digitalWrite (led_cols[0], HIGH);
}

void Led2_On(){
  digitalWrite (led_rows[0], HIGH);
  digitalWrite (led_cols[1], LOW);
}

void Led2_Off(){
  digitalWrite (led_rows[0], LOW);
  digitalWrite (led_cols[1], HIGH);
}

void Led3_On(){
  digitalWrite (led_rows[0], HIGH);
  digitalWrite (led_cols[2], LOW);
}

void Led3_Off(){
  digitalWrite (led_rows[0], LOW);
  digitalWrite (led_cols[2], HIGH);
}

void Led4_On(){
  digitalWrite (led_rows[1], HIGH);
  digitalWrite (led_cols[0], LOW);
}

void Led4_Off(){
  digitalWrite (led_rows[1], LOW);
  digitalWrite (led_cols[0], HIGH);
}

void Led5_On(){
  digitalWrite (led_rows[1], HIGH);
  digitalWrite (led_cols[1], LOW);
}

void Led5_Off(){
  digitalWrite (led_rows[1], LOW);
  digitalWrite (led_cols[1], HIGH);
}

void Led6_On(){
  digitalWrite (led_rows[1], HIGH);
  digitalWrite (led_cols[2], LOW);
}

void Led6_Off(){
  digitalWrite (led_rows[1], LOW);
  digitalWrite (led_cols[2], HIGH);
}

void Led7_On(){
  digitalWrite (led_rows[2], HIGH);
  digitalWrite (led_cols[0], LOW);
}

void Led7_Off(){
  digitalWrite (led_rows[2], LOW);
  digitalWrite (led_cols[0], HIGH);
}

void Led8_On(){
  digitalWrite (led_rows[2], HIGH);
  digitalWrite (led_cols[1], LOW);
}

void Led8_Off(){
  digitalWrite (led_rows[2], LOW);
  digitalWrite (led_cols[1], HIGH);
}

void Led9_On(){
  digitalWrite (led_rows[2], HIGH);
  digitalWrite (led_cols[2], LOW);
}

void Led9_Off(){
  digitalWrite (led_rows[2], LOW);
  digitalWrite (led_cols[2], HIGH);
}

void loop(){
  char key = keypad.getKey();
  //Led1_On();

  switch(key)
  {
    case '1' :
    Led1_Off();
    Led2_On();
    break;

    case '2' :
    Led2_Off();
    Led3_On();
    break;

    case '3':
    Led3_Off();
    Led4_On();
    break;

    case '4':
    Led4_Off();
    Led5_On();
    break;

    case '5' :
    Led5_Off();
    Led6_On();
    break;

    case '6' :
    Led6_Off();
    Led7_On();
    break;

    case '7' :
    Led7_Off();
    Led8_On();
    break;

    case '8' :
    Led8_Off();
    Led9_On();
    break;

    case '9' :
    Led9_Off();

  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-27 07:30:57

您需要检查用户是否只按下预期的键。

为此,您需要跟踪哪个键是预期的,并检查它。

首先,使用最初期望的键设置一个全局变量。

代码语言:javascript
复制
char expected = '1';

然后将switch语句放入条件中,只在满足条件时执行。

代码语言:javascript
复制
if (key==expected)
{
    switch(key)
    {

然后,在每个开关情况下,将预期的键更新到下一个。

代码语言:javascript
复制
        case '1' :
            expected = '2';
            Led1_Off();
            Led2_On();
            break;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58577178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档