STM32的矩阵按键程序思路
一:开个头
之前学52的时候学过矩阵按键的程序,但是当我第一次拿到32板子写程序的时候还是有一点懵,不过还来理理思路,感觉想一想还是可以写出来的,我这次是没有自己去焊矩阵按键,而是买了一个薄膜按键,省去了焊接的麻烦//手动狗头//
二:操作实物图
就是这个啦!!!应该可以看出来黄色的线连着的是矩阵按键的行,橙色线连着的事矩阵按键的列,下面解释的时候我会用行和列来说
三:程序思路
1、首先一个大思路,我们用矩阵按键的时候,首先是先确定哪一行,接着是哪一列
(1)我让行作输出,并输出低电平,列作输入,并读取电平,当有按键按下的时候就会有电平变化–>这个是用来判断是哪一行
void KEY_L_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
// RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE);//列GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//输入上拉 GPIO_InitStructure.GPIO_Pin=KEY_L0_GPIO_PIN|KEY_L1_GPIO_PIN|KEY_L2_GPIO_PIN|KEY_L3_GPIO_PIN;GPIO_Init(GPIOA,&GPIO_InitStructure);//行GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin=KEY_R0_GPIO_PIN|KEY_R1_GPIO_PIN|KEY_R2_GPIO_PIN|KEY_R3_GPIO_PIN;GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_ResetBits(GPIOA,KEY_R0_GPIO_PIN|KEY_R1_GPIO_PIN|KEY_R2_GPIO_PIN|KEY_R3_GPIO_PIN);
}
(2)下面确定哪一列,因为我们刚刚确定了哪一行,只要确定哪一列,就可以找出按下的位置,这次思路是让列输出并输出高电平,让行作输入并读取电平变化
void KEY_R_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
// RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE); //列GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin=KEY_L0_GPIO_PIN|KEY_L1_GPIO_PIN|KEY_L2_GPIO_PIN|KEY_L3_GPIO_PIN;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,KEY_L0_GPIO_PIN|KEY_L1_GPIO_PIN|KEY_L2_GPIO_PIN|KEY_L3_GPIO_PIN);//行GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; //浮空输入GPIO_InitStructure.GPIO_Pin=KEY_R0_GPIO_PIN|KEY_R1_GPIO_PIN|KEY_R2_GPIO_PIN|KEY_R3_GPIO_PIN;GPIO_Init(GPIOA,&GPIO_InitStructure);
}
(3)下面只需要作按键位置处理就可以了
char KeyScan(void)
{u8 column=0;char Key_Number=0;KEY_L_Init(); //行做输出低电平,列读取电平while(1){if(PAin(7)==0){delay_ms(100);if(PAin(7)==0){column=1; //如果第一列读到低电平}}if(PAin(6)==0){delay_ms(100);if(PAin(6)==0){column=2; //如果第二列读到低电平}}if(PAin(5)==0){delay_ms(100);if(PAin(5)==0){column=3; //如果第三列读到低电平}}if(PAin(4)==0){delay_ms(100);if(PAin(4)==0){column=4; //如果第四列读到低电平}}if(column==1){delay_ms(50);KEY_R_Init(); //列做输出高电平,行读取电平 if(column==1){if(PAin(3)==1){Key_Number='1';break; //第一行}if(PAin(2)==1){Key_Number='2';break; //第二行}if(PAin(1)==1){Key_Number='3';break; //第三行}if(PAin(0)==1){Key_Number='A';break; //第四行}}}if(column==2){delay_ms(50);KEY_R_Init(); //列做输出高电平,行读取电平 if(column==2){if(PAin(3)==1){Key_Number='4';break; //第一行}if(PAin(2)==1){Key_Number='5';break; //第二行}if(PAin(1)==1){Key_Number='6';break; //第三行}if(PAin(0)==1){Key_Number='B';break; //第四行}}}if(column==3){delay_ms(50);KEY_R_Init(); //列做输出高电平,行读取电平 if(column==3){if(PAin(3)==1){Key_Number='7';break; //第一行}if(PAin(2)==1){Key_Number='8';break; //第二行}if(PAin(1)==1){Key_Number='9';break; //第三行}if(PAin(0)==1){Key_Number='C';break; //第四行}}}if(column==4){delay_ms(50);KEY_R_Init(); //列做输出高电平,行读取电平 if(column==4){if(PAin(3)==1){Key_Number='*';break; //第一行}if(PAin(2)==1){Key_Number='0';break; //第二行}if(PAin(1)==1){Key_Number='#';break; //第三行}if(PAin(0)==1){Key_Number='D';break; //第四行}}}}return Key_Number;
}
总结
虽然代码有点长,但是切实可行,对了,这里还有一个问题我当时也纠结了一下啊,就是按键延时消抖动,我这个延时时间还挺合适的,不过这个可以随自己的喜好去修改,如果你有更好的方法,可以分享给我学习一下,嘻嘻嘻~
STM32的矩阵按键程序思路相关推荐
- 基于GD32矩阵按键程序实现
目录 一.简介 二.原理图 三.程序实现 一.简介 矩阵键盘,也称矩阵按键,是为了节约单片机IO口占用所引入的一种外设. 二.矩阵按键的原理图 三.程序实现 GPIO初始化引脚代码 /*!\brief ...
- STM32 4*4矩阵按键
本文章讲述了如何用STM32编写4*4矩阵按键程序,先简单介绍一下扫描的基本方法:1.反转法 2.行列扫描.本文主要介绍行列扫描 欢迎加入嵌入式学习群:559601187 (一)代码如下 /***** ...
- 单片机C语言之学习矩阵按键
新手记录学习:单片机C语言之矩阵按键 一.先画好原理图,了解基本原理: 二.再构思一下基本的程序思路: 矩阵按键扫描思路: 1.如单个IO检测按键,IO口要检测到高低电平变化,才能检测到按键:那么矩阵 ...
- 蓝桥杯单片机 独立按键与矩阵按键
文章目录 前言 一.蓝桥杯按键原理图 二.独立按键与矩阵按键处理思路 1.独立按键 2.矩阵按键 代码实现 总结 前言 按键设计一般分为两种:独立按键和矩阵键盘.按键数量较少的用前者,按键数量较多的用 ...
- AD按键-矩阵按键-独立按键:
原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...
- c语言单片机实现按钮互锁,用单片机数码管和矩阵按键实现密码锁功能 附原理图+源程序...
#include "digdisplay.h" //矩阵按键输入10(键表面为S11,程序中默认都是数值)为密码确认,矩阵按键输入11 ...
- STM32F103 矩阵键盘4*4 16*16等任意矩阵 按键扫描程序
基于STM32的按键扫描测试程序(学习记录): 目录: 源码: 4x4按键原理: 按键扫描逻辑: Tips: 粘贴代码时,粘贴在源文件存放的位置中(如:HARDWARE中的.c和.h文件),用C++编 ...
- 4x4矩阵键盘工作原理及扫描程序_单片机人机交互矩阵按键
按键是一种常开型按钮开关,与单片机的常见接法如图所示.按键未按下时两个触点断开,单片机I/O口输入高电平:当按键闭合时,I/O口输入低电平. 一.按键讲解 当I/O口为P0口时,由于没有内部上拉电阻, ...
- 矩阵键盘程序_独立按键与矩阵按键
一.独立按键原理 按键在闭合和断开时,触点会存在抖动现象 硬件消抖电路 独立按键控制程 二.独立按键控制程序 #include "reg52.h" typedef unsigned ...
最新文章
- ubuntu kylin 18.04 安装 Qt Creator 5.11
- 获取邮箱通讯录,msn好友列表的C#源码
- 一个不错的权限管理模块设计案例
- BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元
- Redux vs Mobx系列(-):immutable vs mutable
- 不仅性能秒杀Hadoop,现在连分布式集群功能也开源了
- 前后落差大用什么词语_语文考题一共有五类:汉字类、词语类、句子类、阅读类、作文类,如果基础扎实,答题技巧弄懂了,哪一类都能拿高分!...
- Python高级——多进程(multiprocessing)
- matlab在电气信息类专业中的应用,MATLAB在电气信息类专业中的应用(高等学校应用型特色规划...
- 有效解决vue动态绑定多个class的官方实例语法无效的问题
- c语言的条件运算符,C语言条件运算符
- JavaEE | 集合之HashMap与ConcurrentHashMap(看完多线程后补充)
- 乔戈里推荐的新版Java学习路线,开源!
- python保存结果到txt_如何将python运行结果保存成txt,万分感谢呐
- c语言eallow,求大神指导C语言框图设计!!!
- 链表中为何使用二级指针
- 类的成员函数作为函数指针
- QT disconnect
- iptv信息服务器,IPTV点播电影类服务最获青睐
- 可观测性-Metrics-Kafka监控