国产MCU兆易GD32实现矩阵按键扫描
一、矩阵键盘
为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。使用8个io口来进行16个按键的控制读取,可以减小io口的使用,用4条I/O线作为行线,4条I/O线作为列线组成的键盘。矩阵键盘检测方法主要有两种,一种是逐行扫描、一种是行列扫描。
1、逐行扫描
通过在矩阵按键的每一条行线上轮流输出低(高)电平,检测矩阵按键的列线,当检测到的列线不全为高(低)电平的时候,说明有按键按下。然后,根据当前输出低电平的行号和检测到低电平的列号组合,判断是哪一个按键被按下。
2、行列扫描
首先,在全部行线上输出低电平,检测矩阵按键的列线,当检测到的列线不全为高电平的时候,说明有按键按下,并判断是哪一列有按键按下。然后,反过来,在全部列线上输出低电平,检测矩阵按键的行线,当检测到的行线不全为高电平的时候,说明有按键按下,并判断是哪一行有按键按下。最后,根据检测到的行号和检测的列号组合,以判断是哪一个按键被按下。
二、程序设计
实现效果:逐行扫描矩阵键盘并打印出键值。
思路:保持一列输出高,重复扫描行。
key.c
#include "key.h"
uint8_t i=0,j=0;//行、列号
/************************************************
*@Function :key_Init
*@brief :按键GPIO初始化函数
*@param :void
*@retval : void
*************************************************/
void Key_Init(void)
{
//使能GPIO时钟
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
//四列 PB1 PB2 PB10 PB11 作为输出
gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_10MHZ,GPIO_PIN_1);
gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_10MHZ,GPIO_PIN_2);
gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_10MHZ,GPIO_PIN_10);
gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_10MHZ,GPIO_PIN_11);
//四行 PA3 PA4 PA5 PA6 下拉输入 默认为低电平
gpio_init(GPIOA,GPIO_MODE_IPD,GPIO_OSPEED_10MHZ,GPIO_PIN_3);
gpio_init(GPIOA,GPIO_MODE_IPD,GPIO_OSPEED_10MHZ,GPIO_PIN_4);
gpio_init(GPIOA,GPIO_MODE_IPD,GPIO_OSPEED_10MHZ,GPIO_PIN_5);
gpio_init(GPIOA,GPIO_MODE_IPD,GPIO_OSPEED_10MHZ,GPIO_PIN_6);
//列初始化为低电平
gpio_bit_reset(GPIOB, GPIO_PIN_1);
gpio_bit_reset(GPIOB, GPIO_PIN_2);
gpio_bit_reset(GPIOB, GPIO_PIN_10);
gpio_bit_reset(GPIOB, GPIO_PIN_11);
}
/************************************************
*@Function :Rank1_Scan(void)
*@brief :第一行扫描函数
*@param :void
*@retval : 0(可以返回行号i)
*************************************************/
uint8_t Rank1_Scan(void)
{
//第一列输出高,其它三列输出低
gpio_bit_set(GPIOB, GPIO_PIN_1);
gpio_bit_reset(GPIOB, GPIO_PIN_2);
gpio_bit_reset(GPIOB, GPIO_PIN_10);
gpio_bit_reset(GPIOB, GPIO_PIN_11);
//检测第一行按键状态,为高则按下
if(gpio_input_bit_get(GPIOA, GPIO_PIN_3)==1)
{
delay_1ms(10);//消抖
while(gpio_input_bit_get(GPIOA, GPIO_PIN_3)==1)
delay_1ms(10);
printf("KeyNumber:%d\r\n",KEY1);
}
//检测第二行按键状态,为高则按下
if(gpio_input_bit_get(GPIOA, GPIO_PIN_4)==1)
{
delay_1ms(10);;
while(gpio_input_bit_get(GPIOA, GPIO_PIN_4)==1)
delay_1ms(10);;
printf("KeyNumber:%d\r\n",KEY5);
}
//检测第三行按键状态
if(gpio_input_bit_get(GPIOA, GPIO_PIN_5)==1)
{
delay_1ms(10);;
while(gpio_input_bit_get(GPIOA, GPIO_PIN_5)==1)
delay_1ms(10);
printf("KeyNumber:%d\r\n",KEY9);
}
//检测第四行按键状态
if(gpio_input_bit_get(GPIOA, GPIO_PIN_6)==1)
{
delay_1ms(10);
while(gpio_input_bit_get(GPIOA, GPIO_PIN_6)==1)
delay_1ms(10);
printf("KeyNumber:%d\r\n",KEY13);
}
gpio_bit_reset(GPIOB, GPIO_PIN_1);//将第一列拉低回原状态
return 0;
}
主函数
#include "gd32f10x.h"
#include "gd32f103c_eval.h"
#include "systick.h"
#include "key.h"
#include "usart.h"
int main(void)
{
systick_config();//系统时钟
//USART相关配置
Usart_Init();
Key_Init();
printf("Init OK!\r\n");
while(1)
{
Rank1_Scan();
}
}
以上是行扫描实现思路,剩下的按键只需将剩下的三列依次保持一列输出高,重复扫描行即可。
三、实验现象
实际测试均能准确打印出键值。

四、程序优化
行扫描程序有大量重复代码,可以使用循环语句嵌套条件选择语句将四列依次置高,这样就只需要一段通用的行扫描语句,降低重复率。
国产MCU兆易GD32实现矩阵按键扫描的更多相关文章
- 【兆易创新RISC-V开发板评测】01.干货分享
背景介绍:2019年12月19日在面板包偶然发可以免费申请测评GD32VF103开发板,欣喜万分:在这之前各大技术论坛说是已经有国产兆易创新的RISCV指令集的MCU发布的事情,一时间摩拳擦掌想购入一 ...
- 国产mcu理论数据评估工作记录
目录 前言 简要工作记录 前言 时间:20210315 主要记录这两天对国内各IC厂商的 MCU 了解记录. 大环境,ST 厂商 MCU 疯狂涨价,国内 MCU 也越来越完善,还便宜.同时,全球缺晶圆 ...
- 【C51】单片机独立按键与矩阵按键
独立按键 首先既然是检测输入,对于当然要用到拉电阻,来检测引脚电平变化变化.51单片机中,除了P0口外,P2,P3,P4都是内置上拉电阻的准双向IO口,一般 的 51 P0引脚都外接了上拉电阻,当然也 ...
- AD按键-矩阵按键:
原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...
- AD按键-矩阵按键-独立按键:
原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...
- C51 原创电子琴 (蜂鸣器/计时器/中断/矩阵按键)
需求分析 用C51的16个矩阵按键当作两个八度的琴键 按下时发出相应音调的声音,静态数码管显示相应音符的数字. 为了解锁更多曲目,两个多的琴键设计成#4,显示时加上小数点 下图分别为1和#4的显示,其 ...
- C51 矩阵按键 个人笔记
矩阵按键 电路 每个按键一端和同行一端相连(JP4的高4位),另一端和同列一端相连(JP4的低4位) 判断按键是否按下: 法一:逐行扫描 for(int i = 8 ; i>3 ; i-- ) ...
- 【.NET 与树莓派】矩阵按键
欢迎收看火星卫视,本期节目咱们严重探讨一下矩阵按键. 所谓矩阵按键,就是一个小键盘(其实一块PCB板),上面有几个 Key(开关),你不按下去的时候,电路是断开的,你按下去电路就会接通.至于说有多少个 ...
- 4x4矩阵键盘扫描
4x4矩阵键盘扫描 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架 ...
- 4X4矩阵键盘扫描程序
4X4矩阵键盘扫描: 1. 4根行线的GIO均设为Output,根列线的GIO均设为Input: 2. 4根行线的GIO分别置为0111.1011.1101.1110,读逐一读取列线GIO的值,可确定 ...
随机推荐
- 从k8s 的声明式API 到 GPT的 提示语
命令式 命令式有时也称为指令式,命令式的场景下,计算机只会机械的完成指定的命令操作,执行的结果就取决于执行的命令是否正确.GPT 之前的人工智能就是这种典型的命令式,通过不断的炼丹,告诉计算机要怎么做 ...
- windows 10 家庭版安装Docker和portainer汉化版
目录 前景提要 存在问题 一.Docker的windows版本安装 1.官网下载: https://www.docker.com/(没有本文问题的直接下载就好.) 2.本文是找到其他版本的Docker ...
- 五月九号java基础知识点
1.哈希集合元素不按顺序排序,若要排序使用LinkedHashSet类2.树集合类不仅实现Set接口,还实现java.lang.SortedSet接口来实现排序操作3.TreeSet<Strin ...
- SQL语句的其他关键字
目录 数据准备 编写SQL语句小技巧 查询关键字之where筛选 查询关键字之group by 分组 查询关键字之having过滤 查询关键字之distinct去重 查询关键字之order by排序 ...
- 结合ChatGPT和MINDSHOW自动生成PPT
结合chatGPT和MINDSHOW自动生成PPT应用场景 总结/朱季谦 一.首先,通过chatGPT说明你的需求,学会提问是Ai时代最关键的一步.你需要提供一些关键信息,如果没有关键信息,就按照大纲 ...
- devops|中小公司不要做研发效能度量
我特别反感那些不顾公司现状一上来就想要做研发效能度量的人,尤其是想把研发效能度量当成锤子四处去敲打螺丝钉的人. 没几个人的小公司上来就做研发效能度量,就如同普通人一上来直接问媒婆怎么能娶到迪丽热巴.解 ...
- springboot项目 宿舍管理系统 (源码+数据库文件+1w字论文+ppt)
来了就点个赞再走呗,即将毕业的兄弟有福了文章底部获取源码springboot项目 宿舍管理系统 (源码+数据库文件+1w字论文+ppt)技术框架:java+springboot+vue+mysql后端 ...
- Gateway服务网关+过滤器
为什么需要网关 Gateway网关是我们服务的守门神,所有微服务的统一入口. 网关的核心功能特性: 请求路由 权限控制 限流 架构图: 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果 ...
- LDAP数据过滤问题
集成ldap同步用户遇到的问题: 首先说明同步需求: 业务需要只同步 objectClass 类型为user的用户 连接ldap查询用户的时候 过滤器只加了 .where("objectCl ...
- LeetCode 周赛 344(2023/05/07)手写递归函数的固定套路
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 今天下午有力扣杯战队赛,不知道官方是不是故意调低早上周赛难度给选手们练练手. 往期周赛回 ...