c语言按键长按双击,51单片机实现单按键单击、双击、长按功能
#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单片机实现单按键单击、双击、长按功能相关推荐
- 51单片机 玩转按键加减切换+数码管+Proteus仿真
51单片机 玩转按键加减切换+数码管+Proteus仿真 实例代码 /* 实验说明:实验接线:1,动态数码管模块-->单片机管脚2,独立按键模块-->单片机管脚 K1-->P10K2 ...
- 51单片机-DS18B20单片
51单片机-DS18B20单片 51单片机-DS18B20单片 DS18B20时序 初始化时序 读时序 写时序 DS18B20单片操作流程 ROM指令 功能指令 51单片机-DS18B20单片 需要读 ...
- 51单片机:独立按键控制数码管计数
//按键动作的前沿和后沿会都有大约10ms的抖动,人在按下按键到松开至少需要50ms以上(待考证).此代码实现的功能为给按键计数,并给按键消抖 //欢迎邮箱交流:bglei@foxmail.com 作 ...
- 51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能)
51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能) AT89C52.LCD1602.DS1302.speaker. Proteus仿真 实例代码 #include<reg52.H ...
- 基于51单片机51wifi控制4路继电器开关定时功能
项目简介: 一款基于STC89C52单片机的手机WIFI控制4路继电器的插座控制器设计.通过安装手机APP实现手机和设备的互联,只要手机发送相应的指令,继电器将会按照相关指令进行操作该设计极大的方便了 ...
- 简易电子钟c语言程序,(最新整理)基于51单片机的电子钟C语言程序
<(最新整理)基于51单片机的电子钟C语言程序>由会员分享,可在线阅读,更多相关<(最新整理)基于51单片机的电子钟C语言程序(9页珍藏版)>请在人人文库网上搜索. 1.完整) ...
- 59s计时器C语言程序步骤详解,51单片机00-59秒计时器 0-59s Timer
51单片机00-59秒计时器 0-59s Timer 1. 实验任务 如下图所示,在AT89S51单片机的P0和P2端口分别接有两个共阴数码管,P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个 ...
- 单片机c语言计数器测速,基于51单片机的光电编码器测速.doc
课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器.在位置控制系统中,由于电机既可能正转,也可能反转,所 ...
- 单片机 c语言百位加上小数点,51单片机水温控制LCD显示加VB上位机温度曲线绘制...
现功能,1L水由1KW电炉加热,要求水温在一定范围内人工设定,并能随着环境温度改变自动调节,以维持设定的温度不变. 矩阵键盘输入设定温度,LCD1602显示温度值,VB上位机绘制温度曲线 /***** ...
- 用c语言设计红绿灯程序,[转载]51单片机用C语言实现交通灯(红绿灯)源程
51单片机用C语言实现交通灯(红绿灯)源程序 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改. 源程序如下: #include bit red,green,yellow ...
最新文章
- FPGA之道(74)Verilog生成语句
- echarts饼图解析html标签,解决echarts中饼图标签重叠的问题
- WPF指南之一(WPF的结构)
- 知识工程学:一个新的重要研究领域
- 关于jQuery对象与DOM对象
- C语言使用递归算法实现Sudoku Solver算法(附完整源码)
- 一个监测IIS,并定时重新启动的程序。
- CSS3 FlexBox布局入门简析
- 【Python成长之路】来聊聊多线程的几位“辅助”
- win10系统下查看cpu是否启动虚拟化
- 小程序跳转样式布局错乱_小程序页面布局样式元素总结
- linux内核ttyusb实现,[zhuan]Linux的USB-Serial驱动(从系统初始化到生成tty设备的全过程)...
- 微信只显示分享朋友圈和好友 屏蔽其他的分享
- python 数据比对 函数_用python比对csv文件中的数据
- Matter-JS Composites 混合材料 · 下
- 漫画:Bitmap算法
- duilib绝对定位与相对定位
- Android自定义popWindow教程
- 大学物理计算机仿真实验报告,大学物理实验实验报告模板.doc
- spring 学习书籍
热门文章
- java中的动态图表_Java报表软件--动态图表
- js一键批量打印_(原创)javascript 实现批量打印《简历》
- C语言烟花代码,C语言实现烟花表白代码
- 用JavaScript写的U校园自动答题浏览器分析
- 魅族pro5 刷机 android,魅族Pro5刷通用固件方法教程[多图]
- Spark核心概念与案例拆解
- 逆向工具IDA下载网址
- pip学习20200810
- 单片机lcd1602程序 c语言,单片机I2C通信及LCD1602显示C程序
- uc/os-II的内存改进与实现TLSF算法的详解,移植实现(三)