原理:将按键这一事件的过程划分成如下几个状态:

//stata 函数运行状态

//0: 初始状态

//1: 第一洗按键按下

//2: 第一次长按抬起

//3: 第一次短按抬起

//4: 第二次按键按下

//5: 第二次按键抬起

利用定时器记录系统运行时间,根据系统运行时间来确定按键时间间隔,根据不同的时间间隔来判断当前按键事件处于哪一过程以及是否结束该事件。

主函数中应循环调用按键检测函数,调用间隔不超过100ms,此函数不会阻塞程序运行。

版本说明:

............................................................

版本号Beta0.0

本驱动工具包主要包含以下驱动(xxx.c文件和xxx.h文件共同使用,下面不再写后缀)

1“define.h”----包含了类型定义与开发板属性的设置(如晶振频率等)

2“delay”----定义了两个延时函数,支持STC大多数芯片(除15H系列..)

【提示】本函数库中驱动多数依赖于"delay.c""delay.h"和"define.h"文件

3“digital_display”----数码管显示驱动(硬件是基于两个373锁存器分别用作段数据和位数据)

4“digital_to_string”----包含了浮点数转换成字符串的函数

5“DS18B20”----温度传感器驱动

6“DS1302”----时钟芯片驱动

7“I2C”----软件模拟I2C总线驱动

8“Keyboard”----矩阵键盘驱动

9“LCD_1602_display”----1602液晶屏驱动(并口)

10“LCD_12864_display”----12864液晶屏驱动(并口带中文字库)(只是显示文字,不包含画图)

11“NEC_IR_coding”----用一个红外LED实现红外编码发射的驱动

12“NEC_IR_decoding”----红外解码驱动

13“NRF24L01”----2.4G无线通讯模块驱动

14“Uart”----串口驱动相关函数

未完待续...

............................................................

............................................................

版本号Beta0.1

修复了数码管有关残影的bug

取消了矩阵键盘的松手检测,检测不到键按下时返回0代替

未完待续...

............................................................

............................................................

版本号Beta0.2

加入了独立按键的检测,兼容矩阵按键,修复了矩阵键盘关于不同开发板兼容性的bug

增加了串口不同波特率的初始化程序

未完待续...

............................................................

............................................................

版本号Beta0.3

调整了数码管显示驱动的结构代码,方便不同开发板移植

调整了红外解码阈值,提高解码效率

未完待续...

............................................................

............................................................

版本号Beta0.4

1602液晶驱动的代码更改为区域刷新,字符串长度不够显示空格,避免出现显示残留

调整了若干驱动文件名字

修复了数字转字符串函数在显示0时有负号的bug

添加了QMC5883地磁场传感器驱动

未完待续...

............................................................

核心代码如下:

/*

按键检测

返回值:0  无结果

1  短按

2  长按

3  双击

*/

u8 key_scan()

{

//stata 函数运行状态

//0: 初始状态

//1: 第一洗按键按下

//2: 第一次长按抬起

//3: 第一次短按抬起

//4: 第二次按键按下

//5: 第二次按键抬起

u8 res=0;

static u8 key_sta,stata=0;

static u32 time=0,time1=0,time2=0;

if(key==0)        //按下消抖

{

delay_10ms(1);

if(key==0)

key_sta=0;

else

return 0;

}

else //松开消抖

{

delay_10ms(1);

if(key==1)

key_sta=1;

else

return 0;

}

if(stata==0)                                 //0: 初始状态

{

if(key_sta==0)

{

stata=1;

time=system_time;

}

return 0;

}

else if(stata==1)                        //1: 第一洗按键按下

{

time1=system_time;

time2=time1-time;

if(time2>60)

{

stata=2;

}

else if(key_sta==1)

{

time=system_time;

stata=3;

}

return 0;

}

else if(stata==2)                        //2: 第一次长按抬起

{

if(key_sta==1)

{

stata=0;

return 2;

}

return 0;

}

else if(stata==3)                        //3: 第一次短按抬起

{

time1=system_time;

time2=time1-time;

if(time2>30)

{

stata=0;

return 1;

}

else if(key_sta==0)

{

stata=4;

}

return 0;

}

else if(stata==4)                        //4: 第二次按键按下

{

if(key_sta==1)                        //5: 第二次按键抬起

{

stata=0;

return 3;

}

return 0;

}

else

return 0;

}

void time0_irq() interrupt 1 using 1        //系统时间定时器  10ms+1

{

TL0 = 0x00;                //设置定时初值

TH0 = 0xDC;                //设置定时初值

system_time++;

}

说明:该工程使用了STC头文件,请在STC-ISP软件中将头文件添加到Keil

截图.jpg (154.18 KB, 下载次数: 26)

2018-8-6 14:08 上传

全部资料51hei下载地址:

按键.rar

(63.3 KB, 下载次数: 193)

2018-8-6 14:05 上传

点击文件名下载附件

下载积分: 黑币 -5

单片机双击 长按 c语言,51单片机按键检测源程序(实现单击、双击、长按等功能)...相关推荐

  1. 单片机波特率不加倍c语言,51单片机硬件系统设计时,为什么用11.0592MHz的晶振而不用12MHz晶振的原因及串口波特率误...

    在设计51系列的单片机系统时,一般选用11.0592MHz的晶振而不选用12MHz的晶振,为什么?12M的晶振,振荡频率明显高于11.0592M的,按理说12MHz的晶振可以提高单片机的性能,那么我们 ...

  2. 51单片机4位数乘法C语言,51单片机实现4位数以内的加减法

    中南民族大学,电子信息工程学院,开设了一门课程,叫<嵌入式电路设计>,由舒老师带头,旨在引导低年级的学生入门嵌入式,其内容比较多,包括模电.数电.C语言.单片机.EDA技术等.最近有位师弟 ...

  3. 51单片机生日快乐歌c语言,51单片机实现生日快乐歌

    for(j=0;j<115;j++); } //生日快乐歌的音符频率表,不同频率由不同的延时来决定 u8 code SONG_TONE[]={212,212,190,212,159,169,21 ...

  4. 51单片机生日快乐歌c语言,51单片机演奏音乐“祝你生日快乐”

    原标题:51单片机演奏音乐"祝你生日快乐" ; ORG 0000H LJMP START ORG 000BH INC 20H ;中断服务,中断计数器加1 MOV TH0,#0bbH ...

  5. 单片机自动调光C语言,51单片机led灯渐变PWM调光(渐亮渐灭)C语言和汇编源程序

    PWM控制led灯渐亮渐灭程序 适用ME500开发系统 短接JP41-2选用8个LED灯 PWM-PulseWidthModulation(脉冲宽度调制) PWM足?种周期?走而高低电平的rV空比可以 ...

  6. 单片机自动调光C语言,51单片机触控调光程序C语言

    /********************************************************************************************* 程序名: ...

  7. 单片机热敏电阻测温度c语言,51单片机热敏电阻测温程序.doc

    //本程序是通过热敏电阻测温度(30c-50c #include #include #include #define uchar unsigned char #define uint unsigned ...

  8. 51单片机流水灯用c语言,51单片机之流水灯(C语言和汇编两个版本)

    c语言 #include typedef unsigned char uint8; sbit ADDR0=P1^0; sbit ADDR1=P1^1; sbit ADDR2=P1^2; sbit EN ...

  9. 单片机控制lcd序c语言,51单片机驱动1602液晶的C程序

    # include /***************************************** 电路连接 P1------DB0-DB7 P2.0------RS P2.1------RW ...

  10. 51单片机音乐播放器c语言,51单片机之简单的音乐播放器

    /************************************************************* 音乐播放器: 按键 0 - 9 对应最多10首乐曲,当一首乐曲播放完毕后, ...

最新文章

  1. Qt5的cmake文件位置
  2. 计算几何基础模板(2014.10.6一直沿用)
  3. sts引入lombok_Spring Boot中lombok的安装与使用详解
  4. win7_64bit下桌面及开始菜单中图标变为.lnk
  5. 文献记录(part12)--Biclustering of human cancer microarray data using co-similarity based co-clustering
  6. springMVC问题XXX is not mapped [from XX]或者Unknown entity: com.spring.main.pojo.Person
  7. appium+python+windows执行测试用例,并使用HTMLTestRunner输出测试报告
  8. 域名系统(DNS)概述
  9. Android NDK开发从0到1
  10. 独立同分布(iid)随机变量的一些趣题
  11. Intel IPP密码库 IPPCP 2018 开发笔记与总结(全)
  12. win10照片不能下一张的解决办法
  13. 多元函数微分学(微积分)
  14. 把Ethernet(以太网)基本工作原理说清楚
  15. idea环境:Could not initialize class net.sf.cglib.beans.BeanMap
  16. linux优化deepin启动速度,如何优化 Deepin 引导开机速度?
  17. 若依前后端分离打包发布(jar,nginx)
  18. Petalinux和SDK安装
  19. 网咖虚拟服务器主机,为什么网吧的主机这么便宜??但是玩大型游戏又不卡
  20. 低端交换机环路检测专题

热门文章

  1. 多体动力学ANCF方法简单介绍
  2. 神经网络与深度学习pdf下载
  3. python在统计专业的应用_Python统计学statistics实战
  4. 如何下载矢量电子地图
  5. 高性能可扩展mysql(电商数据库设计构思)
  6. mysql数据库在哪里写语句_MySQL数据库基本操作以及SQL语句
  7. Linux系统下在windows虚拟机中使用数位板的问题及解决办法
  8. 黑页网站html源码,仿360网站卫士拦截页面黑页源码
  9. html2canvas ios 15.0截屏 变黑 页面刷新
  10. 【工具】在idea中使用svn