STM32 >> 矩阵键盘(代码风格优美,简明易懂)

您所在的位置:网站首页 单片机3*3矩阵按键原理图及代码大全 STM32 >> 矩阵键盘(代码风格优美,简明易懂)

STM32 >> 矩阵键盘(代码风格优美,简明易懂)

2024-07-15 23:10:31| 来源: 网络整理| 查看: 265

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

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)


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭