糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > STM32驱动矩阵键盘串口输出

STM32驱动矩阵键盘串口输出

时间:2020-10-31 15:13:02

相关推荐

STM32驱动矩阵键盘串口输出

原理:矩阵键盘的原理就是分行和列扫描,来获知按键的行数和列数,然后得到按键的键值。(按键按下时)

矩阵原理图

效果视频演示

STM32驱动矩阵键盘串口输出

硬件部分

f103c8t6核心板

4*4矩阵

驱动代码部分(正点原子驱动不了,PB8的蜂鸣器硬件会导致识别不了,也没有解决办法)

#include "key.h"#include "delay.h"#include "usart.h"void KEY_Init(void){GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);} u8 keyscan(void){u8 KeyVal;GPIO_Write(GPIOB, (GPIOB->ODR & 0xf0ff | 0x0f00)); if((GPIOB->IDR & 0xf000)==0x0000) return -1;else{delay_ms(5); if((GPIOB->IDR & 0xf000)==0x0000)return -1;}GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0100)); switch(GPIOB->IDR & 0xf000){case 0x1000: KeyVal=0; break;case 0x2000: KeyVal=1;break;case 0x4000: KeyVal=2;break;case 0x8000: KeyVal=3;break;}while((GPIOB->IDR & 0xf000)> 0);GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0200));switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=4;break;case 0x2000: KeyVal=5;break;case 0x4000: KeyVal=6;break;case 0x8000: KeyVal=7;break;}while((GPIOB->IDR & 0xf000)> 0);GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0400));switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=8;break;case 0x2000: KeyVal=9;break;case 0x4000: KeyVal=10;break;case 0x8000: KeyVal=11;break;}while((GPIOB->IDR & 0xf000)> 0);GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0800));switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=12;break;case 0x2000: KeyVal=13;break;case 0x4000: KeyVal=14;break;case 0x8000: KeyVal=15;break;}while((GPIOB->IDR & 0xf000)> 0);return KeyVal;}uint8_t key_do(){int num;num = keyscan();switch(num){case 0: printf("1\t\n"); break; case 1: printf("2\t\n"); break; case 2: printf("3\t\n"); break; case 3: printf("A\t\n"); break; case 4: printf("4\t\n"); break; case 5: printf("5\t\n"); break; case 6: printf("6\t\n"); break; case 7: printf("B\t\n"); break; case 8: printf("7\t\n"); break; case 9: printf("8\t\n"); break;case 10: printf("9\t\n"); break; case 11: printf("C\t\n"); break; case 12: printf("*\t\n"); break; case 13: printf("0\t\n"); break; case 14: printf("#\t\n"); break; case 15: printf("D\t\n"); break; }}

如果觉得《STM32驱动矩阵键盘串口输出》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。