IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 按键的长按,短按,以及按键按下后不松开,只计算一次有效按下 -> 正文阅读

[嵌入式]按键的长按,短按,以及按键按下后不松开,只计算一次有效按下

判断按键长按还是短按,就需要引入时间的概念了。

对于STM32G431RBT6这块板子来说,直接开启一个定时器用来检测即可。

?这里要讲到一个定时器时间计算公式

TIM(S)=\frac{(ARR+1)(PSC+1)}{TLCK(MHz)}

TLCK指的就是系统时钟频率,设置为100MHz的话,用公式计算,定时器6就是10ms产生一次定时中断。

?生成工程文件后,编程代码如下:

这样就可以每10ms检测一次按键

unsigned int count = 0,flag = 0;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  //定时中断回调函数
{
    if(htim -> Instance == TIM6)
        {   
            if( HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0) ==0 )    //读取B1的状态,按下为0
                {
                    count++;                                //按键按下时,每10ms count就+1
                }else if(count > 80)                //如果按键按下大于800ms,就判断是长按

                        {
                              x = 1;                 //标志变量x = 1 长按  
                        }

                  else if(count > 10 &&count <80)   //如果按下时长不足 800ms 就判断是短按
                            x = 2;
        }

}



当然使用定时器还要在主函数中启动它,用这句

HAL_TIM_Base_Start_IT(&htim6);

上面就是判断长按短按的方法。

还有一种就是,按下按键不松手的时候,系统会一直去执行按下的操作,但是当我们需要计数的时候,比如按下一次就令x++;这个时候按下一次,由于系统工作的速度是微秒级别的,会让x+上很多数,不能实现按一次就+1;

这个时候就要根据 按键按下前和按下后的两个状态来判断一次按下。

unsigned int flag = 0;            //定义全局标志变量flag
void Key_scan()
{
    static unsigned int x = 0;                        //定义静态变量 x 用于判断按键状态 



if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)== 0 && x == 0) 

        {    
                                   //如果按键按下,且前一瞬间没有按下,才算一次有效按下            
            x = 1;               //x =1 表示前一次按键已经按下                            
            flag = 1 ;
            
        }else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)== 1) 
                x = 0;     //如果不满足上面的状态,并且按键没有按下,x=0,表示前一瞬间没有按下
}

代码有一点点绕,仔细看的话逻辑起始挺简单的。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:40:08  更:2021-08-01 14:40:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 22:41:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码