STM32 矩阵键盘通过串口输出

2019-08-16来源: eefocus关键字:STM32  矩阵键盘  串口输出

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;


关键字:STM32  矩阵键盘  串口输出

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471345.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F103——4*4矩阵扫描(极简事件扫描,非主延时)
下一篇:STM32 学习笔记 一.矩阵键盘

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32f103在使用定时器1重映射引脚输出PWM

在使用stm32f103ZGT6单片机输出PWM时候,各种配置都不能正确输出,后来查看手册,PE11该引脚对应的确实是定时器1的通道2,但是属于该引脚的重映射功能,遇到这种情况,需要多加一条语句。RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 ,ENABLE);      //TIM1时钟使能    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_FullRemap_TIM1
发表于 2019-08-21
stm32f103在使用定时器1重映射引脚输出PWM

STM32F10x TIM1 CH3/CH4 的重映射PWM输出

TIMx在ARR上的预装载寄存器  TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能,高级定时器必须开启这个  TIM_Cmd(TIM1, ENABLE);  //使能TIM1  }    .H文件#ifndef __TIMER_H#define __TIMER_H#include "stm32f10x.h"  void TIM1_PWM_Init(u16 arr,u16 psc); #endif2.应用版源码   
发表于 2019-08-21

stm32 TIM1PWM多通道捕获模式测速

因为一个项目的要求,需要测速,之前就想学一下stm32的捕获模式了,借这个机会,刚好利用一下,现在分享出来。硬件:MCU:stm32f103zet6平台:航太电子流行7号智能小车显示:mini12864软件:语言:C语言IDE:keil5测速部分环境是典型的测速方法,测速码盘加光电对管,单片机采集光电对管模块传来的PWM波,要对两个轮子测速,实际速度取俩轮的较大值。软件上采用了TIM1的捕获模式,使用了通道CH1和CH4,分别对应PA8和PA11,先看下官方对输入捕获模式的描述:在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当发生捕获事件时,相应的CCxIF标志
发表于 2019-08-21

STM32F103ZET定时器TIM1输出六路带死区互补PWM波形

TIM_OCInitStructure;     GPIO_InitTypeDef GPIO_InitStructure;     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;     TIM_BDTRInitTypeDef TIM_BDTRInitStructure;       NVIC_InitTypeDef NVIC_InitStructure;         RCC_APB2PeriphClockCmd
发表于 2019-08-21

STM32的TIM1互补PWM输出

芯片为STM32F412VETx,使用的是高级定时器TIM1的PWM互补PWM输出,看一下STM32CubeMX配置,再看时钟的配置,TIM1用的是APB2的时钟,。再看引脚的配置产生的PWM频率为:Fpwm = 96MHz / ((95+1)(9999+1)) =100Hz,占空比为50%然后生成代码,看下代码中的FMX_TIM1_Init函数初始化/* TIM1 init function */static void FMX_TIM1_Init(void){   TIM_ClockConfigTypeDef sClockSourceConfig;  TIM_Mast
发表于 2019-08-21
STM32的TIM1互补PWM输出

STM32高级定时器TIM1、TIM15输出PWM

配置GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_1);该函数配置对应GPIO引脚的功能,具体的引脚功能参数GPIO_AF_x 找对应的芯片数据手册 查看下图为STM32F051C8T6相关引脚功能与其他普通定时器不同的是 特别注意TIM1、TIM15的BDTR寄存器 需要将MOD置位(寄存器第15位) 才能输出PWMTIM1->BDTR|=1<<15;TIM15->BDTR|=1<<15;
发表于 2019-08-21
STM32高级定时器TIM1、TIM15输出PWM

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved