完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
关于按键检测的已经有程序了,就是一个按键按下去会出现的三种情况,单击,连击,长按三种情况。那么这三种情况怎么给予几个按键的操作,就没有一点思想怎么搞了!就像有些仪器一样,某个按键单击只加一,双击就改变模式,长按就数字一直加上去或者也是改变模式。
现在,检测程序能够辨别一个按键是出于哪种情况了,接下来需要怎么写了才能达到我上面说的效果!! (像检测程序是出现个返回值来反映按键是出于哪种情况,例如返回个keystats,接下怎么用这个来写应用层) 麻烦各位大神解说一下,有现成的程序给我看看更好了。。。。谢谢!!! |
|
相关推荐
7个回答
|
|
沙发,坐等大神教育!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
你这个可以用定时器再加上时间长度的判断,再加上规定的短时间内次数判断实现。你按下按键时开始计时(也可以用while计时),和按下按键次数++,再把数据返回去,再用一个函数来判断即可
|
|
|
|
苦瓜你好 发表于 2016-3-4 15:56 是,这个我有想过,但是就是区分不了几个按键的的不同情况。你有没有程序可以来看看。 |
|
|
|
你可以将按键分成两个状态,按下和抬起,根据按下和抬起的次数和间隔时间应该是可以判定的
|
|
|
|
/***********************************************************************************************************
程序的功能:一个按键的单击,双击,长按。三种按键方式,然后做不同的处理。这里就以P1口LED灯变化作为测试。 单击:点亮P1口上第一个LED灯。(低电平点亮) 双击:点亮P1口上第二个LED灯。(低电平点亮) 长按:长按:点亮P1口上的8个LED灯。(低电平点亮) 使用方法: 硬件的连接:P2.0作为按键的输入,P1口作为LED显示,连接好后,直接复制粘贴生成HEX文件,烧写进C51就能用。 ************************************************************************************************************/ #include #define N_key 0 //无键 #define S_key 1 //单键 #define D_key 2 //双键 #define L_key 3 //长键 #define key_state_0 0 #define key_state_1 1 #define key_state_2 2 #define key_state_3 3 ***it key_input = P2^0; // 按键输入口 unsigned char time_10ms_ok = 0; unsigned char key = 0; unsigned char key_driver(void) { static unsigned char key_state = key_state_0, key_time = 0; unsigned char key_return = N_key; bit key_press; key_press = key_input; // 读按键I/O电平 switch (key_state) { case key_state_0: // 按键初始态 if (!key_press) key_state = key_state_1; // 键被按下,状态转换到按键消抖和确认状态 break; case key_state_1: // 按键消抖与确认态 if (!key_press) { key_time = 0; // key_state = key_state_2; // 按键仍然处于按下,消抖完成,状态转换到按下键时间的计时状态,但返回的还是无键事件 } else key_state = key_state_0; // 按键已抬起,转换到按键初始态。此处完成和实现软件消抖,其实按键的按下和释放都在此消抖的。 break; case key_state_2: if(key_press) { key_return = S_key; // 此时按键释放,说明是产生一次短操作,回送S_key key_state = key_state_0; // 转换到按键初始态 } else if (++key_time >= 100) // 继续按下,计时加10ms(10ms为本函数循环执行间隔) { key_return = L_key; // 按下时间>1000ms,此按键为长按操作,返回长键事件 key_state = key_state_3; // 转换到等待按键释放状态 } break; case key_state_3: // 等待按键释放状态,此状态只返回无按键事件 if (key_press) key_state = key_state_0; //按键已释放,转换到按键初始态 break; } return key_return; } /*============= 中间层按键处理函数,调用低层函数一次,处理双击事件的判断,返回上层正确的无键、单键、双键、长键4个按键事件。 本函数由上层循环调用,间隔10ms ===============*/ unsigned char key_read(void) { static unsigned char key_m = key_state_0, key_time_1 = 0; unsigned char key_return = N_key,key_temp; key_temp = key_driver(); switch(key_m) { case key_state_0: if (key_temp == S_key ) { key_time_1 = 0; // 第1次单击,不返回,到下个状态判断后面是否出现双击 key_m = key_state_1; } else key_return = key_temp; // 对于无键、长键,返回原事件 break; case key_state_1: if (key_temp == S_key) // 又一次单击(间隔肯定<500ms) { key_return = D_key; // 返回双击键事件,回初始状态 key_m = key_state_0; } else { // 这里500ms内肯定读到的都是无键事件,因为长键>1000ms,在1s前低层返回的都是无键 if(++key_time_1 >= 50) { key_return = S_key; // 500ms内没有再次出现单键事件,返回上一次的单键事件 key_m = key_state_0; // 返回初始状态 } } break; } return key_return; } void main() { P1 = 0xff; //IO口初始化 P2 = 0xff; //定时器的初始化 TMOD = 0x01; //选择定时器的工作模式:定时器0,方式1 TH0 = (65535 - 10000)/256; //定时器的初值 TL0 = (65535 - 10000)%256; EA = 1; //开打总中断使能 ET0 = 1; //打开定时器0 的使能 TR0 = 1; //打开定时器0 ,开始工作 while(1) { if(time_10ms_ok) //time_10ms_ok = 1,表示计时到了10MS。(10MS扫描一次按键) { time_10ms_ok = 0; //清除计时10MS标志 key = key_read(); //调用扫描按键程序,返回一个键值 if (key == L_key) //长按:点亮P1口上的8个LED灯。(低电平点亮) { P1 = 0x00; } else if(key == D_key)//双击:点亮P1口上第二个LED灯。(低电平点亮) { P1 = 0xfd; } else if(key == S_key)//单击:点亮P1口上第一个LED灯。(低电平点亮) { P1 = 0xfe; } } } } void timer0(void) interrupt 1 //用的是定时器0, 这个“interrupt 1”中的“1”代表1号中断即是定时器0中断。如果是“0”就是外部中断0;“2“=外部中断1;”3“定时器1中断;”4“=串行口中断 { TH0 = (65535 - 10000)/256; TL0 = (65535 - 10000)%256; //定时器0的方式1,得在中断程序中重复初值。 time_10ms_ok = 1; //定时10MS 的标志 } |
|
|
|
状态机
|
|
|
|
楼主是想要个一键通吃天下的按键程序,这几乎是不可能的,没有最好,合适就好,从简到繁循序渐进。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
522 浏览 0 评论
656 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
978 浏览 0 评论
1042 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
735 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12047 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 14:56 , Processed in 0.664827 second(s), Total 81, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号