c-在Led矩阵和按钮中控制开关



先生,我使用的是一个带有3*3按钮的3*3 led矩阵,我需要一个程序来点亮左上角的led并等待用户的响应。如果按下相应的按钮,则led熄灭,紧邻的led亮起,过程继续。此代码适用于此,问题是当用户按下第一个按钮时,第一个发光二极管熄灭,第二个发光二极管点亮,当按下第二个按钮时第二个led熄灭,第三个led熄灭。但当用户在过程中错误地再次触摸第二个按键时,随机发光二极管开始发光,这不应该发生,代码应该等到按下正确的按钮和过程继续,有人能帮我处理代码吗。谢谢

#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();
}
}

您需要检查用户是否只按下了期望的键
为此,您需要跟踪所需的密钥并进行检查。

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

char expected = '1';

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

if (key==expected)
{
switch(key)
{

然后,在每个交换机案例中,将期望的密钥更新为下一个密钥。

case '1' :
expected = '2';
Led1_Off();
Led2_On();
break;

最新更新