STM32 4*4矩阵按键

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

(一)代码如下

/*********************************************************************
*按键用的PA8-PA11,PB12-PB15
*PA8-PA11为推挽输出
*PB12-PB15为下拉输入
*********************************************************************/
void KEY_Init(void)//按键初始化
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能A端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);	  //初始化GPIOA8-11	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能B端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 		 //下拉输入/逐行扫描GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);	  //初始化GPIOB12-15}/*********************************************************************
*函数说明: 按键扫描
*返回值  :  按键值
*参数    :  void
**********************************************************************/
int Key_Scan(void)
{int keyValue=0;//按键值u16 WriteVal=0;//给PA口写入的数据GPIO_Write(GPIOA,((GPIOA->ODR & 0x00ff )| 0x0f00));//让PA8-11输出高电平if((GPIOA->IDR & 0xf000)==0x0000)//若PB12-PB15全为0,则没有按键按下return -1;else{delay_ms(5);//延时消抖if((GPIOA->IDR & 0xf000)==0x0000)//若PB12-PB15全为0,则刚刚是抖动产生return -1;	}GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff )| 0x0100);//让PA8-11输出0001,检测第四行switch(GPIOB->IDR & 0xf000){case 0x1000 : keyValue=15;break;case 0x2000 : keyValue=14;break;case 0x4000 : keyValue=13;break;case 0x8000 : keyValue=12;break;	}GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff )| 0x0200);//让PA8-11输出0010,检测第三行switch(GPIOB->IDR & 0xf000){case 0x1000 : keyValue=12;break;case 0x2000 : keyValue=11;break;case 0x4000 : keyValue=10;break;case 0x8000 : keyValue=9;break;	}GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff )| 0x0400);//让PA8-11输出0100,检测第二行switch(GPIOB->IDR & 0xf000){case 0x1000 : keyValue=8;break;case 0x2000 : keyValue=7;break;case 0x4000 : keyValue=6;break;case 0x8000 : keyValue=5;break;	}GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff )| 0x0800);//让PA8-11输出1000,检测第一行switch(GPIOB->IDR & 0xf000){case 0x1000 : keyValue=4;break;case 0x2000 : keyValue=3;break;case 0x4000 : keyValue=2;break;case 0x8000 : keyValue=1;break;	}return keyValue;
}

(二)原理解释

首先,初始化端口4*4按键用了8个端口,我用的是PA和PB分别为4个,设置PA为行,初始化为推挽输出;设置PB为列,初始化为下拉输入。
将最后一行变为高电平,其余行为低电平,输出编码0001。然后读取列的电平,判断某一列是否按下,例如第1列按下,则PB的某一端口必定被拉高(PB被设置为下拉默认为低电平),只要检测PB口变高的位就可以知道哪一列被按下。若没有则执行检测下一行的程序。
接下来开始检测倒数第三行,将第3行变为高电平,输出编码0010.然后读取列的电平,判断某一列是否按下,例如第1列按下,则PB的某一端口必定被拉高(PB被设置为下拉默认为低电平),只要检测PB口变高的位就可以知道哪一列被按下。若没有则执行检测下一行的程序。
第二行和第一行的检测如上,当所有程序都执行一遍若还没有检测到按键继续执行下一遍按键扫描。

上述只是程序的一种实现方法,和51的检测方法类似,只不过在STM32里要自己配置IO口。上述程序检测的顺序可以颠倒,按自己喜欢的就好。注意端口一定要改的和自己的硬件相同才能正常工作


本文章仅供学习交流用禁止用作商业用途,文中内容来水枂编辑,如需转载请告知,谢谢合作

微信公众号:zhjj0729

微博:文艺to青年

简书:水枂

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

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

相关文章

编译原理:正规式转变成DFA算法

//将正规式转变成NFApackage hjzgg.formal_ceremony_to_dfa;import java.util.ArrayList;class Edge{public int u, v;public char key;public Edge(int u, int v, char key) {super();this.u u;this.v v;this.key key;}Overridepublic String toString() {return u "…

C语言实现音乐播放器(Linux madplay)

(一)需求分析 1.扫描指定路径下的音乐,并显示出来 2.实现音乐的播放、暂停、上一首和下一首的功能 3.程序退出释放内存资源 (二)思路 1.扫描出指定路径下的音乐文件(便利指定文件夹,找出音频文件放在数组…

编译原理(简单自动词法分析器LEX)

编译原理(简单自动词法分析器LEX)源程序下载地址: http://files.cnblogs.com/files/hujunzheng/%E6%B1%87%E7%BC%96%E5%8E%9F%E7%90%86%E7%AE%80%E5%8D%95LEX%EF%BC%88%E8%AF%8D%E6%B3%95%E8%87%AA%E5%8A%A8%E5%88%86%E6%9E%90%E5%99%A8%EF%…

虚拟机中安装linux

(一)前言 就在昨天电脑的固态突然崩掉,无奈重新把系统装在的以前的硬盘上,为了能够继续工作重新配置嵌入式linux系统开发环境,本教程主要记录在虚拟机中安装linux。 (二)环境准备 虚拟机&…

编译原理简单语法分析器(first,follow,分析表)源码下载

编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC%A6%E5%8F%B7%E5%90%8E%E7%9A%84%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90%E5%99%A8.zip 转载于:https://www.cnblogs.com/hujunzheng…

Ubuntu设置root登录

1.、Ubuntu 管理员用户 root 默认没有密码,在使用前最好添加密码,使用指令: sudo passwd root 注意:命令行输入密码时不显示,输入时需注意密码的准确性; 2、Ubuntu 想要用 root 帐户登录,可在普…

vim配置之spacevim

为了更好的利用vim,我们一般需要自己配置,今天介绍了一下经常用的spacevim (一)配置环境 Ubuntu16.04vim 7.4版本以上(必须!!) (二)安装spacevim 1.检查vim的版本: v…

Ubuntu更换gnome桌面环境后不能root登录

安装完Ubuntu后感觉界面有点丑陋,安装了gnome桌面环境试一下 sudo apt-get install gnome-shell sudo apt-get install ubuntu-gnome-desktop如果选择了lightdm后可以使用sudo dpkg-reconfigure gdm3 重新改回gdm3 sudo apt-get install unity-tweak-tool sudo ap…

Ubuntu下安装tilix终端仿真器

安装环境 Ubuntu 16.04 操作步骤 首先添加这个终端模拟器仓库的公钥。这里我都是以root超级用户权限操作的,如果没有的话,请在命令前面加sudo。 add-apt-repository ppa:webupd8team/terminixapt update安装Tilix。 apt install tilix安装完成测试结…

(扩展欧几里德算法)zzuoj 10402: C.机器人

10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远。由于受软硬件设计所限,机器人卡尔只能定点跳远。若机器人站在(X,Y)位置,它可以原地蹦,但只可…

vim配置之snippets代码块

(一)目的 我们在编写程序的过程中,经常会敲一些重复的代码,我们可以利用snippets来达到输入简写来敲出完整的代码 (二)安装步骤 安装使用Vundle,没有vbundle的先执行下面的命令 git clone https://gith…

Ubuntu 16.04 安装CodeBlocks

博主作为嵌入式开发者,经常使用c/c开发,所以今天来装一下经常使用的codeblocks,linux下代码编辑器有好多,可以上网搜一下linux下常用的代码编辑器就会出来好多,codeblocks作为c/c编辑器很方便,无论是安装还…

svn的安装与使用

Eclipse安装SVN插件 1、下载最新的Eclipse,我的版本是3.7.2 indigo(Eclipse IDE for Java EE Developers)版 如果没有安装的请到这里下载安装:http://eclipse.org/downloads/ 2、下载SVN插件subclipse,安装方法有两种.那种绿色的以link方式安…

c语言实现跳动的心

本文章分为两部分:第一部分为实现多彩的心,第二部分是实现心得跳动,两个代码均独立运行 本篇文章转载自公众号: C语言程序设计基础知识 (一)C语言实现多彩的心 实现过程其实很简单 首先使用for循环绘制心…

structs2之多文件上传

//首先是Action部分import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.UnsupportedEncodingException; import java.util.List;import javax.servlet.ServletContext; import org.apache.struts2.ServletActionContext;i…

Linux下使用消息队实现 ATM 自动取款机功能

文章分五部分:需求分析、项目所需知识点、思路讲解、代码实现、功能演示 本文内容较长,建议是按照我自己的思路给大家讲解的,如果有其他问题,欢迎评论区讨论 文章中的代码是在linux下编译实现的,注意自己的环境。 &…

200行代码实现视频人物实时去除

今天在GitHub上发现了一个好玩的代码,短短几百行代码就实现了从复杂的背景视频中去除人物,不得不说这位大佬比较厉害。 这个项目只需要在网络浏览器中使用JavaScript,用200多行TensorFlow.js代码,就可以实时让视频画面中的人物对…

codeforces C. Vanya and Scales

C. Vanya and ScalesVanya has a scales for weighing loads and weights of masses w0, w1, w2, ..., w100 grams where w is some integer not less than 2(exactly one weight of each nominal value). Vanya wonders whether he can weight an item with mass m using …

菱形继承和虚继承、对象模型和虚基表

1.菱形继承(钻石继承):两个子类继承同一父类,而又有子类同时继承这两个子类。例如B,C两个类同时继承A,但是又有一个D类同时继承B,C类。 2.菱形继承的对象模型 class A { public:int _a; };class B :public A { p…

c++虚函数和虚函数表

前言 (1)虚基表与虚函数表是两个完全不同的概念 虚基表用来解决继承的二义性(虚基类可以解决)。虚函数用来实现泛型编程,运行时多态。 (2)虚函数是在基类普通函数前加virtual关键字,是实现多态的基础 &a…