#include <Keypad.h> //引入Keypad.h函数库
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] = {9, 8, 7, 6}; //连接键盘的行引脚
byte colPins[COLS] = {5, 4, 3, 2}; //连接键盘的列引脚
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
byte ledPinR = 10;
byte ledPinG = 11;
byte ledPinB = 12;//定义RBG LED的引脚
boolean invert = true;//如果共阳极设置为true;共阴极则返回false
void setup() {
Serial.begin(9600);
for (int i = 9; i < 13; i++) {
pinMode(i, OUTPUT);
analogWrite(i, HIGH);
}//允许上拉电阻
keypad.addEventListener(keypadEvent);
}
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
Serial.println(key);//如果按键被按下,串口打印该按键所代表的字符
}
}
void keypadEvent(KeypadEvent key) {
switch (keypad.getState()) {
case PRESSED:
switch (key) {
case '1':
digitalWrite(ledPinR, !digitalRead(ledPinR));
digitalWrite(ledPinG, 1);
digitalWrite(ledPinB, 1);
break;
case '2':
digitalWrite(ledPinR, 1);
digitalWrite(ledPinG, !digitalRead(ledPinG));
digitalWrite(ledPinB, 1);
break;
case '3':
digitalWrite(ledPinR, 1);
digitalWrite(ledPinG, 1);
digitalWrite(ledPinB, !digitalRead(ledPinB));
break;
case '4':
if (digitalRead(ledPinR)^digitalRead(ledPinG)) Off_All();
digitalWrite(ledPinR, !digitalRead(ledPinR));
digitalWrite(ledPinG, !digitalRead(ledPinG));
digitalWrite(ledPinB, 1);
break;
case '5':
if (digitalRead(ledPinR)^digitalRead(ledPinB)) Off_All();
digitalWrite(ledPinR, !digitalRead(ledPinR));
digitalWrite(ledPinG, 1);
digitalWrite(ledPinB, !digitalRead(ledPinB));
break;
case '6':
if (digitalRead(ledPinG)^digitalRead(ledPinB)) Off_All();
digitalWrite(ledPinR, 1);
digitalWrite(ledPinG, !digitalRead(ledPinG));
digitalWrite(ledPinB, !digitalRead(ledPinB));
break;
case 'A':
Off_All();
break;
default: break;
}
break;
case RELEASED:
switch (key) {
default: break;
}
break;
}
}
void Off_All()
{
digitalWrite(ledPinR, 1);
digitalWrite(ledPinG, 1);
digitalWrite(ledPinB, 1);
}