美文网首页
【雕爷学编程】Arduino动手做(131)---跑马灯矩阵键盘

【雕爷学编程】Arduino动手做(131)---跑马灯矩阵键盘

作者: 驴友花雕 | 来源:发表于2023-06-29 07:13 被阅读0次

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

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

    0.jpg

    4X4矩阵键盘

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

    工作原理

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

    0-.jpg

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

    06-5.jpg

    4*4矩阵键盘+4位独立按键+8位跑马灯组合模块

    10 (1).jpg 11.jpg

    4*4矩阵键盘+4位独立按键+8位跑马灯组合模块参考电原理图

    06-.jpg

    模块上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- (1).jpg

    | 矩阵键盘所需库文件<Keypad>
    在Arduino IDE 1.8.10 或者以上版本中, 项目->加载库->管理库中搜索Keypad,然后安装即可。
    也可以下载库(需要下载库文件 https://github.com/Chris--A/Keypad),然后手动添加到IDE中。

    12.jpg

    Arduino实验开源代码

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
    实验一百三十一:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
    
    程序之一:测试矩阵键盘部分
    
    */
    
    
    
    #include <Keypad.h>
    
    const byte ROWS = 4;
    
    const byte COLS = 4;
    
    char hexaKeys[ROWS][COLS] = {
    
      {'1','2','3','A'},
    
      {'4','5','6','B'},
    
      {'7','8','9','C'},
    
      {'*','0','#','D'}
    
    };
    
    byte rowPins[ROWS] = {2, 3, 4, 5};
    
    byte colPins[COLS] = {6, 7, 8, 9};
    
    Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
    
    void setup(){
    
      Serial.begin(9600);
    
    }
    
    void loop(){
    
      char customKey = customKeypad.getKey();
    
      if (customKey){
    
      Serial.println(customKey);
    
      }
    
    }
    

    串口输出16位矩阵键值

    13.jpg

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

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
     实验一百三十一:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
    
      程序之二:矩阵键盘部分测试每个按键的按下与松开
    
    */
    
    
    
    #include "Adafruit_Keypad.h"
    
    const byte ROWS = 4; // 行
    
    const byte COLS = 4; // 列
    
    //定义键盘按钮上的符号
    
    char hexaKeys[ROWS][COLS] = {
    
      {'1', '2', '3', 'A'},
    
      {'4', '5', '6', 'B'},
    
      {'7', '8', '9', 'C'},
    
      {'*', '0', '#', 'D'}
    
    };
    
    byte rowPins[ROWS] = {2, 3, 4, 5}; //连接到键盘的行插脚
    
    byte colPins[COLS] = {6, 7, 8, 9}; //连接到键盘的列插脚
    
    //初始化类NewKeypad的实例
    
    Adafruit_Keypad customKeypad = Adafruit_Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
    
    void setup() {
    
      Serial.begin(9600);
    
      customKeypad.begin();
    
    }
    
    void loop() {
    
      //把你的主代码放在这里,重复运行
    
      customKeypad.tick();
    
      while (customKeypad.available()) {
    
      keypadEvent e = customKeypad.read();
    
      Serial.print((char)e.bit.KEY);
    
      if (e.bit.EVENT == KEY_JUST_PRESSED) Serial.println(" pressed");
    
      else if (e.bit.EVENT == KEY_JUST_RELEASED) Serial.println(" released");
    
      }
    
      delay(10);
    
    }
    

    实验串口返回情况

    14.jpg

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

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
     实验一百三十一:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
    
      程序之三:矩阵键盘部分测试按键'*'和 '#'控制LED灯(板载13脚)
    
    */
    
    
    
    #include <Keypad.h>
    
    const byte ROWS = 4; //四行
    
    const byte COLS = 3; //三列
    
    //定义键盘按钮上的符号
    
    char keys[ROWS][COLS] = {
    
      {'1', '2', '3'},
    
      {'4', '5', '6'},
    
      {'7', '8', '9'},
    
      {'*', '0', '#'}
    
    };
    
    byte rowPins[ROWS] = {2, 3, 4, 5}; //连接到键盘的行插脚
    
    byte colPins[COLS] = {6, 7, 8};  //连接到键盘的列插脚
    
    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
    
    byte ledPin = 13;
    
    boolean blink = false;
    
    boolean ledPin_state;
    
    void setup() {
    
      Serial.begin(9600);
    
      pinMode(ledPin, OUTPUT);          // 将数字管脚设置为输出
    
      digitalWrite(ledPin, HIGH);        // 打开LED
    
      ledPin_state = digitalRead(ledPin);  // 存储初始LED状态。当LED亮起时为高
    
      keypad.addEventListener(keypadEvent); // 为此键盘添加事件侦听器
    
    }
    
    void loop() {
    
      char key = keypad.getKey();
    
      if (key) {
    
      Serial.println(key);
    
      }
    
      if (blink) {
    
      digitalWrite(ledPin, !digitalRead(ledPin));  // 将LED引脚从Hi2Lo或Lo2Hi更改
    
      delay(100);
    
      }
    
    }
    
    // 处理一些特殊事件
    
    void keypadEvent(KeypadEvent key) {
    
      switch (keypad.getState()) {
    
      case PRESSED:
    
        if (key == '#') {
    
          digitalWrite(ledPin, !digitalRead(ledPin));
    
          ledPin_state = digitalRead(ledPin);      // 记住LED状态,亮或不亮
    
        }
    
        break;
    
      case RELEASED:
    
        if (key == '*') {
    
          digitalWrite(ledPin, ledPin_state);  // 从开始闪烁前恢复LED状态
    
          blink = false;
    
        }
    
        break;
    
      case HOLD:
    
        if (key == '*') {
    
          blink = true;  // 按住*键时,LED闪烁
    
        }
    
        break;
    
      }
    
    }
    

    '#'键控制LED灯自锁开关,'*'键按下时LED闪烁,松开熄灭

    16.jpg

    测试跑马灯部分接线示意图

    06-1.jpg 06-4-.jpg

    程序之四:测试跑马灯部分,循环逐个点亮,逐个熄灭

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
     实验一百三十一:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
    
      程序之四:测试跑马灯部分,循环逐个点亮,逐个熄灭
    
    */
    
    
    
    int BASE = 6 ;
    
    int NUM = 8;
    
    void setup(){
    
      for (int i = BASE; i < BASE + NUM; i ++)
    
      {
    
      pinMode(i, OUTPUT);
    
      }
    
    }
    
    void loop(){
    
      for (int i = BASE; i < BASE + NUM; i ++)
    
      {
    
      digitalWrite(i, LOW);
    
      delay(200);
    
      }
    
      for (int i = BASE; i < BASE + NUM; i ++)
    
      {
    
      digitalWrite(i, HIGH);
    
      delay(200);
    
      }
    
    }
    

    Arduino实验场景图

    17.jpg

    程序之五:测试跑马灯部分,循环单个熄灭

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
     实验一百三十一:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
    
      程序之五:测试跑马灯部分,循环单个熄灭
    
    */
    
    
    
    byte ledPin[] = {6, 7, 8, 9, 10, 11, 12, 13};
    
    int ledDelay(300);
    
    int direction = 1;
    
    int currentLED = 0;
    
    unsigned long changeTime;
    
    void setup() {
    
      for (int x = 0; x <= 7; x++)
    
      pinMode(ledPin[x], OUTPUT); //数组从0开始分配存储单元,这里要非常注意循环变量的初值和终值,0-7刚好循环至8
    
      changeTime = millis();
    
    }
    
    void loop() {
    
      if ((millis() - changeTime) > ledDelay)
    
      { changeLED(); //运行时间如果超过一个数量的延时时间,则由函数changeLED()控制LED点亮的变化
    
      changeTime = millis();
    
      }
    
    }
    
    void changeLED() {
    
      for (int x = 0; x <= 7; x++)
    
      { digitalWrite(ledPin[x], LOW); //8只LED灯低平信号,熄灭
    
      }
    
      digitalWrite(ledPin[currentLED], HIGH); //设当前LED高平信号,点亮
    
      currentLED += direction; //当前值增加为direction表示的值
    
      if (currentLED == 7) {
    
      direction = -1; //当前灯为第8只灯,currentLED当前值改为-1,改变亮灯方向
    
      }
    
      if (currentLED == 0) {
    
      direction = 1; //当前灯为第1只灯,currentLED当前值为+1,从第1只灯开始计数
    
      }
    
    }
    

    测试独立按键部分+跑马灯部分

    06-2.jpg

    程序之六:测试独立按键部分+跑马灯部分,按键控制跑马灯

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
     实验一百三十一:YL-004老款20按键独立键盘 跑马灯矩阵键盘模块
    
      程序之六:测试独立按键部分+跑马灯部分,按键控制跑马灯
    
    */
    
    
    
    int buttonPin = 2 ;  // 定义按键引脚
    
    int BASE = 6;      // 定义第一个LED引脚
    
    int NUM = 8;      // LED 的总数
    
    int val;
    
    void setup()
    
    {
    
      Serial.begin(9600);
    
      pinMode(buttonPin, INPUT);
    
      for (int i = BASE; i < BASE + NUM; i ++)
    
      {
    
      pinMode(i, OUTPUT);  // 设定LED引脚为输出引脚
    
      }
    
    }
    
    void loop()
    
    {
    
      liangdeng();        // 循环亮灯子程序
    
      delay(200);        // 每次循环间隔时间
    
      miedeng();          // LED全灭子程序
    
    }
    
    void liangdeng()
    
    {
    
      for (int i = BASE; i < BASE + NUM; i ++)
    
      {
    
      digitalWrite(i, LOW);  //设定LED引脚逐个输出高电平逐个点亮
    
      val = digitalRead(buttonPin);  // 储存按键变换量
    
      if (val == HIGH)      //判断是否按下按键,弱已按下按键跳出当前循环
    
      {
    
        val = HIGH;
    
        break;
    
      }
    
      delay(200);      //延时
    
      }
    
    }
    
    void miedeng()
    
    {
    
      for (int i = BASE; i < BASE + NUM; i ++)
    
      {
    
      digitalWrite(i, HIGH);  //设定LED引脚逐个输出低电平逐个点亮
    
      }
    
    }
    

    实验开源图形编程(Mind+、编玩边学)

    17-.jpg

    实验开源仿真编程(Linkboy V4.62)

    18.jpg

    相关文章

      网友评论

          本文标题:【雕爷学编程】Arduino动手做(131)---跑马灯矩阵键盘

          本文链接:https://www.haomeiwen.com/subject/mmkgydtx.html