打印
[51单片机]

请教问题。单片机_双击_。

[复制链接]
2286|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 | 只看该作者
状态机和定时器,都是很好的处理方法,你偏偏不用。其实很简单的。

使用特权

评论回复
5
gx_huang| | 2018-10-19 10:34 | 只看该作者
LZ的意思,我很菜,就必须用最菜的方法实现。
最菜的方式,程序一直判断按键状态,不要定时器,应该也不难,但是肯定比较复杂。

使用特权

评论回复
6
sy971586331| | 2018-10-19 10:34 | 只看该作者
奇怪为啥不能用状态机

使用特权

评论回复
7
ifxz0123| | 2018-10-19 11:22 | 只看该作者
设置定时器的频率,让计数器的值每50ms计数值加1,按键每次按下是记录计数器的值,然后比较连续两次的按键计数值值的差值。根据差值判断是否是双击。这只是个大概思路,实际编程还需要注意些细节逻辑问题

使用特权

评论回复
评论
tianqi911 2018-10-19 18:01 回复TA
@tianqi911 :高人能否给写个具体点的框架? 
tianqi911 2018-10-19 18:01 回复TA
@ifxz0123 :**,就是这个思路,但是我没试验出来。 
ifxz0123 2018-10-19 11:23 回复TA
这个不需要开定时器中断 
8
ayb_ice| | 2018-10-19 13:13 | 只看该作者
不用状态机会导致系统严重延时

使用特权

评论回复
9
qinlu123| | 2018-10-19 14:31 | 只看该作者
状态机是非常好的解决办法,也很简单。

使用特权

评论回复
10
ohy3686| | 2018-10-19 15:08 | 只看该作者
定时器是比较好的实现办法

使用特权

评论回复
11
徕泽| | 2018-10-19 15:55 | 只看该作者
看来没找对书 用状态机很简单 并且也能打开你编程的思路 建议你学一学状态机的方法 你会发现裸机也能写很复杂的程序

使用特权

评论回复
评论
tianqi911 2018-10-23 10:42 回复TA
能否推荐本书? 
12
tianqi911|  楼主 | 2018-10-19 18:00 | 只看该作者
ayb_ice 发表于 2018-10-19 13:13
不用状态机会导致系统严重延时

我问了下原厂的FAE,他跟我说用T0,判断2次之间的时间就行了。可以不用开中断。所以我觉的可能不需要状态机。但我没试验出来,所以问下高人。

使用特权

评论回复
13
tianqi911|  楼主 | 2018-10-19 18:02 | 只看该作者
coody 发表于 2018-10-19 10:21
状态机和定时器,都是很好的处理方法,你偏偏不用。其实很简单的。

是尽量不开中断。高人。

使用特权

评论回复
14
tianqi911|  楼主 | 2018-10-19 21:00 | 只看该作者
mailshichao 发表于 2018-10-19 10:08
我就想问问状态机是很好的东西,为啥对它有意见

因为不会。

使用特权

评论回复
15
座机呀| | 2018-10-19 22:17 | 只看该作者
如果使用的是基于别人编写好的带电容触摸底层的单片机进行二次开发,可能定时器这些资源被底层占用了,不太方便使用,再加上楼主经验不足对于别人的程序架构不能很好的理解,别人写的代码架构应该也考虑到了电容按键的连击这些功能,多花心思看应该可以.

使用特权

评论回复
16
oufuqiang| | 2018-10-19 23:38 | 只看该作者
#include <reg52.h>

sbit key=P1^0;
sbit out=P1^1;
sbit out2=P1^2;
void main()
{
        bit key_psat,FLAG,ks;
        unsigned long count;
        out=0;
        while(1)
        {
                ks=key;
                if(ks==1 && key_psat==0)
                {
                        out2=!out2;
                        if(FLAG==1)
                        {
                                if(count<20000)
                                {
                                        out=!out;
                                }
                                FLAG=0;
                                count=0;
                        }
                        else
                        {
                                FLAG=1;
                        }
                }
                key_psat=ks;
                if(FLAG==1 && count<20000)
                {
                        count++;
                        if(count>=20000)
                        {
                                count=0;
                                FLAG=0;
                        }
                }
        }
}

你说我是不是有点闲

使用特权

评论回复
评论
junyee 2018-10-20 10:10 回复TA
闲的D疼. 
17
小小电子爱好者| | 2018-10-20 09:32 | 只看该作者
对状态机有偏见

使用特权

评论回复
18
junyee| | 2018-10-20 10:11 | 只看该作者
LZ 啊LZ 是在工厂上班吗,,,还招人吗

使用特权

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

使用特权

评论回复
评论
caijie001 2018-10-22 13:31 回复TA
@eydj2008嘿嘿嘿 
eydj2008 2018-10-22 10:07 回复TA
新手 有福了 
20
wdyichen| | 2018-10-21 20:27 | 只看该作者
用中断计时啊,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

235

帖子

2

粉丝