找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3932|回复: 25
打印 上一主题 下一主题
收起左侧

【Arduino】168种传感器模块系列实验(140)---跑马灯矩阵键盘模块

[复制链接]
跳转到指定楼层
楼主
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验一百四十:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
(4*4矩阵键盘+4位独立按键+8位跑马灯组合模块)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:513258 发表于 2020-2-27 20:57 | 只看该作者
4X4矩阵键盘
是单片机外部设备中所使用的排布类似于矩阵的键盘组。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4X4和8X8,其中用的最多的是4X4。


回复

使用道具 举报

板凳
ID:513258 发表于 2020-2-27 21:00 | 只看该作者
工作原理
矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4X4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。由于单片机IO端口具有线与的功能,因此当任意一个按键按下时,行和列都有一根线被线与,通过运算就可以得出按键的坐标从而判断按键键值。






回复

使用道具 举报

地板
ID:513258 发表于 2020-2-27 21:08 | 只看该作者
行列扫描法原理
1、使行线为编程的输入线,列线是输出线,拉低所有的列线,判断行线的变化,如果有按键按下,按键按下的对应行线被拉低,否则所有的行线都为高电平。
2、在第一步判断有键按下后, 延时10ms消除机械抖动,再次读取行值,如果此行线还处于低电平状态则进入下 一步,否则返回第一步重新判断。
3、开始扫描按键位置,采用逐 行扫描,每间隔1ms的时间,分别拉低第一列,第二列,第三列,第四 列,无论拉低哪一列其他三列都为高电平,读取行值找到按键的位置,分别把行值和列值储存在寄存器里。
4、从寄存器中找到行值和列 值并把其合并,得到按键值,对此按键值进行编码,按照从第一行第一个一直到第四行第四个逐行进行编码,编码值从“0000” 至“1111” , 再进行译码,最后显示按键号码。




回复

使用道具 举报

5#
ID:513258 发表于 2020-2-28 08:30 | 只看该作者
4X4矩阵4管脚直插按键键盘
(1)体积小;
(2)节省空间;
(3)使用方便;
(4)共计16按键;
(5)单片机外扩键盘的上佳选择。



回复

使用道具 举报

6#
ID:513258 发表于 2020-2-28 09:16 | 只看该作者
矩阵键盘所需库文件<Keypad>
在Arduino IDE 1.8.10 或者以上版本中, 项目->加载库->管理库中搜索Keypad,然后安装即可。
也可以下载库(需要下载库文件 https://github.com/Chris--A/Keypad),然后手动添加到IDE中。




回复

使用道具 举报

7#
ID:513258 发表于 2020-2-28 09:24 | 只看该作者
4*4矩阵键盘+4位独立按键+8位跑马灯组合模块



回复

使用道具 举报

8#
ID:513258 发表于 2020-2-28 09:28 | 只看该作者
4*4矩阵键盘+4位独立按键+8位跑马灯组合模块



回复

使用道具 举报

9#
ID:513258 发表于 2020-2-28 10:01 | 只看该作者



回复

使用道具 举报

10#
ID:513258 发表于 2020-2-28 12:54 | 只看该作者
测试矩阵键盘部分接线示意图



回复

使用道具 举报

11#
ID:513258 发表于 2020-2-28 13:02 | 只看该作者
模块上4*4矩阵键盘有一个8脚的端口,理论上可以直接插到Arduino的0-7脚上,但0,1脚用于串口通信,所以只能选择2~13脚,这里选用了2-9脚。

Keypad Pin L1 –> Arduino Pin 2  (行)
Keypad Pin L2 –> Arduino Pin 3
Keypad Pin L3 –> Arduino Pin 4
Keypad Pin L4 –> Arduino Pin 5
Keypad Pin R1 –> Arduino Pin 6  (列)
Keypad Pin R2 –> Arduino Pin 7
Keypad Pin R3 –> Arduino Pin 8
Keypad Pin R4 –> Arduino Pin 9

回复

使用道具 举报

12#
ID:513258 发表于 2020-2-28 14:01 | 只看该作者

程序之一:测试矩阵键盘部分

  1. /*
  2. 【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3. 实验一百四十:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
  4. 程序之一:测试矩阵键盘部分
  5. */

  6. #include <Keypad.h>

  7. const byte ROWS = 4;
  8. const byte COLS = 4;

  9. char hexaKeys[ROWS][COLS] = {
  10.   {'1','2','3','A'},
  11.   {'4','5','6','B'},
  12.   {'7','8','9','C'},
  13.   {'*','0','#','D'}
  14. };

  15. byte rowPins[ROWS] = {2, 3, 4, 5};
  16. byte colPins[COLS] = {6, 7, 8, 9};

  17. Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

  18. void setup(){
  19.   Serial.begin(9600);
  20. }

  21. void loop(){
  22.   char customKey = customKeypad.getKey();

  23.   if (customKey){
  24.     Serial.println(customKey);
  25.   }
  26. }
复制代码



回复

使用道具 举报

13#
ID:513258 发表于 2020-2-28 14:05 | 只看该作者
串口输出16位矩阵键值




回复

使用道具 举报

14#
ID:513258 发表于 2020-2-28 15:19 | 只看该作者

程序之二:矩阵键盘部分测试每个按键的按下与松开

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百四十:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
  4.   程序之二:矩阵键盘部分测试每个按键的按下与松开
  5. */

  6. #include "Adafruit_Keypad.h"

  7. const byte ROWS = 4; // 行
  8. const byte COLS = 4; // 列
  9. //定义键盘按钮上的符号
  10. char hexaKeys[ROWS][COLS] = {
  11.   {'1', '2', '3', 'A'},
  12.   {'4', '5', '6', 'B'},
  13.   {'7', '8', '9', 'C'},
  14.   {'*', '0', '#', 'D'}
  15. };

  16. byte rowPins[ROWS] = {2, 3, 4, 5}; //连接到键盘的行插脚
  17. byte colPins[COLS] = {6, 7, 8, 9}; //连接到键盘的列插脚

  18. //初始化类NewKeypad的实例
  19. Adafruit_Keypad customKeypad = Adafruit_Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

  20. void setup() {
  21.   Serial.begin(9600);
  22.   customKeypad.begin();

  23. }

  24. void loop() {
  25.   //把你的主代码放在这里,重复运行
  26.   customKeypad.tick();

  27.   while (customKeypad.available()) {
  28.     keypadEvent e = customKeypad.read();
  29.     Serial.print((char)e.bit.KEY);
  30.     if (e.bit.EVENT == KEY_JUST_PRESSED) Serial.println(" pressed");
  31.     else if (e.bit.EVENT == KEY_JUST_RELEASED) Serial.println(" released");
  32.   }

  33.   delay(10);
  34. }
复制代码



回复

使用道具 举报

15#
ID:513258 发表于 2020-2-28 15:22 | 只看该作者

回复

使用道具 举报

16#
ID:513258 发表于 2020-2-28 16:17 | 只看该作者
本帖最后由 eagler8 于 2020-2-28 16:19 编辑

程序之三:矩阵键盘部分测试按键'*'和 '#'控制LED灯(板载13脚)

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百四十:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
  4.   程序之三:矩阵键盘部分测试按键'*'和 '#'控制LED灯(板载13脚)
  5. */

  6. #include <Keypad.h>

  7. const byte ROWS = 4; //四行
  8. const byte COLS = 3; //三列
  9. //定义键盘按钮上的符号
  10. char keys[ROWS][COLS] = {
  11.   {'1', '2', '3'},
  12.   {'4', '5', '6'},
  13.   {'7', '8', '9'},
  14.   {'*', '0', '#'}
  15. };

  16. byte rowPins[ROWS] = {2, 3, 4, 5}; //连接到键盘的行插脚
  17. byte colPins[COLS] = {6, 7, 8};  //连接到键盘的列插脚

  18. Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
  19. byte ledPin = 13;

  20. boolean blink = false;
  21. boolean ledPin_state;

  22. void setup() {
  23.   Serial.begin(9600);
  24.   pinMode(ledPin, OUTPUT);              // 将数字管脚设置为输出
  25.   digitalWrite(ledPin, HIGH);           // 打开LED
  26.   ledPin_state = digitalRead(ledPin);   // 存储初始LED状态。当LED亮起时为高
  27.   keypad.addEventListener(keypadEvent); // 为此键盘添加事件侦听器
  28. }

  29. void loop() {
  30.   char key = keypad.getKey();

  31.   if (key) {
  32.     Serial.println(key);
  33.   }
  34.   if (blink) {
  35.     digitalWrite(ledPin, !digitalRead(ledPin));   // 将LED引脚从Hi2Lo或Lo2Hi更改
  36.     delay(100);
  37.   }
  38. }

  39. // 处理一些特殊事件
  40. void keypadEvent(KeypadEvent key) {
  41.   switch (keypad.getState()) {
  42.     case PRESSED:
  43.       if (key == '#') {
  44.         digitalWrite(ledPin, !digitalRead(ledPin));
  45.         ledPin_state = digitalRead(ledPin);        // 记住LED状态,亮或不亮
  46.       }
  47.       break;

  48.     case RELEASED:
  49.       if (key == '*') {
  50.         digitalWrite(ledPin, ledPin_state);   // 从开始闪烁前恢复LED状态
  51.         blink = false;
  52.       }
  53.       break;

  54.     case HOLD:
  55.       if (key == '*') {
  56.         blink = true;    // 按住*键时,LED闪烁
  57.       }
  58.       break;
  59.   }
  60. }
复制代码



回复

使用道具 举报

17#
ID:513258 发表于 2020-2-28 16:25 | 只看该作者
'#'键控制LED灯自锁开关,'*'键按下时LED闪烁,松开熄灭



回复

使用道具 举报

18#
ID:513258 发表于 2020-2-28 16:38 | 只看该作者
测试跑马灯部分接线示意图



回复

使用道具 举报

19#
ID:513258 发表于 2020-2-28 16:41 | 只看该作者

回复

使用道具 举报

20#
ID:513258 发表于 2020-2-29 09:43 | 只看该作者
程序之四:测试跑马灯部分,循环逐个点亮,逐个熄灭

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百四十:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
  4.   程序之四:测试跑马灯部分,循环逐个点亮,逐个熄灭
  5. */

  6. int BASE = 6 ;
  7. int NUM = 8;

  8. void setup()
  9. {
  10.   for (int i = BASE; i < BASE + NUM; i ++)
  11.   {
  12.     pinMode(i, OUTPUT);
  13.   }
  14. }

  15. void loop()
  16. {
  17.   for (int i = BASE; i < BASE + NUM; i ++)
  18.   {
  19.     digitalWrite(i, LOW);
  20.     delay(200);
  21.   }
  22.   for (int i = BASE; i < BASE + NUM; i ++)
  23.   {
  24.     digitalWrite(i, HIGH);
  25.     delay(200);
  26.   }
  27. }
复制代码



回复

使用道具 举报

21#
ID:513258 发表于 2020-2-29 09:51 | 只看该作者

回复

使用道具 举报

22#
ID:513258 发表于 2020-2-29 10:07 | 只看该作者
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百四十:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
  4.   程序之五:测试跑马灯部分,循环单个熄灭
  5. */

  6. byte ledPin[] = {6, 7, 8, 9, 10, 11, 12, 13};
  7. int ledDelay(300);
  8. int direction = 1;
  9. int currentLED = 0;
  10. unsigned long changeTime;
  11. void setup() {
  12.   for (int x = 0; x <= 7; x++)
  13.     pinMode(ledPin[x], OUTPUT); //数组从0开始分配存储单元,这里要非常注意循环变量的初值和终值,0-7刚好循环至8
  14.   changeTime = millis();
  15. }

  16. void loop() {
  17.   if ((millis() - changeTime) > ledDelay)
  18.   { changeLED(); //运行时间如果超过一个数量的延时时间,则由函数changeLED()控制LED点亮的变化
  19.     changeTime = millis();
  20.   }
  21. }



  22. void changeLED() {
  23.   for (int x = 0; x <= 7; x++)
  24.   { digitalWrite(ledPin[x], LOW); //8只LED灯低平信号,熄灭
  25.   }
  26.   digitalWrite(ledPin[currentLED], HIGH); //设当前LED高平信号,点亮
  27.   currentLED += direction; //当前值增加为direction表示的值
  28.   if (currentLED == 7) {
  29.     direction = -1; //当前灯为第8只灯,currentLED当前值改为-1,改变亮灯方向
  30.   }
  31.   if (currentLED == 0) {
  32.     direction = 1; //当前灯为第1只灯,currentLED当前值为+1,从第1只灯开始计数
  33.   }

  34. }
复制代码


回复

使用道具 举报

23#
ID:513258 发表于 2020-2-29 10:17 | 只看该作者
测试独立按键部分+跑马灯部分




回复

使用道具 举报

24#
ID:513258 发表于 2020-2-29 10:42 | 只看该作者
程序之六:测试独立按键部分+跑马灯部分,按键控制跑马灯

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百四十:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
  4.   程序之六:测试独立按键部分+跑马灯部分,按键控制跑马灯
  5. */

  6. int buttonPin = 2 ;   // 定义按键引脚
  7. int BASE = 6;        // 定义第一个LED引脚
  8. int NUM = 8;         // LED 的总数
  9. int val;

  10. void setup()
  11. {
  12.   Serial.begin(9600);
  13.   pinMode(buttonPin, INPUT);
  14.   for (int i = BASE; i < BASE + NUM; i ++)
  15.   {
  16.     pinMode(i, OUTPUT);   // 设定LED引脚为输出引脚
  17.   }
  18. }

  19. void loop()
  20. {
  21.   liangdeng();            // 循环亮灯子程序
  22.   delay(200);             // 每次循环间隔时间
  23.   miedeng();              // LED全灭子程序
  24. }

  25. void liangdeng()
  26. {
  27.   for (int i = BASE; i < BASE + NUM; i ++)
  28.   {
  29.     digitalWrite(i, LOW);  //设定LED引脚逐个输出高电平逐个点亮
  30.     val = digitalRead(buttonPin);   // 储存按键变换量
  31.     if (val == HIGH)          //判断是否按下按键,弱已按下按键跳出当前循环
  32.     {
  33.       val = HIGH;
  34.       break;
  35.     }
  36.     delay(200);        //延时
  37.   }
  38. }

  39. void miedeng()
  40. {
  41.   for (int i = BASE; i < BASE + NUM; i ++)
  42.   {
  43.     digitalWrite(i, HIGH);    //设定LED引脚逐个输出低电平逐个点亮
  44.   }
  45. }
复制代码



回复

使用道具 举报

25#
ID:513258 发表于 2020-2-29 15:02 | 只看该作者
编玩边学开源图形编程




回复

使用道具 举报

26#
ID:513258 发表于 2020-2-29 15:17 | 只看该作者
实验开源仿真编程(linkboy3.6)



回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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