STM32笔记(二)(寄存器)——矩阵键盘

2019-08-16来源: eefocus关键字:STM32  寄存器  矩阵键盘

      矩阵键盘是我第一个需要动手焊接东西的实验,是3*3的键盘,焊了一个下午。因为是第一次焊东西,有多处不足,但最后也勉强能用。键盘的电路是组长设计的,希望下一次我能自己独立设计电路。


键盘外观

正面


背面 


 外观略显粗糙。。。。


主要代码 

      矩阵键盘最主要的一部分代码就是按键扫描部分,通过一个扫描函数对高低电平进行判断,从而确定按键的位置。用过串口输出案件编号1~9。


key.c代码


void KEY_Init1(void)

{

RCC->APB2ENR|=1<<3;     

JTAG_Set(SWD_ENABLE);

GPIOB->CRL&=0X000FFFFF; //PB5,6,7

GPIOB->CRL|=0X33300000;  

GPIOB->CRH&=0XFFFFF000; //PB8,9,10

GPIOB->CRH|=0X00000888; 

 

GPIOB->ODR|=1<<5;    

GPIOB->ODR|=1<<6;    

GPIOB->ODR|=1<<7;    

  

KEY1=1;

KEY2=1;

KEY3=1;

 

 

void KEY_Init2(void)

{

GPIOB->CRL&=0X000FFFFF; //PB5,6,7

GPIOB->CRL|=0X88800000;  

 

GPIOB->CRH&=0XFFFFF000; //PB8,9,10 

GPIOB->CRH|=0X00000333;

 

GPIOB->ODR|=1<<8;    

GPIOB->ODR|=1<<9;    

GPIOB->ODR|=1<<10;

 

KEY4=1;

KEY5=1;

KEY6=1;

 

 

u8 KEY_Scan(void)

{

u8 a=0,b=0;

 

KEY_Init1(); 

 

  if(KEY4_in==1||KEY5_in==1||KEY6_in==1)

{

delay_ms(10);

if(KEY4_in==1) a=1;

else if(KEY5_in==1) a=2;

else if(KEY6_in==1) a=3;

}

else  return 0;

 

 

  GPIOB->ODR &=~(1<<5);

GPIOB->ODR &=~(1<<6);

GPIOB->ODR &=~(1<<7);

KEY_Init2();

delay_ms(10);

if(KEY1_in==1) b=1;

else if(KEY2_in==1) b=2;

else if(KEY3_in==1) b=3;

else  return 0;

GPIOB->ODR &=~(1<<8);

GPIOB->ODR &=~(1<<9);

GPIOB->ODR &=~(1<<10);

KEY_Init1();

 

return ((a-1)*3+b);

}

这一部分也是最主要的代码,u8  KEY_Scan()是扫描函数。


实验结果

关键字:STM32  寄存器  矩阵键盘

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

上一篇:STM32 学习笔记 一.矩阵键盘
下一篇:基于STM32F407最小系统板三种矩阵键盘实现方法

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

推荐阅读

STM32 USART1对PWM的影响,串口影响PWM

注意,USART1和TIM1是复用的,如果用TIM1产生PWM(PA9 / PA10),则USART1不应该用该管脚,可以用PB6/PB7。
发表于 2019-08-22

stm32103R8C6 捕捉2路pwm 串口打印捕捉数据

第一路使用定时器2的通道1,先捕捉一个上升沿,清楚所有数据开始捕捉下降沿,捕捉到下降沿后再捕捉一个上升沿。 第二路使用定时器4的通道4,使用其他通道的时候要注意,定时器的中断时CC4,设置上升沿和下降沿的时候也要改为通道4。//定时器2通道1输入捕获配置TIM_ICInitTypeDef TIM2_ICInitStructure;void TIM2_Cap_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
发表于 2019-08-22
stm32103R8C6 捕捉2路pwm 串口打印捕捉数据

STM32——使用PWM+DMA实现脉冲发送精确控制

之前用stm32写过脉冲发送的代码,用来控制步进电机,但是缺点明显,之前是用定时器中断做的,所以一但控制的电机多起来,MCU资源占用就很大,这在大多数情况下是不可接受的,更不用说多轴联动了。最近做的步进电机CAN总线控制系统,就想顺便重新写驱动。希望做到占用很少的MCU资源,实现脉冲发送的精确控制。既然是用来控制步进电机,那么脉冲的数量和频率一定要可控,要不然怎么实现电机的加减速曲线。于是就想到了DMA。DMA (直接存储器访问)DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料
发表于 2019-08-22
STM32——使用PWM+DMA实现脉冲发送精确控制

stm32入门——PWM输出控制直流电机变速

,ARR大于CCRx时输出为“有效”电平。注意,我这里用的是“有效”和“无效”,而不是“高”和“低”,也就是说有效电平可高可低,并非一定就是高电平。PWM模式、效电平极性,需要程序员自己配置相关的寄存器来实现。以下面的代码来讲解TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz我们使用定时器1的通道1来输出一路PWM波,想详细了解定时器参数的设置的朋友可以参考(stm32入门——定时器中断),我这里简单介绍一下,这里的899设置的就是ARR的值,至于那个0是用来设置TIM1的频率的,不分频就代表TIM1的时钟频率和系统时钟相同,这里假设为72MHz。void
发表于 2019-08-22
stm32入门——PWM输出控制直流电机变速

STM32学习笔记(PWM输出)

本人采用Cube 进行的STM32库函数编程,PWM波的输出配置以及代码如下所示:(经过实际实验证明非常好用)以下为定时器PWM输出函数,注意:使用时一定要把原来输出函数注释掉。注释代码如下:// sConfigOC.OCMode = TIM_OCMODE_PWM1;// sConfigOC.Pulse = 0;// sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;// sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;// if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC
发表于 2019-08-22

STM32死机 调试时进入HardFault_Handler定位错误的方法

STM32在运行不正常的时候我们一般会进行调试看看问题出在了哪里。但是当STM32卡死后进行调试的时候会发现进入到了一个HardFault_Handler函数里,这是一个硬件错误处理函数。通过它和MDK配合可以定位程序最后卡死的原因。STM32卡死的原因有以下几种:数组越界操作;内存溢出,访问越界;堆栈过小;中断处理错误;电压供电异常。现在实验一个堆栈过小的错误,让MDK来检测这个问题然后定位错误。这个程序基于UCOSII 系统 #define TFTLCD_STK_PRIO  8 //任务的优先级#define TFTLCD_STK_SIZE  2 //任务的堆栈大小OS_ST
发表于 2019-08-22
STM32死机 调试时进入HardFault_Handler定位错误的方法

小广播

何立民专栏

单片机及嵌入式宝典

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

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