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

news2024/11/18 7:47:48

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

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

在这里插入图片描述
4X4矩阵键盘

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

工作原理

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

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

在这里插入图片描述
4*4矩阵键盘+4位独立按键+8位跑马灯组合模块

在这里插入图片描述
在这里插入图片描述
4*4矩阵键盘+4位独立按键+8位跑马灯组合模块参考电原理图

在这里插入图片描述
模块上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

测试矩阵键盘部分接线示意图

在这里插入图片描述

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

在这里插入图片描述
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位矩阵键值

在这里插入图片描述

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

/*

【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);

}

实验串口返回情况

在这里插入图片描述
程序之三:矩阵键盘部分测试按键’*'和 '#'控制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闪烁,松开熄灭

在这里插入图片描述
测试跑马灯部分接线示意图

在这里插入图片描述
在这里插入图片描述
程序之四:测试跑马灯部分,循环逐个点亮,逐个熄灭

/*

【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实验场景图

在这里插入图片描述
程序之五:测试跑马灯部分,循环单个熄灭

/*

【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只灯开始计数

  }

}

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

在这里插入图片描述
程序之六:测试独立按键部分+跑马灯部分,按键控制跑马灯

/*

【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+、编玩边学)

在这里插入图片描述

实验开源仿真编程(Linkboy V4.62)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性代数基础--矩阵

矩阵 矩阵是由排列在矩形阵列中的数字或其他数学对象组成的表格结构。它由行和列组成&#xff0c;并且在数学和应用领域中广泛使用。 基本概念 元素&#xff1a;矩阵中的每个数字称为元素。元素可以是实数、复数或其他数学对象。 维度&#xff1a;矩阵的维度表示矩阵的行数和…

vtk创建点

使用vtk库创建三维空间中的点 引言开发环境示例一项目结构实现代码 运行效果示例二项目结构实现代码 运行效果总结 引言 本文仅适合初学者。 本文不提供vtk动态库的生成&#xff0c;以及在QtCreator中的引进vtk时的配置。 本文先由示例一开始&#xff0c;然后再在示例一的基础…

aws使用外部 ID对其他账号授权

点击前往授权,进入控制台 https://signin.aws.amazon.com/signin?redirect_urihttps%3A%2F%2Fconsole.aws.amazon.com%2Fconsole%2Fhome%3FhashArgs%3D%2523%26isauthcode%3Dtrue%26state%3DhashArgsFromTB_eu-north-1_f2d9c316b93c0026&client_idarn%3Aaws%3Asignin%3A%…

Glassdoor美国公司员工及面试者评价数据

一、数据简介 除了股东、债权人、政府等外部利益相关者外&#xff0c;员工的利益更应该得到公司的恰当保护&#xff0c;因为员工才是公司创造价值的真正主体。提高企业在产品市场的竞争力&#xff0c;首先就是要提高员工对企业的满意度&#xff0c;只有员工的满意度更高、幸福感…

7个技巧,助你同时轻松管理和跟踪多个项目

仅仅想到要兼顾这么多重要的职责&#xff0c;就会让许多专业的项目经理感到焦虑。当涉及多个项目的多种项目管理工具的处理&#xff0c;即使对于了解项目管理的项目经理来说&#xff0c;也是一项艰巨的任务&#xff0c;而对于在这个领域没有经过适当培训的人来说&#xff0c;这…

强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

计算机网络—数据链路层

文章目录 数据链路层服务差错编码多路访问协议信道划分随机访问MAC协议 数据链路层服务 该层中的帧数据结构&#xff1a; 帧头部会因为不同的局域网协议而不同&#xff0c;因此会在另一篇博文中继续介绍不同的帧数据报&#xff0c;不在本博文介绍。&#xff08;不过除了PPP协…

Docker学习笔记11

Docker容器镜像&#xff1a; 1&#xff09;docker client 向docker daemon发起创建容器的请求&#xff1b; 2&#xff09;docker daemon查找本地有客户端需要的镜像&#xff1b; 3&#xff09;如无&#xff0c;docker daemon则到容器的镜像仓库中下载客户端需要的镜像&#…

线性代数基础--向量

目录 向量的概念 基本概念 抽象概念 向量的意义 几何意义 物理意义 欧式空间 特点和性质 行向量与列向量 行向量 列向量 两者的关系 向量的基本运算与范数 向量的基本运算 向量的加法 数乘运算&#xff08;实数与向量相乘&#xff09; 转置 向量的范数 向量…

echart 设置柱状图y轴最大刻度

start 最近接到需求希望柱状图 y轴最大高度可以略高一些&#xff1b;柱状图的数据能展示在柱状图的上方 记录一下相关配置项 解决方案 官方文档说明 https://echarts.apache.org/zh/option.html#xAxis.max 效果 代码 {key: business,title: {text: 业务领域分类,textSt…

DAY32:回溯算法(七)全排列+全排列Ⅱ(排列问题)

文章目录 46.全排列思路树形图used数组的作用 伪代码完整版时间复杂度总结 47.全排列Ⅱ思路树形图 完整版时间复杂度总结 46.全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xf…

C#和LABVIEW的对决:哪种上位机编程语言更适合你?

今天&#xff0c;我们将谈论主流的上位机编程语言。你听说过C#和LABVIEW吗&#xff1f;它们是的上位机编程语言&#xff0c;C#作为自动化主流编程语言特别受欢迎&#xff0c;LABVIEW用于自动化测试&#xff0c; 首先&#xff0c;我们来了解C#语言。C#是一种文本语言&#xff0c…

2023年江西省研究生数模竞赛植物的多样性

2023年江西省研究生数模竞赛 植物的多样性 原题再现 植物作为食物链中的生产者&#xff0c;通过光合作用吸收二氧化碳&#xff0c;制造氧气&#xff0c;同时为其他生物提供食物和栖息地&#xff0c;支持它们的生存。植物在生态系统中还起到防止水土流失、缓解温室效应等作用。…

新手小白编程利器!Debug 断点调试工具IDEA

前言 很多新手小白在学习的时候总会遇到一个问题&#xff1a; 我们一运行程序&#xff0c;只能看到程序最后的结果&#xff0c;但是这个程序究竟是怎么一步步运行出这样的结果呢&#xff1f;如果有一个工具能够让我们看到我们程序的执行流程该有多好~ 这就需要用到新手小白编程…

modbus转MQTT网关支持自定义JSON格式

在工业自动化系统中&#xff0c;Modbus是一种非常常见的通信协议&#xff0c;而OPC UA则是近年来兴起的一种新型通信协议。由于各种设备之间使用的通信协议不尽相同&#xff0c;因此需要一种能够实现多种协议转换的网关产品。BL110网关就是一款能够实现Modbus到OPC UA转换的产品…

硬件设计-PLL篇(下)

目录 概要 整体架构流程 技术名词解释 技术细节 1.环路滤波器采用有源滤波器还是无源滤波器&#xff1f;、 2.如何设计 VCO 输出功率分配器&#xff1f;、 3.如何设置电荷泵的极性&#xff1f; 4.锁定指示电路如何设计&#xff1f; 小结 概要 提示&#xff1a;这里可以添加技术…

学习Spring的补充

《JavaEE 框架整合开发入门到实践 》这本书还是太浅了 &#xff0c;需要补充一些基本的知识。 首先修改一下快捷键&#xff0c;使得可以像eclipse一样使用alt/ 快速补全代码。 参考博客&#xff1a; (33条消息) IDEA 设置代码提示或自动补全的快捷键_idea补全提示_thirty.st…

【Java核心技术】面向对象编程

面向对象编程 1、面向过程与面向对象面向过程(POP)与面向对象(OOP)面向对象的三大特征面向对象的思想概述 2、Java语言基本元素&#xff1a;类和对象类和对象类和对象的使用&#xff08;面向对象思想落地的实现&#xff09;对象的创建和使用&#xff1a;内存解析 3、类的成员之…

【瑞萨RA6系列】CoreMark移植完全指南——UART输出和SysTick计时

一、CoreMark简介 什么是CoreMark&#xff1f; 来自CoreMark首页的解释是&#xff1a; CoreMark is a simple, yet sophisticated benchmark that is designed specifically to test the functionality of a processor core. Running CoreMark produces a single-number scor…

tomcat进程注入

跟随上一篇《java进程注入》 这里使用memShell https://github.com/rebeyond/memShell 将agent.jar和inject.jar放到tomcta的web目录下 然后输入命令注入 效果&#xff1a; 注入成功后 可以看到agent.jar文件为了防止发现&#xff0c;自动清除&#xff0c;而且重启电脑之后&…