本文有关矩阵键盘的使用原理适用于所有微机控制器,同时也适用于所有规格的矩阵键盘。
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;
上一篇:STM32F429 >> 22. FMC_扩展外部SDRAM(Code)
下一篇:STM32学习笔记1-----初识stm32F429IGT6
推荐阅读
史海拾趣
随着科技的不断进步和消费者需求的日益多样化,电子行业面临着巨大的变革压力。Euvis Inc公司敏锐地洞察到这一趋势,积极调整战略方向,将业务拓展至物联网、智能家居等新兴领域。通过不断的技术创新和市场拓展,公司成功应对了行业变革带来的挑战,保持了持续的发展势头。
随着电子行业的快速发展,客户对电容器的需求日益多样化。CDE公司积极应对市场变化,致力于定制化电容器的研发与应用。公司利用数学建模和定制化的仿真App对电容器的设计进行微调,以满足不同客户的特定需求。这一举措不仅提升了CDE的市场竞争力,也为公司在定制化电容器领域树立了领先地位。
进入千禧年代,C&K因其卓越的市场表现和技术实力被ITT Industries收购。虽然成为了ITT的开关部门,但C&K仍然保留了自己的品牌名称。这一举措既保证了C&K能够继续享有ITT的资源支持,又使得C&K能够保持其独特的品牌文化和市场定位。
巨盛电子(Chesen)自创立之初,就坚持将技术创新作为公司的核心竞争力。在电子行业迅速发展的背景下,公司投入大量资源进行研发,成功推出了一系列具有领先技术水平的电子产品。这些产品不仅满足了市场对于高品质、高性能电子产品的需求,还通过创新功能赢得了消费者的青睐。巨盛电子凭借技术创新,逐渐在电子行业中崭露头角,成为市场的领导者。
随着业务的不断发展和市场的不断扩大,意瑞半导体也积极寻求外部投资和战略合作。公司先后获得了得彼投资、架桥投资、深创投等机构超2亿元的股权投资,为公司的持续发展提供了有力的资金保障。此外,意瑞半导体还积极参与各种行业活动和展览,与业界同仁进行深入交流和合作,共同推动半导体行业的发展。
以上五个故事素材可以根据需要进一步扩展和细化,以形成完整的、具有吸引力的电子行业意瑞半导体公司的发展故事。
德国ACAM公司成立于1996年,总部位于施图登湖,毗邻斯图加特和卡尔斯鲁厄。公司从创立之初,就专注于时间到数字转换技术及其应用的研发。ACAM公司凭借其创新的技术和卓越的研发实力,在极短的时间内就取得了显著的成果。特别是在时间数字转换器(TDC)技术上,ACAM公司成功开发出业界领先的产品,为后续的快速发展奠定了坚实的基础。
我是刚接触使用WINDOWS ce的新手,我的要求是XP如何与WINDOWS CE通过交换机连接,我现在可以在XP的电脑上PING通WINDOWS CE电脑上的IP,我需要怎么做才可以看到WINDOWS CE上的数据.因为我太需要WINDOWS ce上的数据文件, 麻烦 ...… 查看全部问答∨ |
|
$(\'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 ...… 查看全部问答∨ |
首先谢谢EEWORLD,ADI,也特别谢谢SOSO姐 。 之前提交的方案,系统比较复杂,时间有限到目前为止完成了部分功能,还没有完全做完,先汇报下一些硬件原理一些相关的。采用双CIS(Contact image sensor)采集的模拟信号经过运放放大到AD的采样的合适 ...… 查看全部问答∨ |
性能比较表如下: 算法 F2812 (周期) F28335 (周期) 除法 70 24 均方根 60 27 正弦、余弦 90 44 FFT (256点) 大约27000 大约11000… 查看全部问答∨ |
|
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_ ...… 查看全部问答∨ |