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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 单片机学习笔记-单片机按键单击/双击/长按的实现 -> 正文阅读

[嵌入式]单片机学习笔记-单片机按键单击/双击/长按的实现

一、KEY_Scan1函数,此处结构直接使用了正点原子资料里面的按键识别函数,稍有改动.

1.添加了定时器清零及定时器内部计数的清零(TH1_Reload与TL1_Reload,Flag3).

2.添加了按键计数标志KEY_Times.

3.return返回方式改为直接赋值给全局变量KEY_Select.

uint8_t KEY_Select=0;//按键选择
uint8_t KEY_Mode=0;  //按键模式

void KEY_Scan1(uint8_t mode)  //mode为0不支持连按 为1支持连按 此处选择0 
{	 
    static uint8_t key_up=1;//按键按松开标志
    if(mode)key_up=1;  //支持连按

    if(key_up&&(GET_PD4!=0||GET_PC3==0||GET_PC4==0))
    {
        Delay_Ms(5);//去抖动 连按模式
        key_up=0;
        TH1=TH1_Reload;
        TL1=TL1_Reload;
        Flag3=0;
        KEY_Times++;//按键次数加一
        if(GET_PD4!=0)     {KEY_Select = KEY1_PRES;}
        else if(GET_PC3==0){KEY_Select = KEY2_PRES;}
        else if(GET_PC4==0){KEY_Select = KEY3_PRES;}
    	
    }
    else if(GET_PD4==0&&GET_PC3!=0&&GET_PC4!=0)
    {
        key_up = 1;KEY_Select = 0;// 无按键按下
    }
}

?二、KEY_Scan函数(注意没有1),此处先执行KEY_Scan1函数,再判断按键状态,最后根据按键时间逻辑来判断按键模式.

1.KEY_State为按键状态,1为按键案件没有松开,0为按键已经松开(与KEY_Scan1中的key_up作用不同,key_up是为了判断是否有按键按下,选用模式0后按下置1后即清0)

2.Key_Times是为了判断按键次数.

3.Flag3每次按键都清零,其数值为最新按键次数计时时间.

void KEY_Scan(uint8_t mode) 
{
    int i,KEY_State;
    KEY_Scan1(mode);
    
    if(GET_PD4!=0||GET_PC3==0||GET_PC4==0)
    {
        KEY_State=1;//有按键按下
    }
    else if(GET_PD4==0&&GET_PC3!=0&&GET_PC4!=0){
        KEY_State=0;//无按键按下
    } 
    
    if(KEY_State==0&&KEY_Times==1&&Flag3>50) {   
        KEY_Mode = SHORT_PRES ;STATE_CLEAN ;
    }                                       
    if(KEY_State==1&&KEY_Times==1&&Flag3>160){   
        KEY_Mode = LONG_PRES  ;STATE_CLEAN ;
    }                                       
    if(KEY_State==0&&KEY_Times==2&&Flag3>50) {   
        KEY_Mode = DOUBLE_PRES;STATE_CLEAN; 
    }	                                      
    if(KEY_State==0&&KEY_Times==3&&Flag3<130){   
        KEY_Mode = TRIPLE_PRES;STATE_CLEAN;
    }	
}

三、Flag3在定时器内设置 ,每次计数进入中断内部Flag3加1,此处定时周期为5ms.

以上述程序设置为例:

如果第一次按下时间超过250ms(50*5ms)没有第二次按键(KEY_Times==1)按下且按键松开(KEY_State==0)则为短按

如果第一次按下时间超过800ms(160*5ms) 且按键没有松开(KEY_State==1)则为长按

如果第一次按下之后再250ms内按下第二次 且第二次按下以后时间250ms(50*5ms)内没有检测到第三次按键 则为双击

如果能进入三次按键没有清零则为三击

(时间可调)

四、头文件.h

注意STATE_CLEAN的使用位置和内部需要清除的相关标志位

1.KEY_Times清零.

2.定时器清零.

3.计数Flag3清零.

#ifndef __KEY_H__
#define __KEY_H__

#define KEY1_PRES 1//按键1按下
#define KEY2_PRES 2//按键1按下
#define KEY3_PRES 3//按键1按下

#define SHORT_PRES  1//按键模式为短按
#define LONG_PRES   2//按键模式为长按
#define DOUBLE_PRES 3//按键模式为双击
#define TRIPLE_PRES 4//按键模式为三击

#define STATE_CLEAN   {KEY_Times=0;TH1=TH1_Reload;TL1=TL1_Reload;Flag3=0;}//相关标志清零

extern uint8_t KEY_Select;
extern uint8_t KEY_Mode;


void KEY_Scan(uint8_t mode);
void KEY_Scan1(uint8_t mode);

#endif

五、 main函数使用

KEY_Scan(0);
if(KEY_Mode == SHORT_PRES && KEY_Select == KEY1_PRES)//按键1按下且按键短按
{
//此处执行函数
    KEY_Mode=0;//用完记得按键模式清零
}
else if(KEY_Mode == LONG_PRES)
{
//此处执行函数
KEY_Mode=0;//用完记得模式清零
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:15:04  更:2021-08-07 12:17:06 
 
开发: 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/10 13:09:26-

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