完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F103C8T6 4*4矩阵键盘 通过串口输出,可以用来写密码锁
程序的思路如下: 1、首先需要配置的是矩阵键盘:配置两个函数: KEY44_Init(矩阵键盘初始化)和key44_Scan(扫描并获取值) 。 2、其次,设置串口(本文设置为STM32F103C8T6的串口三): 我们需要对USART进行初始化设置,详细请见下文。 3、然后就开始写我们的主函数:主函数比较简单。因为程序已经分装了。 4、最后我们要实现按下一个键,串口打出一个字符(按下1键,打出1) ——————————————————————————————————————————————————- 下边为程序:所用芯片为STM32F103C8T6 串口3的管脚为PB10 -> TX 配置复用推挽式输出 PB11 ->RX配置浮空输入 配置矩阵键盘为PA0~PA3 推挽式输出 PA4~PA7 上拉输入 矩阵键盘的配置: 声明: #define H_1 PAout(0) #define H_2 PAout(1) #define H_3 PAout(2) #define H_4 PAout(3) #define L_1 PAin(4) #define L_2 PAin(5) #define L_3 PAin(6) #define L_4 PAin(7) void KEY44_Init(void); unsigned char key44_Scan(void); KEY44_Init(矩阵键盘初始化): void KEY44_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;//PA0~PA3 推挽式输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//初始化GPIOA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7 ; //PA4~PA7 上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); } 配置为串口三: void USART3_Init (u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; //开启GPIOB和复用推挽式输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE); //开启USART3初始化 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //PB10 -> TX 配置复用推挽式输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); //PB11 ->RX配置浮空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); //串口初始化 USART_InitStructure.USART_BaudRate = bound; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART3, &USART_InitStructure); //使能串口 USART_Cmd(USART3,ENABLE); USART_ClearFlag(USART3,USART_FLAG_TC);//解决发送第一个字节丢失的问题 } 主函数: #include "sys.h" # include "KEY44.h" #include "usart3.h" #include "delay.h" u8 key_num = 0;//缓冲变量 int main() { uart3_init(115200); delay_init(); KEY44_Init(); while(1) { key_num = key44_Scan(); if(key_num !=0) { printf("KEY Num is %drn",key_num); } } } 最后要注意的是,本文不是库编程打印,所以要在程序里加入以下程序,并加上头文件# include int fputc(int ch, FILE *f) { while((USART3->SR&0X40)==0);//循环发送,直到发送完毕 USART3->DR = (u8) ch; return ch; |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1632 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1559 浏览 1 评论
985 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1605 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
652浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
522浏览 3评论
539浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
508浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 13:03 , Processed in 0.899476 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号