STM32矩阵键盘输入通过串口三输出

发布者:幸福自在最新更新时间:2019-01-14 来源: eefocus关键字:STM32  矩阵键盘输入  串口 手机看文章 扫描二维码
随时随地手机看文章

配置矩阵键盘输入


//PA0~PA3为推挽式输出

//PA4~PA7为上拉输入

//PA9->RXD  PA10->TXD

 

void  KEY44_Init(void)

{

//PA0~PA3为推挽式输出

 

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

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);


//PA4~PA7为上拉输入

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5  |GPIO_Pin_6 |GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

 

unsigned char key44_Scan(void)

{

H_1 = 0;

H_2 = 1;

H_3 = 1;

H_4 = 1;

 

if(L_1 == 0)

{

delay_ms(10);

if(L_1 == 0)

{

while(!L_1);

return 1;

}

}

if(L_2 == 0)

{

delay_ms(10);

if(L_2 == 0)

{

while(!L_2);

return 2;

}

}

if(L_3 == 0)

{

delay_ms(10);

if(L_3 == 0)

{

while(!L_3);

return 3;

}

}

if(L_4 == 0)

{

delay_ms(10);

if(L_4 == 0)

{

while(!L_4);

return 4;

}

}

 

H_1 = 1;

H_2 = 0;

H_3 = 1;

H_4 = 1;

 

if(L_1 == 0)

{

delay_ms(10);

if(L_1 == 0)

{

while(!L_1);

return 5;

}

}

if(L_2 == 0)

{

delay_ms(10);

if(L_2 == 0)

{

while(!L_2);

return 6;

}

}

if(L_3 == 0)

{

delay_ms(10);

if(L_3 == 0)

{

while(!L_3);

return 7;

}

}

if(L_4 == 0)

{

delay_ms(10);

if(L_4 == 0)

{

while(!L_4);

return 8;

}

}

 

H_1 = 1;

H_2 = 1;

H_3 = 0;

H_4 = 1;

 

if(L_1 == 0)

{

delay_ms(10);

if(L_1 == 0)

{

while(!L_1);

return 9;

}

}

if(L_2 == 0)

{

delay_ms(10);

if(L_2 == 0)

{

while(!L_2);

return 10;

}

}

if(L_3 == 0)

{

delay_ms(10);

if(L_3 == 0)

{

while(!L_3);

return 11;

}

}

if(L_4 == 0)

{

delay_ms(10);

if(L_4 == 0)

{

while(!L_4);

return 12;

}

}

 

H_1 = 1;

H_2 = 1;

H_3 = 1;

H_4 = 0;

 

if(L_1 == 0)

{

delay_ms(10);

if(L_1 == 0)

{

while(!L_1);

return 13;

}

}

if(L_2 == 0)

{

delay_ms(10);

if(L_2 == 0)

{

while(!L_2);

return 14;

}

}

if(L_3 == 0)

{

delay_ms(10);

if(L_3 == 0)

{

while(!L_3);

return 15;

}

}

if(L_4 == 0)

{

delay_ms(10);

if(L_4 == 0)

{

while(!L_4);

return 16;

}

}

return 0;

}

配置USART3


void USART3_Init(u32 bound)

{

// PB10 & PB11

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_GetFlagStatus(USART3,USART_FLAG_TC);//防止第一个字符被吞

}


主函数


u8  key_num = 0;

 

u8 i = 0;

 

int main(void)

KEY44_Init();

delay_init();

USART3_Init(115200);

while(1)

{

key_num = key44_Scan(); 

if(key_num != 0)

{

USART_SendData(USART3,key_num);

while(USART_GetFlagStatus(USART3,USART_FLAG_TC) == 0);

 

}

}

}


关键字:STM32  矩阵键盘输入  串口 引用地址:STM32矩阵键盘输入通过串口三输出

上一篇:STM32学习笔记一一USART
下一篇:STM32+按键调控PWM输出+串口输出占空比

推荐阅读最新更新时间:2024-03-16 16:22

利用ST-LINK配合ST-LINK Utility 将bin文件下载到STM32的FLASH中
背景 项目需求,要把字模文件导入到32中FLASH的指定地址,使用了ST-LINK V2 连接单片机和计算机,然后通过ST-LINK Utility 软件的配合将弄好的字模bin文件导入到FLASH指定地址。下面记录一下整个过程: 1.连接ST-LINK V2与单片机 博主的只需要连接4个线即可: VDD GND SWCLK SWDIO 2.配置工程 然后打开工程,进行配置,选择ST-Link Debugger 然后查看是否检测到ST-Link(选择SW) 如果你的可以显示如图内容,那么就成功连接了。 3.配置ST-LINK Utility 打开软件后的界面如示: 点击蓝色的球,打开设置界面,设置Por
[单片机]
利用ST-LINK配合ST-LINK Utility 将bin文件下载到<font color='red'>STM32</font>的FLASH中
STM32芯片时钟配置
对STM32进行软件开发时,最基本的就是对STM32芯片进行时钟和端口配置,然后是对项目所用到的片上资源进行配置并驱动,下面给出时钟和端口配置代码,该代码几乎涵盖了片上所有时钟和端口配置项目,可根据自己需要进行删除不必要的配置项: /******************************************************************************* * Function Name : RCC_Configuration 复位时钟控制配置 * Description : Configures the different system clocks. * Input : None * Outp
[单片机]
stm32的引脚配置
最近有新手问我,什么串口2 串口3 都是那个引脚 以及PWM配置那个引脚 通道选择哪一个、 先简单的描述一下 PWM //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2 //设置该引脚为复用输出功能,输出 TIM1 CH1 的 PWM 脉冲 GPIOInitStructure.GPIOPin = GPIOPin8; //TIMC 如果不知道 想要使用其他的神费劲 只能上网抄别人的程序了 case 0: // 通道0
[单片机]
<font color='red'>stm32</font>的引脚配置
STM32定时器和外部触发同步的应用
一、定时器和外部触发的同步 TIMx定时器能够在多种模式下和一个外部的触发同步:复位模式、门控模式和触发模式。 从模式:复位模式 复位模式时序图如下所示: 配置通道1以检测TI1的上升沿,配置定时器为复位模式,计数器为向上计数模式,选择T1位输入源。每一个计数器时钟周期计数器寄存器自增。当TI1产生一个上升沿时,计数器寄存器清0重新开始计数。 从模式:门控模式 门控模式时序图如下所示: 配置通道1以检测TI1的低电平,配置定时器为门控模式,计数器为向上计数模式,选择T1为输入源。每一个计数器时钟周期计数器寄存器自增。只要TI1为低,计数器开始依据内部时钟计数,在TI1为高电平时停止计数。 从模式:触
[单片机]
<font color='red'>STM32</font>定时器和外部触发同步的应用
stm32定时器输出比较功能不同频率
输出比较:打开一个TIMx计数器,再打开TIMx的一路或几路输出比较器(共4路),都配置好以后,计数器开始计数,当计数器里的值和比较寄存器里的值相等时,产生输出比较中断,在中断中将计数器中的值读出,与翻转周期相加再写道比较寄存器中,使得和下一个事件有相同的翻转周期。 大致意思为打开计数器后,计数值不断增加,到增加到比较寄存器的值时,电平翻转,也会产生比较中断,在比较中断中在把计数器的值读出与周期相加,一并写入比较寄存器,使得有相同的翻转周期。 例如TIM时钟频率设置为12MHZ,输出比较寄存器中的自装载值为600(高电平或低电平计数值),则输出的PWM频率为 frequency = 12MHZ/(600*2)=
[单片机]
STM32基于固件库学习笔记(9)TM3产生PWM调LED亮度
PWM   脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号,也就是说对脉冲宽度的控制。   STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!    在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存OCxPE
[单片机]
stm32f103串口实用DMA实现收发
目标环境: MCU:stm32f103C8T6 stm32 library:standard library V3.5.0 RTOS:FreeRTOS 实现功能: a. 接收DMA和串口IDLE中断配合接收不定长数据 b. 使用DMA发送数据 一. 初始化 #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_usart.h #include stm32f10x_gpio.h #include stm32f10x_dma.h #include freertos.h #include semph
[单片机]
STM32中的DMA的实际应用
DMA部分我用到的相对简单,当然,可能这是新东西,我暂时还用不到它的复杂功能吧。下面用问答的形式表达我的思路。 DMA有什么用? 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。 有多少个DMA资源? 有两个DMA控制器,DMA1有7个通道,DMA2有5个通道。 数据从什么地方送到什么地方? 外设到SRAM(I2C/UART等获取数据并送入SRAM); SRAM的两个区域之间; 外设到外设(ADC读取数据后送到TIM1控制其产生不同的PWM占空比); SRAM到外设(SRAM中预先保存的数据送入DAC产生各种波形)
[单片机]
<font color='red'>STM32</font>中的DMA的实际应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved