《2022年2022年矩阵键盘 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年矩阵键盘 .pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 4 4 矩阵键盘1原理说明一般的 4*4 矩阵键盘(如图1)一般要 8 个 I/O 口(如图 1) ,对于按键较多的硬件系统来说是很浪费的I/O 口, 本方案仅采用4 个 I/O 和 4 个普通二极管就可以轻松实现4 4 矩阵键盘, 方案原理与普通4*4 矩阵键盘类似, 下面先分析普通矩阵键盘原理,再进一步改进为本方案。原理如下B4 口为低电平, A1 A4,B1 B3 为高电平,单片机不停的扫描,假若有键按下如 A1 与 B4 交叉处按下则对应的A1 被拉低为低电平,可以定义此键号为1,同理以此类推 B3 口为低电平,其余口为高电平,交叉处按键按下可定义其按键号,将按键号存储在寄存器中,
2、可用查表方法并通过数码管显示按键号。对于下图(图2)用 4 个 I/O 和 4 个普通二极管初始化PA0.0 PA0.3 均为高电平,在这里二极管作用是当IO 口为低电平时可以导通,高电平时截止。程序流程图如下图 1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - 2 图 2 2 程序介绍如下void RCC_Configuration(void); RCC_APB2PeriphClockCmd(RCC_APB2Periph_G
3、PIOA|RCC_APB2Periph_AFIO,ENABLE); void GPIO_Configuration(void) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_PP _ OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GP
4、IO_InitStructure); GPIOSetBits() GPIO_SetBits(GPIOA,GPIO_Pin_0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - 3 GPIO_SetBits(GPIOA,GPIO_Pin_1); GPIO_SetBits(GPIOA,GPIO_Pin_2); GPIO_SetBits(GPIOA,GPIO_Pin_3); 单片机不停的扫描程序,(右侧四个键单独来写),由于扫描速度
5、是很快(微妙级)的,所以有足够的时间去显示每个按键的。当( GPIO_Pin_0=0 )时表明有键按下,我们定义为0 号键,当( GPIO_Pin_1=0 )时表明有键按下,我们定义为1 号键,当( GPIO_Pin2=0 ) 时表明有键按下,我们定义为2 号键,当( GPIO_Pin_3=0 )时表明有键按下,我们定义为3 号键,if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)=0) return 0; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)=0) return 1; if(GPIO_ReadInputDa
6、taBit(GPIOA, GPIO_Pin_2)=0) return 2; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) return 3; 其余按键方法不同于右侧四个按键,每个I/O 口接一个二极管以保证当有高电平截止,低电平导通,即可得到每个键号。扫描程序分析如下:当( GPIO_Pin_0=0) 时:若(GPIOA, GPIO_Pin_1)=0) 则为 4 键按下,若(GPIOA, GPIO_Pin_2)=0) 则为 5 键按下,若(GPIOA, GPIO_Pin_3)=0) 则为 6 键按下,当 GPIO_Pin_1=0 时:若(GPIO
7、A, GPIO_Pin_0)=0) 则为 7 键按下,若(GPIOA, GPIO_Pin_2)=0) 则为 8 键按下,若(GPIOA, GPIO_Pin_3)=0) 则为 9 键按下,当 GPIO_Pin_2=0 时:若(GPIOA, GPIO_Pin_0)=0) 则为 A(10)键按下,若(GPIOA, GPIO_Pin_1)=0) 则为 B(11)键按下,若(GPIOA, GPIO_Pin_3)=0) 则为 C(12)键按下,当 GPIO_Pin_3=0 时:若(GPIOA, GPIO_Pin_0)=0) 则为 D(13)键按下,若(GPIOA, GPIO_Pin_1)=0) 则为 E(
8、14)键按下,若(GPIOA, GPIO_Pin_2)=0) 则为 F( 15)键按下,if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)=0) if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)=0) return4;if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)=0) return5;if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) return6;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
9、 - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - 4 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)=0) if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)=0) return7;if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)=0) return8;if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) return9; if(GPIO_ReadInputData
10、Bit(GPIOA, GPIO_Pin_2)=0) if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)=0) return10;if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)=0) return11;if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) return12; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)=0) return13;if
11、(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)=0) return14;if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) return15; /* * * file None * author None * version V3.5.0 * date 2012年6月05号* brief Main program body */ /* Includes -*/ #include stm32f10 x.h void RCC_Configuration(void); void GPIO_Configuration(voi
12、d); void GPIOSetBits(void); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - 5 /* Private functions -*/ int main(void) /*! At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function whic
13、h is called from startup file (startup_stm32f10 x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10 x.c file */ /* System Clocks Configuration */ RCC_Configuration(); /* GPIO Configuration */ GPIO_Configuration(); GPIOSe
14、tBits(); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)=0) if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)=0) return 4; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)=0) return 5; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) return 6; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)=0) if(GPIO_ReadInputDataBit(G
15、PIOA, GPIO_Pin_0)=0) return 7; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)=0) return 8; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) return 9; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)=0) if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)=0) return 10; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)=0) ret
16、urn 11; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) return 12; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - 6 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)=0) return 13; if(GPIO_ReadInputDa
17、taBit(GPIOA, GPIO_Pin_2)=0) return 14; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)=0) return 15; while (1) /* * brief Configures the different system clocks. * param None * retval None */ void RCC_Configuration(void) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); void GPIO_
18、Configuration(void) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_PP _ OUT; void GPIOSetBits(void) GPIO_SetBits(GPIOA,GPIO_Pin_0); GPIO_SetBits(GPIOA,GPIO_Pin_1); GPIO_SetBits(GPIOA,GPIO_Pin
19、_2); GPIO_SetBits(GPIOA,GPIO_Pin_3); #ifdef USE_FULL_ASSERT /* * brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * param file: pointer to the source file name * param line: assert_param error line source number * retval None 名师资料总结 -
20、- -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - 7 */ void assert_failed(uint8_t* file, uint32_t line) /* User can add his own implementation to report the file name and line number, ex: printf(Wrong parameters value: file %s on line %drn, file, line
21、) */ while (1) #endif /* (C) COPYRIGHT 2012 STMicroelectronics *END OF FILE*/ 3附录程序流程图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - 8 系统初始化PA0.0PA.3为高电平,扫描程序判断是否有键按下程序扫描PA0.0为低电平,判断是否有键按下PA0.1为低电平,判断是否有键按下PA0.2为低电平,判断是否有键按下PA0.3为低电平,判断是否有键按下数码管显示图 3 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -