作者:李剀 出处: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矩阵键盘的更多相关文章

  1. STM32学习笔记——OLED屏

    STM32学习笔记--OLED屏 OLED屏的特点: 1.  模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2.  显示尺寸为0.96寸 3.  分辨率为128*64 4.   ...

  2. STM32学习笔记——点亮LED

    STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...

  3. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  4. stm32学习笔记——外部中断的使用

    stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...

  5. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  6. STM32学习笔记-NVIC中断知识点

    STM32学习笔记-NVIC中断知识点总结 中断优先级设置步骤 1. 系统运行后先设置中断优先级分组 函数:void NVIC_PriorityGroupConfig(uint32_tNVIC_Pri ...

  7. Directx11学习笔记【二十一】 封装键盘鼠标响应类

    原文:Directx11学习笔记[二十一] 封装键盘鼠标响应类 摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/ ...

  8. STM32学习笔记之一(初窥STM32)

    怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个 ...

  9. STM32学习笔记(一)——点亮一个LED

    引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...

随机推荐

  1. HackNine 避免在EditText中验证日期

    1.概要:    为什么不直接为EditTText设置一个点击监听器,而非要使用Button呢?     答案是:使用Button更安全,因为用户无法修改Button的文本内容.如果使用EditTex ...

  2. C# File类常用方法

    File 类 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象. 1. File.Exists ——  确定指定的文件是否存在. public static ...

  3. 如果plsql连接没问题,但程序中报ORA-12504的错误

    说明程序中配置数据库连接的地方没有写tnsnames.ora中的SERVICE_NAME,或者SERVICE_NAME写的有错,检查一下,改正应该就好了

  4. php 中 include 与 require 的区别

    以下内容转自:https://blog.csdn.net/hsd2012/article/details/51089785 网上太多关于php中include与require区别.其实说的都是经不起验 ...

  5. 【AGC010F】Tree Game 博弈论+暴力

    Description ​ 有一棵nn个节点的树,第ii条边连接ai,biai,bi,每个节点ii上有AiAi个石子,高桥君和青木君将在树上玩游戏 ​ 首先,高桥君会选一个节点并在上面放一个棋子,然后 ...

  6. [原创]ObjectARX开发环境搭建之VS2010+ObjectARX2012Wizard+Addin工具条问题修复

    目前ObjectARX版本越来越高,也越来越简化开发,如果需要同时开发低版本和高版本的ARX程序,就需要搭建批量编译环境,以满足ARX开发的需要. 批量编译的搭建网络上已经有了很多的教程,基本上都是基 ...

  7. P2252 取石子游戏 威佐夫博弈

    $ \color{#0066ff}{ 题目描述 }$ 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆 ...

  8. 递归-归并排序 思想 JAVA实现

    已知一个数组   15.58.61.75.21.32.89.4.78.83.采用递归实现的归并排序将数组有序. 分治策略:(摘自<算法导论>) 在分治策略中,我们采用递归解决问题 分解:将 ...

  9. 将多个单元格内容连接到一个单元格中(EXCEL)

    连接符号:& 如下图,我们要将表格中每名员工的姓名.入职时间以及年龄放入到同一个单元格中,形成以“-”连接的形式. 这时我们要用到Excel中的连接符“&”,也就是在按下Shift+数 ...

  10. [原创]在Centos7上搭建私有的Gitlab服务器

    前言 Git作为后起之秀,在版本控制领域占据了头把交椅.Github作为托管式的代码仓库,从代码安全性和网络传输等各个方面考虑,对于个人和公司来讲,具有一定的局限性.Gitlab提供的不同版本的安装包 ...