完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.理论分析
1.1键盘扫描方式 我们所用到的键盘为4×4矩阵键盘,先分析矩阵键盘的电路连接方式及其扫描方式。根据电路可知
我们将矩阵键盘的接口分别定义为GPIO端口
1.2行扫描逻辑 首先我们需要定义一个数组用来存放行扫描的结果。 分别存放PD8~PD11的电平值
其中该程序在进行按键扫描时,同样需要进行按键消抖,已经在前一篇中说明,这里就不再赘述。 行扫描结果对应的按键值 [tr]PD 8PD 9PD10PD11按键结果[/tr]
列扫描的执行过程
2.程序编写 2.1按键扫描程序 2.1.1按键初始化 void key_init(){ GPIO_InitTypeDef GPIO_InitStruture; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//打开PB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//打开PD时钟 //定义PB12、PB13、PB14、PB15为推挽输出、分别定义为列 GPIO_InitStruture.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruture.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStruture); //定义PD8、PD9、PD10、PD11为上拉输入、分别定义为四行 GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStruture.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; GPIO_Init(GPIOD,&GPIO_InitStruture); } 2.1.2按键扫描程序头文件 头文件中我们编写了按键的行引脚分别对应P8 ~ P11端口,以及按键列引脚的高低电平,分别对应PB12 ~ PB15端口。 #ifndef _KEY16_H #define _KEY16_H #include "sys.h" #include "stm32f10x.h" #include //定义行按键的引脚 #define key_row0_Pin GPIO_Pin_8//定义P8为行1 #define key_row1_Pin GPIO_Pin_9//定义P9为行2 #define key_row2_Pin GPIO_Pin_10//定义P10为行3 #define key_row3_Pin GPIO_Pin_11//定义P11为行4 //行扫描函数、列扫描函数、初始化函数声明 void key_init(); char key_row_scan(void); char key_scan(void); //定义列的低电平输出 #define KEY_CLO0_OUT_LOW GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET) #define KEY_CLO1_OUT_LOW GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET) #define KEY_CLO2_OUT_LOW GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET) #define KEY_CLO3_OUT_LOW GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_RESET) //定义列的高电平输出 #define KEY_CLO0_OUT_HIGH GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET) #define KEY_CLO1_OUT_HIGH GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_SET) #define KEY_CLO2_OUT_HIGH GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_SET) #define KEY_CLO3_OUT_HIGH GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_SET) #endif 2.1.3行扫描函数 char key_row_scan(void){ key_row[0] = GPIO_ReadInputDataBit(GPIOD, key_row0_Pin)<<3;//读取PD8/第1行 key_row[0] = key_row[0] | (GPIO_ReadInputDataBit(GPIOD, key_row1_Pin)<<2);//读取PD9/第2行 key_row[0] = key_row[0] | (GPIO_ReadInputDataBit(GPIOD, key_row2_Pin)<<1);//读取PD10/第3行 key_row[0] = key_row[0] | (GPIO_ReadInputDataBit(GPIOD, key_row3_Pin));//读取PD11/第4行 if(key_row[0] != 0x0f) { delay_ms(10); if(key_row[0] != 0x0f) { switch(key_row[0]) { case 0x07: //0111 第1行被按下 return 1; case 0x0b: //1011 第2行被按下 return 2; case 0x0d: //1101 第3行被按下 return 3; case 0x0e: //1110 第4行被按下 return 4; default : return 0; //没有按键被按下 } }else return 0; }else return 0; } 2.1.3列扫描函数 char key_scan(void){ char key_num=0; //1-16对应的按键数 char key_row_num=0; //行扫描结果记录 KEY_CLO0_OUT_LOW; if( (key_row_num=key_row_scan()) != 0 ) { while(key_row_scan() != 0); //消抖 key_num = 0 + key_row_num; } KEY_CLO0_OUT_HIGH; KEY_CLO1_OUT_LOW; if( (key_row_num=key_row_scan()) != 0 ) { while(key_row_scan() != 0); key_num = 4 + key_row_num; //printf("Key_Clo_2rn"); } KEY_CLO1_OUT_HIGH; KEY_CLO2_OUT_LOW; if( (key_row_num=key_row_scan()) != 0 ) { while(key_row_scan() != 0); key_num = 8 + key_row_num; //printf("Key_Clo_3rn"); } KEY_CLO2_OUT_HIGH; KEY_CLO3_OUT_LOW; if( (key_row_num=key_row_scan()) != 0 ) { while(key_row_scan() != 0); key_num = 12 + key_row_num; } KEY_CLO3_OUT_HIGH; return key_num; } 2.2主程序 主程序通过调用行扫描函数和列扫描函数来输出按键值。 #include "stm32f10x.h" #include "delay.h" #include "led.h" #include "key16.h" #include "stdio.h" #include "usart.h" int main(void) { char key_num_end; delay_init(); key_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200);//波特率 while(1) { key_num_end = key_scan(); if(key_num_end>0&&key_num_end<17){ printf("Key_NUM = %d rn",key_num_end); //按下1-16个按键的操作 printf("= = = = = = = = = = = rn"); } } } |
||||
|
||||
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
651浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
520浏览 3评论
539浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
507浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 01:15 , Processed in 0.624298 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号