datasheet

基于stm32的4X4矩阵键盘定时器扫描消抖法,彻底告别delay函数

2019-08-16来源: eefocus关键字:stm32  4X4矩阵键盘  定时器扫描  消抖法  delay函数

        经本人刻苦钻研,将51单片机上用的矩阵键盘扫描程序移植到了stm32上,同时也做了很大的改进,最大的改进莫过于消抖这块了。以前的消抖总是采用delay延时约10到20ms的时间,但这样会导致MCU在延时里空跑而造成主程序被搁置,显然,程序的实时性大打折扣,今天便在此让新手们别delay,从此走进一个崭新的扫描消抖世界!(本人也是新手——爱钻研的新手哈!^_^)


//stm32矩阵键盘翻转扫描法(PB口的低8位)

//将此矩阵键盘扫描程序放在定时器中断服务程序里

//每10ms进入一次中断服务程序

s8 scan_MatrixKey(void)

{

    #define PORT GPIOB->IDR

    u8 column;//列

    u8 row;//行

    u8 tmp;//临时变量

    s8 MatrixKey_value = 20;//初始值不能为0~15 

    static u8 key_count = 0;//按键被中断扫描的次数

    

    ///////////IO口的配置/////////////

    //低8位为推挽输出

    GPIOB->CRL &= 0X00000000;

    GPIOB->CRL |= 0X33333333;

    //初值:低4位为低,次低4位为高

    GPIOB->ODR &= 0XFF00;

    GPIOB->ODR |= 0X00F0;

    //次低4位为上拉输入

    GPIOB->CRL &= 0X0000FFFF;

    GPIOB->CRL |= 0X88880000;

  


    tmp = PORT;//必须要

    if (tmp != 0XF0)//如果有键按下

    {   

        //防止长按时,持续自增导致变量溢出

        if (key_count <= 2)

        {

            key_count++;

        }

    }

    //若产生抖动按键被抬起则计数清0 

    else

    {

        key_count = 0;

    }

    //若按键连续2次扫描均处于按下状态

    //则认为按键确实被按下了

    if (key_count == 2)

    {          

        column = tmp & 0X00F0;//获取列号 

        

        ///////////IO口的配置/////////////

        //低8位为推挽输出

        GPIOB->CRL &= 0X00000000;

        GPIOB->CRL |= 0X33333333;

        //翻转:低4位为高,次低4位为低

        GPIOB->ODR &= 0XFF00;

        GPIOB->ODR |= 0X000F;//低4位为高,次低4位为低

        //低4位为上拉输入

        GPIOB->CRL &= 0XFFFF0000;

        GPIOB->CRL |= 0X00008888; 

                            

        row = PORT & 0X000F;//获取行号                                         

        switch (column | row)//column|row为按键被按下对应端口的编码

        {   

            //按键对应的码表(可以根据需求调整欲返回的键值) 

            case 0XEE: MatrixKey_value = 12; break;

            case 0XDE: MatrixKey_value = 10; break;

            case 0XBE: MatrixKey_value = 11; break;                

            case 0X7E: MatrixKey_value = 0; break;                                              

            case 0XED: MatrixKey_value = 13; break;

            case 0XDD: MatrixKey_value = 3; break;

            case 0XBD: MatrixKey_value = 2; break;

            case 0X7D: MatrixKey_value = 1; break;                                  

            case 0XEB: MatrixKey_value = 14; break;

            case 0XDB: MatrixKey_value = 6; break;

            case 0XBB: MatrixKey_value = 5; break;

            case 0X7B: MatrixKey_value = 4; break;                                    

            case 0XE7: MatrixKey_value = 15; break;

            case 0XD7: MatrixKey_value = 9; break;

            case 0XB7: MatrixKey_value = 8; break;

            case 0X77: MatrixKey_value = 7; break;

            default:   break;     

        }                    

    } 

    //若没有按键被按下(已松手)则扫描次数清0

    //方便下次按下扫描计数

    if ((PORT & 0X00FF) == 0x00F0)

    {

        key_count = 0;  

    }


    return MatrixKey_value;

}


关键字:stm32  4X4矩阵键盘  定时器扫描  消抖法  delay函数

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

上一篇:STM32 GPIO IIC学习
下一篇:4.STM32F407ZG按键输入

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

推荐阅读

stm32驱动超声波模块

;           //使能中断NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM6,DISABLE);}//定时器6中断服务程序u32 msHcCount = 0;void TIM6_IRQHandler(void)   //TIM6中断{if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否{TIM_ClearITPendingBit(TIM6, TIM_IT_Update);       
发表于 2019-08-19

STM32单片机连接HC_SR04超声波模块测距

首先,先来看一下这个模块的基本功能和原理。HC-SR04超声波测距模块可提供约2cm400厘米的非接触式距离感测功能,测距精度可达高到3毫米;模块包括超声波发射器,接收器与控制电路像智能小车的测距以及转向,或是一些项目中,常常会用到。智能小车测距可以及时发现前方的障碍物,使智能小车可以及时转向,避开障碍物。注意是5v输入,但是我用stm32的3.3v输入也是没有问题的。二,工作原理      1.给超声波模块接入电源和地      。2.给脉冲触发引脚(trig)输入一个长为20us的高电平方波   
发表于 2019-08-19
STM32单片机连接HC_SR04超声波模块测距

基于STM32的超声波传感器测距(含代码)

1. 实验原理        超声波传感器采用的是HC-SR04,具有VCC、GND、Trig、Echo四个引脚,其使用方法为:将Trig 设置为高电平并保持至少10us,传感器将发出 8 个脉冲的声波。对于声波产生回声所需的整个时间内, Echo 为高电平。测量该高电平时间即可知经过的时间,则可计算障碍物的距离。         测量Echo 为高电平的时间是利用STM32的通用定时器进行输入捕获,测量得到的高电平时间通过公式:距离 =  Thigh *340/2 (m) ,其中Thigh 单位为秒(s), 340米/秒(m/s
发表于 2019-08-19
基于STM32的超声波传感器测距(含代码)

STM32F103 USART1串口重映射功能的实现

; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); /*  RX PB7 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOB,&GPIO_InitStructure);}static void Usart_Config1(u32 baudrate){ USART_InitTypeDef
发表于 2019-08-19
STM32F103 USART1串口重映射功能的实现

基于STM32的超声波HC-SR04历程

了 TIM_Cmd(TIM2,DISABLE);//关闭定时器 length=TIM_GetCounter(TIM2)/58; if(length<=0) length=0;        TIM_SetCounter(TIM2,0);  //取出TIM2定时器counter寄存器里的值 SysTick_Delay_Ms(200);   return length; } /*    主函数  */ #include "stm32f10x.h"#include "
发表于 2019-08-19

STM32F103 时钟系统明晰

本人小白一个,利用课外时间自学STM32。个人感觉,STM32的时钟系统什么的,感觉很复杂,对整个时钟系统的概念都很模糊,只知道该怎么配置,却不知道是怎么来的,所以就花了一天功夫专门上网搜集了一下资料,整理之后在此用通俗易懂的语言分享出来。如有用词不当以及总结错误的地方,还希望各位大佬指出。博主也好及时进行自我纠正,在此先谢过了。经常在配置外设时,总会有一句开启APB1或者APB2下的哪个外设的时钟,还有什么AHB时钟,SYSCLK时钟,让人很是很头疼。下面,你只需要记住这些死知识就够了:SYSCLK: 系统时钟,最大可以达到72MHZ。HCLK: AHB总线时钟,由SYSCLK分频得到,一般都是设置为不分频。经过时钟总线桥
发表于 2019-08-19

小广播

何立民专栏

单片机及嵌入式宝典

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

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