【STM32学习笔记】STM32f407 使用4*4矩阵键盘
作者:李剀 出处:https://www.cnblogs.com/kevin-nancy/
欢迎转载,但也请保留上面这段声明。谢谢!
写在前面: 这是本人第一次开始写博客,可能写的不是很好,也请大家谅解。
本人现在大三,以前在学习过程中遇到过各种各样的问题,关于51单片机,STM32单片机,最近在学习ARM11的Tiny6410
以后还会更新一些C/C++方面的东西
关于写博客这件事,其实 一直想写博客记录下来,但是因为某些原因(懒),so , 没有写。现在开始,以后遇到单片机上或者编程上遇到的问题,
并且自己很好地解决了,我就会在这里记录下来。
希望通过博客记录我的学习历程并希望我所解决问题的过程能够帮到需要的人,一起加油吧!!!
我使用的是STM32F407zg的最小系统板


使用HAL库,用STMCubeMX配置
1、首先介绍一下4*4矩阵键盘扫描原理
呃。。。。。就不介绍了,http://www.51hei.com/mcu/3815.html,这个写的挺好的
2、Cube配置

矩阵键盘从下到上依次接到STM32F407zg单片机的PD0~7引脚 ,其中,矩阵键盘下面的四个排针对应的是键盘的行(ROW)
上面四个对应列(COL) 这里我画了一张图来说明我所使用的

PD0-3依次对应3-0行 PD4-7依次对应0-3列 这张图里可以看到我画了两个箭头,下面就给大家说一下我的配置
配置PD0~3为推挽输出 PD4~7为下拉输入,下图是我在STM32CubeMX 5.1.0中配置的

上面的箭头,横向的表示是单片机输出给键盘的,竖向的是表示送给单片机的,也就是单片机配置的输入引脚
用来读取PD4~7的电平
3、程序编写
因为PD4~7为上拉输入,所以是处在一种高阻态(可以暂时理解为高电平,就是四列都为1)
我以扫描第一行为例讲解 ,


上述是软件实现部分, GPIO->IDR和0xf7相与, 若是0xe7 则二进制位1110 0111,说明PD4变为了0,所以第一列的按键
s1按下
note:PD7对应二进制数中的最高位 PD0对应最低位
后面以此类推
注意注意注意:在程序编写完后,可能出现有些行未扫描,有些行的按键按下没有通过串口返回信息
我的解决方法是,在每一行的扫描之前,将行所对应的引脚清空

这样就不会有问题了
4、贴上完整程序:
#include "keypad.h"
#include "stdint.h"
#include "stm32f4xx_hal.h"
uint16_t Key_scan(void)
{
uint16_t Key_val = 0; // 按键扫描返回键值,初始化为0
// 强调一下: 这里必须付一个初值0 否则串口打印出错
uint16_t temp;
/*=========================以下代码是按键扫描程序=========================*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); // 先清空引脚状态
/*----------------------------Scan the 1st ROW----------------------------*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET); // 设置PD0~2为1
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET); // 设置PD3为0 二进制编码为 0111
if((GPIOD->IDR & 0xF0) != 0xF0)
{
HAL_Delay(10); // 10ms延时消抖
if((GPIOD->IDR & 0xF0) != 0xF0)
{
temp = (GPIOD->IDR & 0xF7); // GPIOD->IDR寄存器为端口输入数据寄存器
switch(temp) // 用来读取GPIO口的电平状态
{
case 0xE7 : Key_val = 1;
break;
case 0xD7 : Key_val = 2;
break;
case 0xB7 : Key_val = 3;
break;
case 0x77 : Key_val = 4;
break;
default : Key_val = 0; break;
}
}
}
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
/*----------------------------Scan the 2nd ROW----------------------------*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
if((GPIOD->IDR & 0xF0) != 0xF0)
{
HAL_Delay(10); // 10ms延时消抖
if((GPIOD->IDR & 0xF0) != 0xF0)
{
temp = (GPIOD->IDR & 0xFB);
switch(temp)
{
case 0xEB : Key_val = 5;
break;
case 0xDB : Key_val = 6;
break;
case 0xBB : Key_val = 7;
break;
case 0x7B : Key_val = 8;
break;
default : Key_val = 0; break;
}
}
}
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
/*----------------------------Scan the 3rd ROW----------------------------*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);
if((GPIOD->IDR & 0xF0) != 0xF0)
{
HAL_Delay(10); // 10ms延时消抖
if((GPIOD->IDR & 0xF0) != 0xF0)
{
temp = (GPIOD->IDR & 0xFD);
switch(temp)
{
case 0xED : Key_val = 9;
break;
case 0xDD : Key_val = 10;
break;
case 0xBD : Key_val = 11;
break;
case 0x7D : Key_val = 12;
break;
default : Key_val = 0; break;
}
}
}
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
/*----------------------------Scan the 4th ROW----------------------------*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);
if((GPIOD->IDR & 0xF0) != 0xF0)
{
HAL_Delay(10); // 10ms延时消抖
if((GPIOD->IDR & 0xF0) != 0xF0)
{
temp = (GPIOD->IDR & 0xFE);
switch(temp)
{
case 0xEE : Key_val = 13;
break;
case 0xDE : Key_val = 14;
break;
case 0xBE : Key_val = 15;
break;
case 0X7E : Key_val = 16;
break;
default : Key_val = 0; break;
}
}
}
return Key_val;
}
5、 这是我的测试结果,见下图:

这个程序中的编码只是对应于我自己的接线,自己写的时候要注意自己的接线
上面有些连接是我上传的图片,我自己看的时候看不到图片,不知道什么原因,但是复制链接打开就是图片了
let‘s dream high 每个不满意的现在,都有一个不努力的曾经。加油吧
【STM32学习笔记】STM32f407 使用4*4矩阵键盘的更多相关文章
- STM32学习笔记——OLED屏
STM32学习笔记--OLED屏 OLED屏的特点: 1. 模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2. 显示尺寸为0.96寸 3. 分辨率为128*64 4. ...
- STM32学习笔记——点亮LED
STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...
- stm32学习笔记----双串口同时打开时的printf()问题
stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...
- stm32学习笔记——外部中断的使用
stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...
- STM32学习笔记(四)——串口控制LED(中断方式)
目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...
- STM32学习笔记-NVIC中断知识点
STM32学习笔记-NVIC中断知识点总结 中断优先级设置步骤 1. 系统运行后先设置中断优先级分组 函数:void NVIC_PriorityGroupConfig(uint32_tNVIC_Pri ...
- Directx11学习笔记【二十一】 封装键盘鼠标响应类
原文:Directx11学习笔记[二十一] 封装键盘鼠标响应类 摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/ ...
- STM32学习笔记之一(初窥STM32)
怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个 ...
- STM32学习笔记(一)——点亮一个LED
引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...
随机推荐
- vs2015+opencv3.3.1+ maxflow-v3.01 c++实现Yuri Boykov 的Interactive Graph Cuts
出的结果不理想. 感觉是tlink的权重的计算有问题,以及参数的设置.三个可设置参数是后面的 i j k .如果你找到了一组好参数请告诉我. 下载地址 http://download.csdn.ne ...
- zookeeper安装和使用 windows
的 Zookeeper 是以 3.4.5 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookeeper 的安装非常简单, ...
- SHTSC2017酱油记
考完回来累成狗..睡了一觉..补游记.. DAY0 把最近刷的题发了下题解..NOIP RK10的蒟蒻收拾收拾准备退役了.. 12点就睡了..很久周五没这么早睡了.. DAY1 9点就醒了..莫名紧张 ...
- Jmeter_Beanshell_使用Java处理JSON块
版权声明:本文为博主原创文章,转载请注明出处. [环境] ①Jmeter版本:3.2,JDK:1.8 ②前置条件:将json.jar包置于..\apache-jmeter-3.2\lib\下,并将该j ...
- python3使用newspaper快速抓取任何新闻文章正文
newspaper用于爬取各式各样的新闻网站 1,安装newspaper pip install newspaper3k 2,直接上代码 from newspaper import Article u ...
- Mysql数据库申请
前段时间大部门下新成立了一个推广百度OCR.文字识别.图像识别等科技能力在金融领域应用的子部门.因为部门刚成立,基础设施和人力都是欠缺的.当时分到我们部门的任务是抽调一个人做新部门主站前端开发工作.本 ...
- SDUT OJ 数据结构上机测试1:顺序表的应用
数据结构上机测试1:顺序表的应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...
- 分享记录一批免费VIP视频解析接口,不定时更新!
VIP视频接口的作用相信大家都懂,那么,由于接口的维护.开发具有不稳定性,失效率很高.这里收集一些目前可用的接口,如果不能用,请反馈给我删除,感谢大家! 电影<西虹市首富>优酷链接:htt ...
- C语言学习总结(1)——结构体
一,什么是结构体 我们知道数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄 ...
- windows xp 环境下 Oracle8i 双击安装文件无反应的解决办法
今天调试一份比较老的程序,数据库用的是Oracle8i,在本地xp系统上搞了半天,双击安装文件就是没反应! 在网上整理了一下解决办法: 1.将ORACLE软件拷贝到硬盘. (比如我拷贝到:F:\Ora ...