极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13829|回复: 6

arduino宏的应用实例2--用宏暴力处理矩阵键盘

[复制链接]
发表于 2016-4-24 23:39:03 | 显示全部楼层 |阅读模式
本帖最后由 wwwymq 于 2016-4-26 00:26 编辑

上次说到可以用宏处理按键消息:http://www.geek-workshop.com/thread-26618-1-1.html
其实稍作改动就能很暴力的处理矩阵按键,直接上代码:
[pre lang="arduino" line="1" file="MatrixKey"]#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"));
}[/code]
2到9pin对应矩阵薄膜按键的8个针
这种按键:

rowPin对应输出针脚
columnPin对应输入针脚
这段程序中我没有像常规的矩阵键盘处理一样扫描矩阵键盘的整体键码,而是单独扫描每个按键,并分别对按键的事件作出相应,这也就是我为什么说处理方式很暴力的原因了,支持多键同时按下。
运行效果

4月25日修正一个BUG时间标志的类型应该是static unsigned long ,而不是static int,否则定时在30多秒后失效。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-4-25 00:10:26 | 显示全部楼层
沙发自己坐
回复 支持 反对

使用道具 举报

发表于 2016-4-25 16:25:51 | 显示全部楼层
确实很暴力,调用也很方便,真心不错,谢谢分享!
回复 支持 反对

使用道具 举报

发表于 2016-4-25 16:27:21 | 显示全部楼层
在坛子里应该多鼓励这种基础性的代码,按键处理是做一个完整的、可以应用于商业的最基本的东西
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-26 00:25:52 | 显示全部楼层
novelcrab 发表于 2016-4-25 16:25
确实很暴力,调用也很方便,真心不错,谢谢分享!

修正一个BUG时间标志的类型应该是static unsigned long ,而不是static int,否则定时在30多秒后失效。
回复 支持 反对

使用道具 举报

发表于 2016-4-26 17:43:01 | 显示全部楼层
不错呢。。。鼓励
回复 支持 反对

使用道具 举报

发表于 2016-4-26 17:44:18 | 显示全部楼层
novelcrab 发表于 2016-4-25 16:27
在坛子里应该多鼓励这种基础性的代码,按键处理是做一个完整的、可以应用于商业的最基本的东西

他这个代码解决的不是有和无的问题
层面更高,
实现了键位冲突的检测。
基础的商业键盘只有基础的检测功能即可,逐键扫描即可
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 17:39 , Processed in 0.044144 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表