#include "keyboard.h"

/***************************************************************************

程序功能:一个按键的单击、双击、长按。三种按键方式,然后做不同的处理。

这里以P1口的LED变化作为测试

单击:点亮P1口的第一个LED(低电平点亮)

双击:点亮P1口的第二个LED(低电平点亮)

长按:点亮P1口上的8个LED(低电平点亮)

***************************************************************************/

static unsigned char key_driver(void)

{

static unsigned char key_state_buffer1 = key_state_0;

static unsigned char key_timer_cnt1 = 0;

unsigned char key_return = key_no;

unsigned char key;

key = key_input;  //read the I/O states

switch(key_state_buffer1)

{

case key_state_0:

if(key == 0)

key_state_buffer1 = key_state_1;

//按键被按下,状态转换到按键消抖和确认状态//

break;

case key_state_1:

if(key == 0)

{

key_timer_cnt1 = 0;

key_state_buffer1 = key_state_2;

//按键仍然处于按下状态

//消抖完成,key_timer开始准备计时

//状态切换到按下时间计时状态

}

else

key_state_buffer1 = key_state_0;

//按键已经抬起,回到按键初始状态

break;  //完成软件消抖

case key_state_2:

if(key == 1)

{

key_return = key_click;  //按键抬起,产生一次click操作

key_state_buffer1 = key_state_0;  //转换到按键初始状态

}

else if(++key_timer_cnt1 >= 100)  //按键继续按下,计时超过1000ms

{

key_return = key_long;  //送回长按事件

key_state_buffer1 = key_state_3;  //转换到等待按键释放状态

}

break;

case key_state_3:  //等待按键释放

if(key == 1)  //按键释放

key_state_buffer1 = key_state_0;  //切回按键初始状态

break;

}

return key_return;

}

/***************************************************************************

函数功能:中层按键处理函数,调用底层函数一次,处理双击事件的判断,

返回上层正确的无键、单击、双击、长按四种状态

本函数由上层循环调用,间隔10ms

***************************************************************************/

unsigned char key_read(void)

{

static unsigned char key_state_buffer2 = key_state_0;

static unsigned char key_timer_cnt2 = 0;

unsigned char key_return = key_no;

unsigned char key;

key = key_driver();

switch(key_state_buffer2)

{

case key_state_0:

if(key == key_click)

{

key_timer_cnt2 = 0;  //第一次单击,不返回,到下个状态判断是否会出现双击

key_state_buffer2 = key_state_1;

}

else

key_return = key;  //对于无键、长按,返回原事件

break;

case key_state_1:

if(key == key_click)  //又一次单击,时间间隔小于500ms

{

key_return = key_double;  //返回双击事件,回到初始状态

key_state_buffer2 = key_state_0;

}

else if(++key_timer_cnt2 >= 50)

{

//这里500ms内肯定读到的都是无键事件,因为长按大于1000ms

//在1s前底层返回的都是无键

key_return = key_click;  //500ms内没有再次出现单击事件,返回单击事件

key_state_buffer2 = key_state_0;  //返回初始状态

}

break;

}

return key_return;

}

c语言按键长按双击,51单片机实现单按键单击、双击、长按功能相关推荐

  1. 51单片机 玩转按键加减切换+数码管+Proteus仿真

    51单片机 玩转按键加减切换+数码管+Proteus仿真 实例代码 /* 实验说明:实验接线:1,动态数码管模块-->单片机管脚2,独立按键模块-->单片机管脚 K1-->P10K2 ...

  2. 51单片机-DS18B20单片

    51单片机-DS18B20单片 51单片机-DS18B20单片 DS18B20时序 初始化时序 读时序 写时序 DS18B20单片操作流程 ROM指令 功能指令 51单片机-DS18B20单片 需要读 ...

  3. 51单片机:独立按键控制数码管计数

    //按键动作的前沿和后沿会都有大约10ms的抖动,人在按下按键到松开至少需要50ms以上(待考证).此代码实现的功能为给按键计数,并给按键消抖 //欢迎邮箱交流:bglei@foxmail.com 作 ...

  4. 51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能)

    51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能) AT89C52.LCD1602.DS1302.speaker. Proteus仿真 实例代码 #include<reg52.H ...

  5. 基于51单片机51wifi控制4路继电器开关定时功能

    项目简介: 一款基于STC89C52单片机的手机WIFI控制4路继电器的插座控制器设计.通过安装手机APP实现手机和设备的互联,只要手机发送相应的指令,继电器将会按照相关指令进行操作该设计极大的方便了 ...

  6. 简易电子钟c语言程序,(最新整理)基于51单片机的电子钟C语言程序

    <(最新整理)基于51单片机的电子钟C语言程序>由会员分享,可在线阅读,更多相关<(最新整理)基于51单片机的电子钟C语言程序(9页珍藏版)>请在人人文库网上搜索. 1.完整) ...

  7. 59s计时器C语言程序步骤详解,51单片机00-59秒计时器 0-59s Timer

    51单片机00-59秒计时器 0-59s Timer 1.  实验任务 如下图所示,在AT89S51单片机的P0和P2端口分别接有两个共阴数码管,P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个 ...

  8. 单片机c语言计数器测速,基于51单片机的光电编码器测速.doc

    课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器.在位置控制系统中,由于电机既可能正转,也可能反转,所 ...

  9. 单片机 c语言百位加上小数点,51单片机水温控制LCD显示加VB上位机温度曲线绘制...

    现功能,1L水由1KW电炉加热,要求水温在一定范围内人工设定,并能随着环境温度改变自动调节,以维持设定的温度不变. 矩阵键盘输入设定温度,LCD1602显示温度值,VB上位机绘制温度曲线 /***** ...

  10. 用c语言设计红绿灯程序,[转载]51单片机用C语言实现交通灯(红绿灯)源程

    51单片机用C语言实现交通灯(红绿灯)源程序 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改. 源程序如下: #include bit red,green,yellow ...

最新文章

  1. FPGA之道(74)Verilog生成语句
  2. echarts饼图解析html标签,解决echarts中饼图标签重叠的问题
  3. WPF指南之一(WPF的结构)
  4. 知识工程学:一个新的重要研究领域
  5. 关于jQuery对象与DOM对象
  6. C语言使用递归算法实现Sudoku Solver算法(附完整源码)
  7. 一个监测IIS,并定时重新启动的程序。
  8. CSS3 FlexBox布局入门简析
  9. 【Python成长之路】来聊聊多线程的几位“辅助”
  10. win10系统下查看cpu是否启动虚拟化
  11. 小程序跳转样式布局错乱_小程序页面布局样式元素总结
  12. linux内核ttyusb实现,[zhuan]Linux的USB-Serial驱动(从系统初始化到生成tty设备的全过程)...
  13. 微信只显示分享朋友圈和好友  屏蔽其他的分享
  14. python 数据比对 函数_用python比对csv文件中的数据
  15. Matter-JS Composites 混合材料 · 下
  16. 漫画:Bitmap算法
  17. duilib绝对定位与相对定位
  18. Android自定义popWindow教程
  19. 大学物理计算机仿真实验报告,大学物理实验实验报告模板.doc
  20. spring 学习书籍

热门文章

  1. java中的动态图表_Java报表软件--动态图表
  2. js一键批量打印_(原创)javascript 实现批量打印《简历》
  3. C语言烟花代码,C语言实现烟花表白代码
  4. 用JavaScript写的U校园自动答题浏览器分析
  5. 魅族pro5 刷机 android,魅族Pro5刷通用固件方法教程[多图]
  6. Spark核心概念与案例拆解
  7. 逆向工具IDA下载网址
  8. pip学习20200810
  9. 单片机lcd1602程序 c语言,单片机I2C通信及LCD1602显示C程序
  10. uc/os-II的内存改进与实现TLSF算法的详解,移植实现(三)