上次说到可以用宏处理按键消息,其实稍作改动就能很暴力的处理矩阵按键,直接上代码:
- #define readMatrixKey(rowPin,columnPin,onTrigger,onPop) do{\
- pinMode(columnPin,INPUT_PULLUP);\
- pinMode(rowPin,OUTPUT);\
- static bool Trg = false;\
- static bool Cont = false;\
- static bool Pop = false;\
- static unsigned long timdel = millis();\
- if (millis() - timdel >= 20) {\
- bool ReadData = !digitalRead(columnPin);\
- Trg = ReadData & (ReadData ^ Cont); \
- Pop = Cont != ReadData & !Trg; \
- Cont = ReadData; \
- if (Trg) {\
- onTrigger;\
- }\
- if (Pop) {\
- onPop; \
- }\
- timdel = millis(); \
- }\
- pinMode(columnPin,INPUT);\
- pinMode(rowPin,INPUT);\
- } while (0)
- void setup() {
- // put your setup code here, to run once:
- for (int i = 2; i < 10; i++)
- {
- pinMode(i, INPUT);
- }
- Serial.begin(9600);
- }
-
- void loop() {
- // put your main code here, to run repeatedly:
- readMatrixKey(2, 6, Serial.println("2,6 PUSH"), Serial.println("2,6 POP"));
- readMatrixKey(2, 7, Serial.println("2,7 PUSH"), Serial.println("2,7 POP"));
- readMatrixKey(2, 8, Serial.println("2,8 PUSH"), Serial.println("2,8 POP"));
- }
复制代码
2到9pin对应矩阵薄膜按键的8个针
这种按键rowPin对应输出针脚
columnPin对应输入针脚
这段程序中我没有像常规的矩阵键盘处理一样扫描矩阵键盘的整体键码,而是单独扫描每个按键,并分别对按键的事件作出相应,这也就是我为什么说处理方式很暴力的原因了,支持多键同时按下。
运行效果
修正一个BUG时间标志的类型应该是static unsigned long ,而不是static int,否则定时在30多秒后失效。
|