一:开个头

之前学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的矩阵按键程序思路相关推荐

  1. 基于GD32矩阵按键程序实现

    目录 一.简介 二.原理图 三.程序实现 一.简介 矩阵键盘,也称矩阵按键,是为了节约单片机IO口占用所引入的一种外设. 二.矩阵按键的原理图 三.程序实现 GPIO初始化引脚代码 /*!\brief ...

  2. STM32 4*4矩阵按键

    本文章讲述了如何用STM32编写4*4矩阵按键程序,先简单介绍一下扫描的基本方法:1.反转法 2.行列扫描.本文主要介绍行列扫描 欢迎加入嵌入式学习群:559601187 (一)代码如下 /***** ...

  3. 单片机C语言之学习矩阵按键

    新手记录学习:单片机C语言之矩阵按键 一.先画好原理图,了解基本原理: 二.再构思一下基本的程序思路: 矩阵按键扫描思路: 1.如单个IO检测按键,IO口要检测到高低电平变化,才能检测到按键:那么矩阵 ...

  4. 蓝桥杯单片机 独立按键与矩阵按键

    文章目录 前言 一.蓝桥杯按键原理图 二.独立按键与矩阵按键处理思路 1.独立按键 2.矩阵按键 代码实现 总结 前言 按键设计一般分为两种:独立按键和矩阵键盘.按键数量较少的用前者,按键数量较多的用 ...

  5. AD按键-矩阵按键-独立按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  6. c语言单片机实现按钮互锁,用单片机数码管和矩阵按键实现密码锁功能 附原理图+源程序...

    #include "digdisplay.h"                        //矩阵按键输入10(键表面为S11,程序中默认都是数值)为密码确认,矩阵按键输入11 ...

  7. STM32F103 矩阵键盘4*4 16*16等任意矩阵 按键扫描程序

    基于STM32的按键扫描测试程序(学习记录): 目录: 源码: 4x4按键原理: 按键扫描逻辑: Tips: 粘贴代码时,粘贴在源文件存放的位置中(如:HARDWARE中的.c和.h文件),用C++编 ...

  8. 4x4矩阵键盘工作原理及扫描程序_单片机人机交互矩阵按键

    按键是一种常开型按钮开关,与单片机的常见接法如图所示.按键未按下时两个触点断开,单片机I/O口输入高电平:当按键闭合时,I/O口输入低电平. 一.按键讲解 当I/O口为P0口时,由于没有内部上拉电阻, ...

  9. 矩阵键盘程序_独立按键与矩阵按键

    一.独立按键原理 按键在闭合和断开时,触点会存在抖动现象 硬件消抖电路 独立按键控制程 二.独立按键控制程序 #include "reg52.h" typedef unsigned ...

最新文章

  1. ubuntu kylin 18.04 安装 Qt Creator 5.11
  2. 获取邮箱通讯录,msn好友列表的C#源码
  3. 一个不错的权限管理模块设计案例
  4. BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元
  5. Redux vs Mobx系列(-):immutable vs mutable
  6. 不仅性能秒杀Hadoop,现在连分布式集群功能也开源了
  7. 前后落差大用什么词语_语文考题一共有五类:汉字类、词语类、句子类、阅读类、作文类,如果基础扎实,答题技巧弄懂了,哪一类都能拿高分!...
  8. Python高级——多进程(multiprocessing)
  9. matlab在电气信息类专业中的应用,MATLAB在电气信息类专业中的应用(高等学校应用型特色规划...
  10. 有效解决vue动态绑定多个class的官方实例语法无效的问题
  11. c语言的条件运算符,C语言条件运算符
  12. JavaEE | 集合之HashMap与ConcurrentHashMap(看完多线程后补充)
  13. 乔戈里推荐的新版Java学习路线,开源!
  14. python保存结果到txt_如何将python运行结果保存成txt,万分感谢呐
  15. c语言eallow,求大神指导C语言框图设计!!!
  16. 链表中为何使用二级指针
  17. 类的成员函数作为函数指针
  18. QT disconnect
  19. iptv信息服务器,IPTV点播电影类服务最获青睐
  20. 可观测性-Metrics-Kafka监控

热门文章

  1. Python使用窗口打开文件
  2. Mysql密码修改方式
  3. html5通用兄第选择器,css 通用兄弟选择器( ~ )
  4. Flutter 和小程序混编
  5. 一年级的小孩可以学习机器人编程
  6. HBase2.x(一)HBase简介
  7. 2020 - 04 - 11 个人笔记
  8. 5G商用牌照发放,“以竞争促落地”,日常5G服务可期。
  9. ACM进阶计划(来自于南阳理工学院)
  10. 禁止MDA对话框的产生