[51单片机] 请教问题。单片机_双击_。

[复制链接]
3932|44
 楼主| tianqi911 发表于 2018-10-19 09:41 | 显示全部楼层 |阅读模式

1.不要所谓的状态机方法   
2.不要开定时器0的中断(可以开/关定时器0 但不开中断)  
3.如果开中断也行(不得已最后方法)

说明:因为用的是触摸单片机的触摸按键。 按键为1有效。不需要滤波。

实现的基本原理:判断2次按下的时间,>500(or250ms)再有按键按下,就是双击;没有就是_单击_。


目前的状况:我水平很菜,网上看了很多,书上也翻了,我是没实现的了。已经搞了_3天_了,就这个功能了,怎么弄都不行了,快崩溃了。
mohanwei 发表于 2018-10-19 10:02 | 显示全部楼层
既然菜,还端一副老师给学生布置作业的架子,这不行那不行……

你否决的恰恰是各种高低端产品都用的正确办法
mailshichao 发表于 2018-10-19 10:08 | 显示全部楼层
我就想问问状态机是很好的东西,为啥对它有意见
coody 发表于 2018-10-19 10:21 | 显示全部楼层
状态机和定时器,都是很好的处理方法,你偏偏不用。其实很简单的。
gx_huang 发表于 2018-10-19 10:34 | 显示全部楼层
LZ的意思,我很菜,就必须用最菜的方法实现。
最菜的方式,程序一直判断按键状态,不要定时器,应该也不难,但是肯定比较复杂。
sy971586331 发表于 2018-10-19 10:34 | 显示全部楼层
奇怪为啥不能用状态机
ifxz0123 发表于 2018-10-19 11:22 | 显示全部楼层
设置定时器的频率,让计数器的值每50ms计数值加1,按键每次按下是记录计数器的值,然后比较连续两次的按键计数值值的差值。根据差值判断是否是双击。这只是个大概思路,实际编程还需要注意些细节逻辑问题

评论

@tianqi911 :高人能否给写个具体点的框架?  发表于 2018-10-19 18:01
@ifxz0123 :**,就是这个思路,但是我没试验出来。  发表于 2018-10-19 18:01
这个不需要开定时器中断  发表于 2018-10-19 11:23
ayb_ice 发表于 2018-10-19 13:13 | 显示全部楼层
不用状态机会导致系统严重延时
qinlu123 发表于 2018-10-19 14:31 | 显示全部楼层
状态机是非常好的解决办法,也很简单。
ohy3686 发表于 2018-10-19 15:08 | 显示全部楼层
定时器是比较好的实现办法
徕泽 发表于 2018-10-19 15:55 | 显示全部楼层
看来没找对书 用状态机很简单 并且也能打开你编程的思路 建议你学一学状态机的方法 你会发现裸机也能写很复杂的程序

评论

能否推荐本书?  发表于 2018-10-23 10:42
 楼主| tianqi911 发表于 2018-10-19 18:00 | 显示全部楼层
ayb_ice 发表于 2018-10-19 13:13
不用状态机会导致系统严重延时

我问了下原厂的FAE,他跟我说用T0,判断2次之间的时间就行了。可以不用开中断。所以我觉的可能不需要状态机。但我没试验出来,所以问下高人。
 楼主| tianqi911 发表于 2018-10-19 18:02 | 显示全部楼层
coody 发表于 2018-10-19 10:21
状态机和定时器,都是很好的处理方法,你偏偏不用。其实很简单的。

是尽量不开中断。高人。
 楼主| tianqi911 发表于 2018-10-19 21:00 | 显示全部楼层
mailshichao 发表于 2018-10-19 10:08
我就想问问状态机是很好的东西,为啥对它有意见

因为不会。
座机呀 发表于 2018-10-19 22:17 | 显示全部楼层
如果使用的是基于别人编写好的带电容触摸底层的单片机进行二次开发,可能定时器这些资源被底层占用了,不太方便使用,再加上楼主经验不足对于别人的程序架构不能很好的理解,别人写的代码架构应该也考虑到了电容按键的连击这些功能,多花心思看应该可以.
oufuqiang 发表于 2018-10-19 23:38 | 显示全部楼层
  1. #include <reg52.h>

  2. sbit key=P1^0;
  3. sbit out=P1^1;
  4. sbit out2=P1^2;
  5. void main()
  6. {
  7.         bit key_psat,FLAG,ks;
  8.         unsigned long count;
  9.         out=0;
  10.         while(1)
  11.         {
  12.                 ks=key;
  13.                 if(ks==1 && key_psat==0)
  14.                 {
  15.                         out2=!out2;
  16.                         if(FLAG==1)
  17.                         {
  18.                                 if(count<20000)
  19.                                 {
  20.                                         out=!out;
  21.                                 }
  22.                                 FLAG=0;
  23.                                 count=0;
  24.                         }
  25.                         else
  26.                         {
  27.                                 FLAG=1;
  28.                         }
  29.                 }
  30.                 key_psat=ks;
  31.                 if(FLAG==1 && count<20000)
  32.                 {
  33.                         count++;
  34.                         if(count>=20000)
  35.                         {
  36.                                 count=0;
  37.                                 FLAG=0;
  38.                         }
  39.                 }
  40.         }
  41. }

你说我是不是有点闲

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

闲的D疼.  发表于 2018-10-20 10:10
小小电子爱好者 发表于 2018-10-20 09:32 | 显示全部楼层
对状态机有偏见
junyee 发表于 2018-10-20 10:11 | 显示全部楼层
LZ 啊LZ 是在工厂上班吗,,,还招人吗

caijie001 发表于 2018-10-21 12:08 | 显示全部楼层
我已经写完的开源的按键驱动,,纯C语言实现的一个按键驱动,可移植性强,支持单双击、连按、连按释放、长按;采用回调处理按键事件(自定义消抖时间),使用只需3步,1:创建按键,2:按键事件与回调处理函数链接映射。然后周期检查按键。但是你都不需要

评论

@eydj2008嘿嘿嘿  发表于 2018-10-22 13:31
新手 有福了  发表于 2018-10-22 10:07
wdyichen 发表于 2018-10-21 20:27 | 显示全部楼层
用中断计时啊,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

235

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部