按键连续点击的c语言程序,长按键C语言程序
长按键C语言程序
zhchxgh | 2009-07-04 01:46:51 阅读:8246
发布文章
一共用了四个按钮.
#define _KEYDOWN_TEST_TIME (20)
unsigned char IsKeyDown(volatile unsigned char Value, unsigned char pin)
{
unsigned long CurState = 0, i;
for(i = 0; i
CurState += _GET_BIT(Value, pin)? 0:1; //键盘接了上拉电阻,低电平才是按下
if(CurState == _KEYDOWN_TEST_TIME)
return 1;
return 0;
}
//以下所有值均是以 DealWithKey函数的调用频率为基础的,该频率是定时器2的定时值决定的
//短按键的计数值,只有当按键检测计数器计数大于等于此值时才认为是一次短按
#define _KEY_SHORT_CNTR (2)
//长按键的计数值,只有当按键检测计数器计数大于等于此值时才认为是一次长按
#define _KEY_LONG_CNTR (_KEY_SHORT_CNTR * 3)
//无按键按下时的按键检测间隔,用于按键消抖动
#define _KEY_NORMAL_DEVIDER (2)
//此值用于按钮长按后,按钮检测函数的执行频率
#define _ADDMIN_FAST_DEVIDER (15)
//此值用于按钮短按后,按钮检测函数的执行频率
#define _ADDMIN_LONG_DEVIDER (_ADDMIN_FAST_DEVIDER * 3)
//此值用于设置蜂鸣器鸣响时间
#define _BEEPER_DEVIDER (10)
void DealWithKey(void)
{
static unsigned int AddCntr = 0;
static unsigned int MinCntr = 0;
static unsigned int UnitCntr = 0;
static unsigned int RunCntr = 0;
static unsigned char BeepCntr = 0;
static unsigned int DevCntr = 0;
static unsigned char LastRunState = 0;
unsigned char temp;
if(g_State != Setting) //运行状态, 所有按键都无效
return;
if(BeepCntr > 0) //处理蜂鸣器
--BeepCntr;
else
_BEEPER_OFF;
if(DevCntr) //按键处理分频器
{
--DevCntr;
return;
}
//这个按钮是可以重复进入的, 长按后先低频率动作, 当动作几次后再高频率动作
AddCntr = IsKeyDown(_PIN(_TO_KEY_ADD), _KEY_ADD)? AddCntr + 1 : 0;
if((temp = (AddCntr >= _KEY_LONG_CNTR)) || AddCntr >= _KEY_SHORT_CNTR)
{
...
}
//同上
MinCntr = IsKeyDown(_PIN(_TO_KEY_MIN), _KEY_MIN)? MinCntr + 1 : 0;
if((temp = (MinCntr >= _KEY_LONG_CNTR)) || MinCntr >= _KEY_SHORT_CNTR)
{
...
}
//这个按钮是不可重复进入的, 就是说只有抬起后再按下才动作
UnitCntr = IsKeyDown(_PIN(_TO_KEY_UNIT), _KEY_UNIT)? UnitCntr + 1 : 0;
if(UnitCntr == _KEY_SHORT_CNTR)
{
...
}
else if(UnitCntr > _KEY_SHORT_CNTR)
{
UnitCntr = _KEY_SHORT_CNTR + 1; //禁止重复执行
}
//这个按钮是要在按钮抬起后才执行其他函数的
if(IsKeyDown(_PIN(_TO_KEY_RUN), _KEY_RUN))
{
++RunCntr;
}
else
{
RunCntr = 0;
if(LastRunState) //表明键已经按下后才抬起的
{
LastRunState = 0;
g_State = EmptyInflatting;
}
}
if(RunCntr == _KEY_SHORT_CNTR)
{
BeepCntr = _BEEPER_DEVIDER;
_BEEPER_ON;
LastRunState = 1; //此键是抬起时生效.
}
else if(RunCntr > _KEY_SHORT_CNTR)
{
RunCntr = _KEY_SHORT_CNTR + 1; //禁止重复执行
}
DevCntr = _KEY_NORMAL_DEVIDER;
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
参与讨论
请登录...
登录后参与讨论
按键连续点击的c语言程序,长按键C语言程序相关推荐
- 按键连续点击的c语言程序,【转】按键长按与短按处理程序[C语言]--通過測試
#define PRESSED 0 #define Long_cnt 65534 //長鍵判斷值 #define Short_cnt 250 //短鍵判斷值,消抖动 void Key_Pressed( ...
- c语言 最长单词,c语言求最长公共单词
#include #include //找出最长单词 void maxword(char *s,char *t){ //记录公共单词的长度,下标为单词顺序下标 从0开始 int recordWordL ...
- AndroidStudio安卓原生开发_android按钮防止短时间内连续点击_在android_java中都能使用---Android原生开发工作笔记131
这个短时间内的连续点击,处理是需要做的,要不然有可能程序会不够健壮,其实就跟考虑并发一样, 你可以不做, 一个两个人用没事,但是如果你放到实际场景中去应用,真的是不行,会出来各种莫名其妙的问题,一点都 ...
- 上位机与下位机程序配合是 下位机程序崩溃
最近作为一个菜鸟,一直测试同事用QT写好的上位机与下位机程序, 结果配置一个模块,连续点击多次下载时,下位机出现程序崩溃的情况.如图 根据提示得知 在下位机线程没有结束的时候,我通过上位机就把内容情况 ...
- “完美”解决微信小程序购物车抛物动画,在连续点击时出现计算错误问题,定时器停不下来。
"完美"解决微信小程序购物车抛物动画,在连续点击时出现计算错误问题,定时器停不下来. 参考文章: (1)"完美"解决微信小程序购物车抛物动画,在连续点击时出现计 ...
- 微信小程序长按和点击同时存在时,2个都会触发的问题
问题描述: 在列表上实现长按弹框删除,点击进入详情页.在模拟器上正常,但在手机端,长按同时会触发点击. 长按.点击触发顺序: 点击:touchstart → touchend → tap ...
- 谷歌浏览器扩展程序-实现按钮自动连续点击
谷歌的扩展程序非常简单.必要的文件只有manifest.json文件.在该文件中声明了扩展的名称.版本.权限.设置选项和其他的一些和扩展相关的元数据. 我所做的扩展实现的主要功能是按钮自动连续点击.该 ...
- c语言 执行free函数程序被卡住,FreeRTOS操作系统,在按键中断函数中恢复被挂起的任务,程序卡死的原因和解决办法...
FreeRTOS操作系统,在按键中断函数中恢复被挂起的任务,程序卡死的原因和解决办法 时间:2019-08-10 14:39:47 来源: 作者: 所属栏目:其他服务端 这里将告诉您FreeRT ...
- 博采 27 门语言之长,提升 Python 的能力
作者:Nick Coghlan 译者:豌豆花下猫@Python猫 英文:https://www.curiousefficiency.org/posts/2015/10/languages-to-imp ...
最新文章
- php api接口调试,PHP API接口测试小工具
- oracle 压缩导出 导入,EXP直接导出压缩问津,IMP直接导入压缩文件的方法
- php 条形码生成器,PHP条形码图像生成器
- IOT(33)---NB-IOT通用物联解决方案
- FlashCache初探(一)
- 现代 C++ 救不了程序员!
- oracle利用正则表达式判断字符串只包含数字
- cocos2d-x学习(一) HelloWorld
- win10安装nvidia驱动
- centos7 django mysql_安装和部署centos7 python3。X Django MySQL,centos7python3Xdjangomysql
- Python多环境扩展管理-Virtualenv
- POI导出之我的实践篇
- 助力疫情防控,无接触式Beacon蓝牙考勤打卡方案
- Solid Edge如何制作爆炸图
- 如何看待360与腾讯之争
- 一点点读懂regulator(一)
- swift UI 学习 (一)
- 成为认知高手,要避免这9个认知思维陷阱!
- [shell] find 指令的使用 (如:找到大于10M的文件)
- 马化腾:电力时代孕育了计算机,人工智能兴盛于云计算