历史上的今天

今天是:2024年08月29日(星期四)

正在发生

2019年08月29日 | STM32 >> 矩阵键盘(代码风格优美,简明易懂)

发布者:SereneSoul55 来源: eefocus关键字:STM32  矩阵键盘  代码 手机看文章 扫描二维码
随时随地手机看文章

本文有关矩阵键盘的使用原理适用于所有微机控制器,同时也适用于所有规格的矩阵键盘。


key.h

/**

  ******************************************************************************

  * @file    bsp_key.h

  * @author  Waao

  * @version V1.0.0

  * @date    23-Jan-2019

  * @brief   This file contains some board support package's definition for the KEY.

  *            

  ******************************************************************************

  * @attention

  *

  * None

*

  ******************************************************************************

  */

#ifndef __BSP_KEY_H_

#define __BSP_KEY_H_



#include

#include

#include



// Column1, Column2, Column3, Column4

#define C1_PIN             GPIO_Pin_2

#define C1_GPIO_PORT       GPIOE

#define C1_GPIO_CLK        RCC_AHB1Periph_GPIOE


#define C2_PIN             GPIO_Pin_3

#define C2_GPIO_PORT       GPIOE

#define C2_GPIO_CLK        RCC_AHB1Periph_GPIOE


#define C3_PIN             GPIO_Pin_4

#define C3_GPIO_PORT       GPIOE

#define C3_GPIO_CLK        RCC_AHB1Periph_GPIOE


#define C4_PIN             GPIO_Pin_5

#define C4_GPIO_PORT       GPIOE

#define C4_GPIO_CLK        RCC_AHB1Periph_GPIOE



// Row1, Row2, Row3, Row4

#define R1_PIN             GPIO_Pin_12

#define R1_GPIO_PORT       GPIOB

#define R1_GPIO_CLK        RCC_AHB1Periph_GPIOB


#define R2_PIN             GPIO_Pin_13

#define R2_GPIO_PORT       GPIOB

#define R2_GPIO_CLK        RCC_AHB1Periph_GPIOB


#define R3_PIN             GPIO_Pin_14

#define R3_GPIO_PORT       GPIOB

#define R3_GPIO_CLK        RCC_AHB1Periph_GPIOB


#define R4_PIN             GPIO_Pin_15

#define R4_GPIO_PORT       GPIOB

#define R4_GPIO_CLK        RCC_AHB1Periph_GPIOB



// detect and output

#define DETECT_C1          GPIO_ReadInputDataBit(C1_GPIO_PORT, C1_PIN)

#define DETECT_C2          GPIO_ReadInputDataBit(C2_GPIO_PORT, C2_PIN)

#define DETECT_C3          GPIO_ReadInputDataBit(C3_GPIO_PORT, C3_PIN)

#define DETECT_C4          GPIO_ReadInputDataBit(C4_GPIO_PORT, C4_PIN)


#define DETECT_R1          GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN)

#define DETECT_R2          GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN)

#define DETECT_R3          GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN)

#define DETECT_R4          GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN)


// Keys

#define S1                 0x77

#define S2                 0xB7

#define S3                 0xD7

#define S4                 0xE7

#define S5                 0x7B

#define S6                 0xBB

#define S7                 0xDB

#define S8                 0xEB

#define S9                 0x7D

#define S10                0xBD

#define S11                0xDD

#define S12                0xED

#define S13                0x7E

#define S14                0xBE

#define S15                0xDE

#define S16                0xEE



void GPIO_RCC_Config(void);

void ROCI_GPIO_Config(void);

void RICO_GPIO_Config(void);

void KEY_GPIO_ConfigAndDetect(void);


#endif



有关输入输出管脚的选择可以多试验几组,有的管脚即使你配置成上拉输入,当你松开按键之后依然不会返回高电平,我在此就因为这个问题被卡了一阵子


关于我的矩阵键盘检测的原理简明阐述如下:


首先设置为行输出低电平,列上拉输入(即无外部干扰时保持高电平);

检测到按键按下,此时通过检测列的电平情况从而得知哪一列有按键被按下;

然后确定有按键被按下后,设置为列输出低电平,行上拉输入;

通过检测行的电平情况从而得知哪一行有按键被按下;

最后通过“不平行的两条直线相交于一点”原理,推知具体被按下的按键。

key.c

/**

  ******************************************************************************

  * @file    bsp_key.c

  * @author  Waao

  * @version V1.0.0

  * @date    23-Jan-2019

  * @brief   This file contains some board support package's functions for the KEY.

  *            

  ******************************************************************************

  * @attention

  *

  * None

*

  ******************************************************************************

  */


#include



/**

  * @brief  Initialize the RCC of the 8 GPIO line.

  * @param  None  

  * @retval None

  */

void GPIO_RCC_Config(void)

{

RCC_AHB1PeriphClockCmd(C1_GPIO_CLK, ENABLE);

RCC_AHB1PeriphClockCmd(C2_GPIO_CLK, ENABLE);

RCC_AHB1PeriphClockCmd(C3_GPIO_CLK, ENABLE);

RCC_AHB1PeriphClockCmd(C4_GPIO_CLK, ENABLE);


RCC_AHB1PeriphClockCmd(R1_GPIO_CLK, ENABLE);

RCC_AHB1PeriphClockCmd(R2_GPIO_CLK, ENABLE);

RCC_AHB1PeriphClockCmd(R3_GPIO_CLK, ENABLE);

RCC_AHB1PeriphClockCmd(R4_GPIO_CLK, ENABLE);

}



/**

  * @brief  Initialize the Row out Column in.

  * @param  None  

  * @retval None

  */

void ROCI_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_Structure;

//============ Column =============

GPIO_Structure.GPIO_Mode = GPIO_Mode_IN;

GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Structure.GPIO_OType = GPIO_OType_PP;

GPIO_Structure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Structure.GPIO_Pin = C1_PIN;

GPIO_Init(C1_GPIO_PORT, &GPIO_Structure);


GPIO_Structure.GPIO_Pin = C2_PIN;

GPIO_Init(C2_GPIO_PORT, &GPIO_Structure);


GPIO_Structure.GPIO_Pin = C3_PIN;

GPIO_Init(C3_GPIO_PORT, &GPIO_Structure);

GPIO_Structure.GPIO_Pin = C4_PIN;

GPIO_Init(C4_GPIO_PORT, &GPIO_Structure);

//============== Row ===============

GPIO_Structure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Structure.GPIO_OType = GPIO_OType_PP;

GPIO_Structure.GPIO_PuPd = GPIO_PuPd_DOWN;

GPIO_Structure.GPIO_Pin = R1_PIN;

GPIO_Init(R1_GPIO_PORT, &GPIO_Structure);


GPIO_Structure.GPIO_Pin = R2_PIN;

GPIO_Init(R2_GPIO_PORT, &GPIO_Structure);


GPIO_Structure.GPIO_Pin = R3_PIN;

GPIO_Init(R3_GPIO_PORT, &GPIO_Structure);

GPIO_Structure.GPIO_Pin = R4_PIN;

GPIO_Init(R4_GPIO_PORT, &GPIO_Structure);

GPIO_ResetBits(R1_GPIO_PORT, R1_PIN);

GPIO_ResetBits(R2_GPIO_PORT, R2_PIN);

GPIO_ResetBits(R3_GPIO_PORT, R3_PIN);

GPIO_ResetBits(R4_GPIO_PORT, R4_PIN);

}



/**

  * @brief  Initialize the Row in Column out.

  * @param  None  

  * @retval None

  */

void RICO_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_Structure;

//============== Row ==================

GPIO_Structure.GPIO_Mode = GPIO_Mode_IN;

GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Structure.GPIO_OType = GPIO_OType_PP;

GPIO_Structure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Structure.GPIO_Pin = R1_PIN;

GPIO_Init(R1_GPIO_PORT, &GPIO_Structure);


GPIO_Structure.GPIO_Pin = R2_PIN;

GPIO_Init(R2_GPIO_PORT, &GPIO_Structure);

GPIO_Structure.GPIO_Pin = R3_PIN;

GPIO_Init(R3_GPIO_PORT, &GPIO_Structure);

GPIO_Structure.GPIO_Pin = R4_PIN;

GPIO_Init(R4_GPIO_PORT, &GPIO_Structure);

//============ Column ================

GPIO_Structure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Structure.GPIO_OType = GPIO_OType_PP;

GPIO_Structure.GPIO_PuPd = GPIO_PuPd_DOWN;

GPIO_Structure.GPIO_Pin = C1_PIN;

GPIO_Init(C1_GPIO_PORT, &GPIO_Structure);


GPIO_Structure.GPIO_Pin = C2_PIN;

GPIO_Init(C2_GPIO_PORT, &GPIO_Structure);

GPIO_Structure.GPIO_Pin = C3_PIN;

GPIO_Init(C3_GPIO_PORT, &GPIO_Structure);

GPIO_Structure.GPIO_Pin = C4_PIN;

GPIO_Init(C4_GPIO_PORT, &GPIO_Structure);

GPIO_ResetBits(C1_GPIO_PORT, C1_PIN);

GPIO_ResetBits(C2_GPIO_PORT, C2_PIN);

GPIO_ResetBits(C3_GPIO_PORT, C3_PIN);

GPIO_ResetBits(C4_GPIO_PORT, C4_PIN);

}



/**

  * @brief  Configure the GPIO, and detect whether the key was pressed down

  * @param  None  

  * @retval None

  */

void KEY_GPIO_ConfigAndDetect(void)

{

u8 TEMP_COMBINE = 0, TEMP_ROCI = 0, TEMP_RICO = 0;

GPIO_RCC_Config();

printf("nWhy so serious ?tThe game just begin!");

while(1)

{

ROCI_GPIO_Config();

TEMP_ROCI = (u8)(((u8)DETECT_C1) << 3) |

(((u8)DETECT_C2) << 2) |

(((u8)DETECT_C3) << 1) |

(((u8)DETECT_C4) << 0);

if(TEMP_ROCI != 0x0f)

{

Delay(1000); // Eliminate the shaking. The parameter's unit is 10us

if(TEMP_ROCI != 0x0f) // Ensure one of the keys was pressed down indeed.

{

RICO_GPIO_Config();

TEMP_RICO = (u8)(((u8)DETECT_R1) << 3) |

(((u8)DETECT_R2) << 2) |

(((u8)DETECT_R3) << 1) |

(((u8)DETECT_R4) << 0);

TEMP_COMBINE = (u8)((TEMP_ROCI << 4) | TEMP_RICO); // Combine the two situation and we can know which key was pressed down.

switch(TEMP_COMBINE)

{

case S1:

printf("nS1 was pressed down!");

break;

case S2:

printf("nS2 was pressed down!");

break;

case S3:

printf("nS3 was pressed down!");

break;

case S4:

printf("nS4 was pressed down!");

break;

[1] [2]
关键字:STM32  矩阵键盘  代码 引用地址:STM32 >> 矩阵键盘(代码风格优美,简明易懂)

上一篇:STM32F429 >> 22. FMC_扩展外部SDRAM(Code)
下一篇:STM32学习笔记1-----初识stm32F429IGT6

推荐阅读

无人化是未来智慧工厂的大趋势,而替代人工完成包括物件运输、分拣等环节的机器人无疑是智慧工厂的基础,这里将为大家介绍智慧工厂中的AGV小车如何实现无线通讯。 随着中国制造2025计划的逐步扩大及深化,全自动化生产线已基本完成,但制造工厂的货物及原材料的搬运、装卸、码放仍然由人工操作居多,工作内容单一重复,随着国内人工成本的进一步提高及企业...
在 2019人工智能计算大会上,IDC和浪潮联合发布了《2019-2020中国人工智能计算力发展评估报告》(以下简称:《报告》)。《报告》显示,2019年中国人工智能化水平前十位城市依次为北京、杭州、深圳、上海、广州、合肥、苏州、重庆、南京、西安。和去年相比,2019年北京超越杭州位列中国算力榜首,⼴州、苏州、重庆和西安这五个城市的排名都所提⾼,苏州、...
今日,长江存储正式发布SSD品牌 “致钛•ZHITAI”,面向3D NAND闪存产品及解决方案市场。快科技指出,这第一款SSD产品,是一款M.2接口的SSD硬盘。从图中可以看到正面有2颗闪存、1颗主控及1个DRAM缓存,具体规格不祥,但是上了DRAM缓存意味着性能不会低。至于通道是PCIe 3.0还是PCIe 4.0,前者的可能性比较大。
8月27日消息,今日,中国互联网络信息中心(CNNIC)发布第48次《中国互联网络发展状况统计报告》(以下简称《报告》)。  《报告》显示,2021年上半年,我国信息产业技术多个领域取得积极进展。  在6G通信技术领域,我国已成为6G专利申请的主要来源国。  当前6G通信技术领域全球专利申请量超过3.8万项,其中我国专利申请占比35%(1.3万余...

史海拾趣

问答坊 | AI 解惑

S3C2440 65x45mm核心板电路图

本人画的,有需要PCB的可以找我! [ 本帖最后由 青叶漂零 于 2009-3-21 22:42 编辑 ]…

查看全部问答∨

电子方面的困惑

想问下,举个例子吧,像那个遥控器,modem,还有收音机这些个电子产品,我该如何去学习啊,我现在对这个比较感兴趣, ,看了好些个论坛什么的,都说学电路分析,还有模拟电路,数字电路,单片机等等。我也看过,但是总是感觉一点都没有学会。 想 ...…

查看全部问答∨

wince 挂起后, 闹铃

现在是想在 wince 挂起后,待机后, 自已写的闹铃程序不受影响,到达设定的时候时,还能正常响铃... 大家帮忙..谢谢..…

查看全部问答∨

windows ce如何与WINDOWS xp联网

  我是刚接触使用WINDOWS ce的新手,我的要求是XP如何与WINDOWS CE通过交换机连接,我现在可以在XP的电脑上PING通WINDOWS CE电脑上的IP,我需要怎么做才可以看到WINDOWS CE上的数据.因为我太需要WINDOWS ce上的数据文件,   麻烦 ...…

查看全部问答∨

德州仪器首款集成超声波T/R开关

$(\'swf_j28\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMjgwODg3Mzk2/v.sw ...…

查看全部问答∨

基于AD9288/DSP的数字图像采集处理

首先谢谢EEWORLD,ADI,也特别谢谢SOSO姐 。 之前提交的方案,系统比较复杂,时间有限到目前为止完成了部分功能,还没有完全做完,先汇报下一些硬件原理一些相关的。采用双CIS(Contact image sensor)采集的模拟信号经过运放放大到AD的采样的合适 ...…

查看全部问答∨

【设计工具】ISE 设计套件 11.1 应用问答

ISE 设计套件 11.1 应用问答。     [ 本帖最后由 GONGHCU 于 2012-2-21 03:15 编辑 ]…

查看全部问答∨

C2000定点和浮点处理器的乘/除法,FFT性能比较

性能比较表如下:  算法 F2812 (周期) F28335 (周期) 除法 70 24 均方根 60 27 正弦、余弦 90 44 FFT (256点) 大约27000 大约11000…

查看全部问答∨

【求助】如何修改MSP430 xcl文件

如何修改MSP430 xcl文件 让程序在用户自定义的FLASH段运行及进行其他操作、 …

查看全部问答∨

msp430运用定时器A和比较器A测电阻。不知道问题出在哪里

#include "msp430x14x.h" #define REF_O (P1DIR |= BIT3) #define MEA_O (P1DIR |= BIT4) #define REF_I (P1DIR |= BIT3) #define MEA_I (P1DIR |= BIT4) #define REF_H (P1OUT |= BIT3) #define REF_L (P1OUT &= ~BIT3) #define MEA_ ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved