电阻屏按键下拉电阻松手检测问题,求助

自写单片机按键松手检测思路
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
自写单片机按键松手检测思路
一直以来,单片机松手检测用的都是while(key==0);& 这样,不但浪费CPU 资源,还。。。所以,用松手检测 是非常好的,很时髦的。
下面是我晚上做了个小车总结出来的,可以单独的按键,不影响其他按键,几通道都可以。 贴上程序,最后分析整个程序意思。。
&/*----------------------------------------------------------------
&* 文 件 名:KEY.C
&* 芯&&& 片:STC12C5A60S2
&* 晶&&& 振:11.0592MHz
&* 创 建 者:小强
&* 创建日期:
&* 修 改 者:
&* 修改日期:
&* 联系作者:&& QQ:
&* 功能描述:按键扫描
-------------------------------------------------------------*/
//按键扫描
uchar key_scan()
&//前进后退左转右转 按键
&if(key_up&&(key1==0||key2==0||key3==0||key4==0))&& //第一次 key_up=1 那么如果其它按键有按下,则为真 执行下面程序
& delay_10ms();&&&&&&&& //延时去抖
& if(key_up&&(key1==0||key2==0||key3==0||key4==0))&& //再次判断
&& key_up=0;& //松手标志为0 那么下次在检测, if 结果就为0 则不会则行这里语句
&& key_down=1;& //按键被按下标志。&&& 最后如果 按键松手 那么还应该发送一个数据过去,执行关闭
&& if(key1==0)& //如果按键1 按下
&&& return 1;
&& if(key2==0)
&&& return 2;
&& if(key3==0)
&&& return 3;
&& if(key4==0)
&&& return 4;
&if(key1==1&&key2==1&&key3==1&&key4==1)&& //如果所有按键都没有按下。。注意 所有按键都没按下
& key_up=1;& //必须所有按键 没有按下& 松手标志 初始化
&&&& if(key_down==1)&& //这里判断 是否按键 按下过, 按下过 就发送一个数据过去, 关闭之前输出的。
&& key_down=0;&& //初始化
&& return 99;&&& //返回值& 随意更改
&//第二个 独立按键
&if(flag2_up&&(key5==0))&&& //意思同上&
& delay_10ms();&&&& //延时去抖
& if(flag2_up&&(key5==0))&&& //在判断
&& flag2_up=0;
&& flag2_down=1;&& //意思同上
&& if(key5==0)
&&& return 5;&
&if(key5==1)
& flag2_up=1;& //必须所有按键为1 没有按下& 松手标志为1
&&&& if(flag2_down==1)
&& flag2_down=0;
&& return 95;
&//第3个独立 按键
&if(flag3_up&&(key6==0))&&&& //意思同上
& delay_10ms();
& if(flag3_up&&(key6==0))
&& flag3_up=0;
&& flag3_down=1;&& //意思同上
&& if(key6==0)
&&& return 6;&
&if(key6==1)
& flag3_up=1;& //必须所有按键为1 没有按下& 松手标志为1
&&&& if(flag3_down==1)
&& flag3_down=0;& //意思同上
&& return 96;
&return 0;
// 返回的按键 做的处理,执行什么功能。。串口输出数据
&key_num=key_scan();& //读取 按键扫描返回值
& switch(key_num) //判断
&& case 1:
&& UART1_Send_Byte(0x11);& //前进
&& case 2:
&& UART1_Send_Byte(0x22);& //后退
&& case 3:
&& UART1_Send_Byte(0x33); //左转
&& case 4:
&& UART1_Send_Byte(0x44);& //右转
&& case 5:
&& UART1_Send_Byte(0x55);& //按键5& 控制输出1
&& case 6:
&& UART1_Send_Byte(0x66);& //按键6& 控制输出2
&& case 95:
&& UART1_Send_Byte(0x95);& //按键5& 松手后 发送一个数据过去
&& case 96:
&& UART1_Send_Byte(0x96);& //按键6& 松手后 发送一个数据过去
&& case 99:
&& UART1_Send_Byte(0x99);&& // 小车 前进后退 左转 右转& 按键松手后 发送一个停止信号&& 。。。
//上面是整个发送部分,有按键扫描& 判断 发送数据
//下面是接收解码部分
value=SBUF; //value等于串口接收的字节;
switch(value)& //判断接收到的数据
&& case 0x11:& //执行前进
&& case 0x22: //执行后退
&& back();
&& case 0x33:& //执行左转函数
&& left();
&& case 0x44:& //执行右转函数
&& right();
&& case 0x99: //执行 停止 函数
&& stop();
&& case 0x55:& //输出 控制1& 打开
&& out1=0;
&& case 0x95: // 控制1 关闭
&& out1=1;
&& case 0x66: //输出控制2 打开
&& out2=0;
&& case 0x96:& //控制2 关闭
&& out2=1;
OK, 下面整个程序意思分析: 遥控检测按键 是否有按键 按下,如果有按键按下,发送一个前进 0x11过去,接收机 接收到了11 执行前进函数。 那么此时 前进按键 一直按着 则后 左 右 按键 按不起作用,因为这几个共用一个按键按下标志, 但是 按键5 按键 6 是在单独一个松手检测程序里,所以,此时 按键5 按键6 随意触发的。 当前进 按键松手后, 松手down=1 则执行一次 返回99, 这个时候串口又发送一个 99& 停止函数过去,小车停止。 。 不知道这样是不是有点繁琐,但是目前没有其它的好思路,解决这样的几个独立按键,按下,松手检测。 这样好处是,每次只发送一次数据过去,通讯不是那么频繁,响应能快一些。 这个就是整个思路,如果有什么问题可以提问哦~&& ^_^&&& 又忘记要早点睡觉了。。
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved求助 矩阵键盘的松手检测【单片机吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:144,720贴子:
求助 矩阵键盘的松手检测收藏
#include&reg52.h&#define uchar unsigned char#define uint unsigned int#define delay(a) delay_ms(a)sbit DULA = P2^6;sbit WELA = P2^7;uchar code digL[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0xff, 0x00};unsigned char keyscan();void main(){WELA = 1;P0 = 0WELA = 0;DULA = 1;P0 = digL[0];while(1){a = keyscan();while(P3!=0xf0);
//这个检测不对吗 求大神看看 按键无效switch(a){case 6 : a = 0;case 7 : a = 1;case 8 : a = 2;case 9 : a = 3;case 10 : a = 4;case 11 : a = 5;case 12 : a = 6;case 13 : a = 7;case 14 : a = 8;case 15 : a = 9;case 16 : a = 10;case 17 : a = 11;case 18 : a = 12;case 19 : a = 13;case 20 : a = 14;case 21 : a = 15;default :}if(a!=255){P0 = digL[a];}}}unsigned char keyscan(){
unsigned char a,P3 = 0if(P3!=0xfe){for(a=0; a&6; a++)for(y=0; y&110; y++);if(P3!=0xfe)switch(P3){case 0xee : P3=0xf0; return 6;case 0xde : P3=0xf0; return 7;case 0xbe : P3=0xf0; return 8;case 0x7e : P3=0xf0; return 9;}}P3 = 0if(P3!=0xfe){for(a=0; a&6; a++)for(y=0; y&110; y++);if(P3!=0xfe)switch(P3){case 0xed : P3=0xf0; return 10;case 0xdd : P3=0xf0; return 11;case 0xbd : P3=0xf0; return 12;case 0x7d : P3=0xf0; return 13;}}P3 = 0if(P3!=0xfe){for(a=0; a&6; a++)for(y=0; y&110; y++);if(P3!=0xfe)switch(P3){case 0xeb : P3=0xf0; return 14;case 0xdb : P3=0xf0; return 15;case 0xbb : P3=0xf0; return 16;case 0x7b : P3=0xf0; return 17;}}P3 = 0xf7;if(P3!=0xfe){for(a=0; a&6; a++)for(y=0; y&110; y++);if(P3!=0xfe)switch(P3){case 0xe7 : P3=0xf0; return (18);case 0xd7 : P3=0xf0; return (19);case 0xb7 : P3=0xf0; return (20);case 0x77 : P3=0xf0; return (21);}}P3=0xf0;return (255);}
为用户提供各种低成本,低功耗,低能耗,功能强的微控制器解决方案.恩智浦微控制器,高性能,设计新颖,性能稳定,价格超低,欲购从速,欢迎垂询!
keyscan函数返回的时候你设置的p3不一定赋值0xf0,你继续想想keuscan中 return的作用
登录百度帐号推荐应用简约而又不简单的按键检测的松手检测程序设计 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
简约而又不简单的按键检测的松手检测程序设计
21:29:30  
18676&查看
本帖最后由 zzp 于
19:25 编辑
& && && && && && && &&&如何设计按键检测的松手检测& && &&&说到按键,我还是有不少研究的,其实按键没我们想的那么简单,要把按键程序写好也不是一件容易的事,功能要求:单击、双击、长按及组合,按下不动,返回有效值速度越来越快,多用在参数调节,这些都是值得大家去研究的,还有8个IO口,让16个独立按键与8个独立按键共同使用这是没有问题的。& && &&&扯远了,今天只讨论如何做松手检测,松手检测意义,很简单,就是按下按键只对应一次操作,不会因为按着不动就不停的返回按键值,我们大多时候见到的松手检测程序就是 “while(!k1)”,一种等待式写法,打个比方,这就如同你插上热得快烧水,你坐在旁边看着,等着水热,拜拜浪费时间。这种写法根本不适应实际应用,拜拜浪费CPU时间。看一下代码:& && & 功能:按键检测子函数,四个独立按键接在P2口高四位,调用时返回按键值1,2,3,4,没有按键按下返回0.char ReadKey(void){& && && &static Key_on_off = 0;& && && &unsigned char num,temp = 0;& && &&&num = P2;& && && && && && && && && && && &//&&读取P2口状态& && && &num&= 0xf0;& && && && && && && && & //&&屏蔽第四位& && && &if(num != 0xf0)& && && && & //&&判断是否有按键按下& && && & {& && && && &if(Key_on_off == 0)& && && &//&&自锁变量& && && && && &&&{& && && && && && && && & /***********&&相对高级的松手检测& && && & ****************/& && && && && &&&Key_on_off = 1;& &// 如果屏蔽这句话,将没有松手检测,数字将加的很快& && && && && && && && &&&switch(num)& && && && && && && && &&&//&&读取按键信息& && && && && && && && && && && &{& && && && && && && && && && && &&&case 0xe0: temp=1;& && && && && && && && && && && &&&case 0xd0: temp=2;& && && && && && && && && && && &&&case 0xb0: temp=3;& && && && && && && && && && && &&&case 0x70: temp=4;& && && && && && && && && && && &}& && && && && & /***********&&最笨的松手检测& && && & ****************/& && && && && & /*& && && && && & while(num != 0xf0)& && && && & //&&判断是否有按键按下& && && && && && && && && && && &{& && && && && && && && && && && && &num = P2;& && && && && && && && & //&&读取P2口状态& && && && && && && && && && && && &num&= 0xf0;& && && && && && && && & //&&屏蔽第四位
& && && && && && && && && && && &}& && && & */ & && && && && && &}& && && & }& && && &else& && && & {& && && && &Key_on_off = 0;& & //&&当没有任何按键按下时&&解锁& && && & }& && && && && &}
& && & 利用一个静态变量Key_on_off,记住一定要是静态的或者全局的,初始化为零,当检测到按键按下的时候,同时要满足Key_on_off等于0,才进入里面判断是哪个按键,同时将Key_on_off置1,那么当按键还没有松开,函数又被第二次及以上调用时,由于Key_on_off等于1,就不按键值解析里面去,按键值返回的是默认的0,属于无效值,着就相当于上了一把锁,那么什么时候解锁了,看下面当检测到没有按键按下的时候,Key_on_off = 0 , 一担松手就解锁,当再次按下的时候出一次有效按键值,再次上锁。如此往返。。。更过关于按键的设计,请持续关注帖子。。。代码+protues仿真在附件。本人是“WS”,对你有用,请点个赞。。。
& & 今天有人提到了我的程序中没有去抖动检测,关于按键的抖动,别人教你的一半都是延时5~10MS再次检测, 想说的是,延时去抖动会拖慢的系统,5MS在我看着这么多么的奢侈,5MS单片机可以执行完成太多的任务,就这么浪费了, 痛心、痛心。 & & 本函数调用要求为:20~50ms调用一次,就能得到很好的消抖动效果,你可以想象一下,在时间轴上,0时刻检测到按键按下,到10ms时刻再次检测到按键按下,就确定按键按下。首先大家要明白一点,只有按键按下的时候才有电平抖动,没有按按键是没有按键抖动的,去按键抖动是为了防止一次按下按键而而检测到几次按下。在看看我的设计,0时刻检测到按键按下,那么按键肯定按下了,我已经返回了有效值,20MS后抖动已经过去,低电平已经稳定,不会再返回按键有效值,达到去抖动目的。。。
(53.41 KB, 下载次数: 101)
21:27 上传
21:26 上传
点击文件名下载附件
下载积分: 积分 -1 分
77.49 KB, 下载次数: 335, 下载积分: 积分 -1 分
09:49:58  
光有松手检测,没有消抖啊……
11:39:21  
光有松手检测,没有消抖啊……
本函数20MS调用一次, 就能得到很好的去抖动效果。。。
17:18:27  
楼主大牛!楼主大牛!楼主大牛!
23:44:39  
很给力。。。不错。。值得学习
00:19:28  
挺好的,虽然还没能太理解楼主的思路,如果能说得更简单的就好了,因为我是刚学单片机,而这个以后肯定会用到的,论坛又没收藏功能
13:45:36  
感觉消抖后还是需要检查是否按下按键,个人认为检测两次会防止一些不必要的意外
20:56:19  
挺好的,虽然还没能太理解楼主的思路,如果能说得更简单的就好了,因为我是刚学单片机,而这个以后肯定会用 ...
论坛没有收藏功能,浏览器有啊!
10:48:35  
嗯,,有启发,,
12:36:29  
感觉消抖后还是需要检查是否按下按键,个人认为检测两次会防止一些不必要的意外 ...
想要检测两次很简单,利用我的那个静态变量记录状态就行。在长时间的应用中,我一直采用这只检测一次的思路,前提是调用时间不小于20MS,很稳定。
21:20:53  
前辈,您好,我是刚学习单片机的新手,我想请问下这个按键检测的程序,本函数调用要求为:20~50ms调用一次,就能得到很好的消抖动效果。请问下这个20~50ms调用一次,这个是什么意思?比如我一个程,main函数里面,while(1){&&....},是不是在while里面要多次调用这个按键检测子函数?
23:10:10  
楼主大牛!楼主大牛!
11:30:47  
还不错呀,学习了
13:56:56  
前辈,您好,我是刚学习单片机的新手,我想请问下这个按键检测的程序,本函数调用要求为:20~50ms调用一次 ...
用定时器来控制时间
15:20:02  
不错了,学习了,谢谢楼主分享
10:39:57  
不错了,学习了,谢谢楼主分享
助理工程师
15:50:34  
谢谢分享谢谢分享
11:34:04  
相当的Nice!楼主发的就是精品!
20:45:14  
什么10毫秒延时耗时间,楼主有点弱了。。。
如果在前后台程序中,定时器每1毫秒中断,只要在定时器中断中用计数器变量计数10次就可以无堵塞延时了,
如果有RTX,直接调用系统服务就行了
任何有堵塞延时在实时系统都是不允许的。
另外连按检测,释放检测,按下检测,长按检测这些怎么没有呢
你这个程序嘛,玩玩就可以,商业化可是不行的。。。
助理工程师
11:03:53  
& && && && && && && && &
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司单片机,按钮已经松手了,有松手检测,为什么另外的按钮没用了_百度知道
单片机,按钮已经松手了,有松手检测,为什么另外的按钮没用了
led[1]=speed/100; display(led[0],led[1],j;j++)
for(i=0;10%10; }
}}void motor_ccw(void){ if(key1==0) {flag=1; beep(); for(r=0;8; }
}}void keyscan(){uchar r,n=32;i++)
P1=CCW[i];
delayms(200);
}}void main(){ while(1) {
led[3]=speed%10;
led[2]=speed/8!key2);
while(!key3);
}if(key4==0) {
beep(); speed--;
}}前面的和显示部分应该没错;r&n;r++)
motor_ccw();r&n;r++)
motor_cw()void motor_cw(void){8;
while(!key4);
}if(key2==0) {
flag=0; beep(); for(r=0,j,led[2],led[3]); keyscan();i&8;i++)
delayms(200);
while(!key1);
} if(key3==0) {
beep(); speed++; for(j=0;j&j++)
for(i=0;i& for(j=0;j&lt
我有更好的答案
这段程序存在严重的问题,仅适合实验室,无法用于现场控制!因为无防干扰设计,且按键扫描所占时间比太小,极易导致按键无响应。另外需检查 beep();
那该怎么改呢我程序的话,能发给我一份不,邮箱。谢谢
通过多次监测按键(中间插入延时),确认按键按下后,置位按键标志位。然后根据按键标志位,执行不同程序。按键标志位为0,则不执行任何程序,提高按键扫描所占时间比,类似状态机的控制方法。这样也有利于你找出程序的错误位置。
你把程序发过来看看啊!如果不是中断的放,就必须一直扫描按键才行啊!
不可能的,肯定逻辑上有错误
为您推荐:
其他类似问题
您可能关注的内容
单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
键盘松手检测程序
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 按键下拉电阻 的文章

 

随机推荐