搜索
bottom↓
楼主: stanley.zhao

[转]新型的按键扫描程序

  [复制链接]

出0入0汤圆

发表于 2010-6-16 08:33:15 | 显示全部楼层

出0入0汤圆

发表于 2010-6-16 15:10:51 | 显示全部楼层
KEY.....
牛人

出0入0汤圆

发表于 2010-6-16 16:17:27 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2010-6-21 11:26:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-21 11:31:36 | 显示全部楼层
和这个差不多

void scankey_1(void)
{
    (BTTN == 0)?(bttnflg = SETB):(bttnflg = CLR);
}


void scankey_2(void)
{
    if(bttnflg)
    {
        if((bttnflg ^ b_key) && (BTTN == 0))
        {
            invstartflg();     //start or set the encode's flag to take up encode rountine
        }
    }
    b_key = bttnflg;
}

出150入0汤圆

发表于 2010-7-21 12:56:16 | 显示全部楼层
马一下

出0入0汤圆

发表于 2010-7-21 12:59:45 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-7-21 15:07:21 | 显示全部楼层
回复【50楼】Etual
呃,想起来了,还有一篇精粹的东西,也需要用来配合按键检测的
http://blog.chinaunix.net/u1/52089/showart.php?id=456046
这文章被***百宝箱收录了,事实上也是出自我的手,悲剧 orz

-----------------------------------------------------------------------

浅谈单片机程序设计中的“分层思想”



随便写下的一点东西,本来打算去发表,不过想想还是算了,不是什么重要的东西,不过这个东西确实很有用。文章烂的去组织和修改了,随便看看吧。



分层的思想,并不是什么神秘的东西,事实上很多做项目的工程师本身自己也会在用。看了不少帖子都发现没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种恍然大悟的感觉。如果说我不懂LCD怎么驱动,那好办,看一下datasheet,参考一下阿别人的程序,很快就可以做出来。但是如果不懂程序设计的思想的话,会给你做项目的过程中带来很多很多的困惑。

参考了市面上各种各样的嵌入式书籍,MCS-51,AVR ,ARM 等都有看过,但是没有发现有哪本是介绍设计思想的,就算有也是凤毛麟角。写程序不难,但是程序怎么样才能写的好,写的快,那是需要点经验积累的。结构化模块化的程序设计的思想,使最基本的要求。然而这么将这个抽象的概念运用到工程实践当中恩?那需要在做项目的过程中经历磨难,将一些东西总结出来,抽象升华为理论,对经验的积累和技术的传播都大有裨益。所以在下出来献丑一下,总结一些东西。



就我个人的经验而谈,有两个设计思想是非常重要的。

一个就是“时间片轮的设计思想”,这个对实际中解决多任务问题非常有用,通常可以用这个东西来判断一个人是单片机学习者,还是一个单片机工程师。这个必须掌握。由于网上介绍这个的帖子也不少,所以这里就不多说了。



第二个就是我今天想说的主题“分层屏蔽的设计思想”。下面用扫描键盘程序例子作为引子,引出今天说的东西。



问题的提出

单片机学习板一般为了简单起见,将按键分配的很好,例如整个 4*4 的键盘矩阵分配到 P1 口上面,8条控制线,刚好。这样的话程序也非常好写。只需要简单的

KEY_DAT = P1;

端口的数据就读进来了。



诚然,现实中没有这么好的事情。在实际的项目应用当中,单片机引脚的复用相当厉害,这跟那些所谓的单片机学习板就有很大的差别了。

另外一个原因,一般设计来说,是“软件配合硬件”的设计流程,简单点说就是,先确定好硬件原理图,硬件布线,最后才是软件的开发,因为硬件修改起来比较麻烦,相对来说软件修改的时候比较好改。这个就是中国传统的阴阳平衡哲学原理。硬件设计和软件设计本来就是鱼和熊掌的关系,两者不可兼得。方便了硬件设计,很可能给写软件带来很大的麻烦。反过来说,方便了软件设计,硬件设计也会相当的麻烦。如果硬件设计和软件设计同时方便了,那只有两种可能,一是这个设计方案非常简单,二是设计师已经达到了一个非常高的境界。我们不考虑那么多情况,单纯从常用的实际应用的角度来看问题。



硬件为了布线的方便,很多时候会可能将IO口分配到不同的端口上面,例如上面说的4*4键盘,8根线分别分配到 P0 P1 P2 P3 上面去了。那么,开发板的那些扫描键盘程序可以去见鬼了。怎么扫按键?我想起了我刚开始学习的时候,分成3段非常相似的程序,一个一个按键的扫描的经历......



或许有人不甘心,“那些东西我花了很长时间学习的,也用的好好的,怎么能说一句不用就不用?”虽然有点残忍,但是我还是想说“兄弟,接受现实吧,现实是残酷的......”



不过,人区别于低等动物的差别,是人会创造,在碰到困难的时候会想办法解决,于是我们开始了沉思......



最后我们引入初中数学学的“映射”的概念来解决问题。基本思想就是,将不同端口的按键映射到相同端口上面。



这样按键扫描程序就分成3个层次了。

1)最底层的是硬件层,完成端口扫描,20ms延时消抖,将端口的数据映射到一个KEY_DAT寄存器上面,KEY_DAT作为对上层驱动层的一个接口。



2)中间的一层是驱动层,驱动层只对 KEY_DAT 寄存器的数值进行操作。简单点说,我们无论底层的硬件是怎么接线的,在驱动层都不需要关心,只需要关心 KEY_DAT 这个寄存器的数值是什么就可以了。这样出来的间接效果就是“屏蔽了底层硬件的差异”,所以驱动层写的程序就可以通用了。

驱动层的另外一个功能是为了上层提供消息接口。我们用了类似window程序的消息的概念。这里可以提供一些按键消息,例如:按下消息,松开消息,长按键消息,长按键的时候的步进消息,等等。



3)应用层。这里就是根据项目的不同分别写按键功能程序,属于最上层的程序。它使用的是驱动层提供的消息接口。在应用层写程序的思想就是,我不管下层是怎么工作的,我只关心按键消息。有按键消息来的时候我就执行功能,没有消息来的时候,我就什么也不做。



下面用一个简单的常用的例子,说明我们这个设计思想的用法。



秒表调整时间的时候,要求按着某个按键不放,时间能连续的向上增加。这个东西很实用,实际的家电中用途很广泛。

在看下面的东西之前,大家可以想一下,这东西难吗?相信大家都会很响亮的回答,“不难!!”,然而我再问:“这东西麻烦吗?”我相信很多人肯定会说“很麻烦!!” 这不禁让我想起开始学单片机的时候写这种按键的那程序,乱七八糟的结构。如果不相信的话,可以自己用51写一下哦,那样就更加能体会本文说的分层结构的优越性。



项目要求:

两个按键,分别分配在P10 和P20,分别是“加”“减”按键,要求长按键的时候实现连续加和连续减的功能。



实战:



假设:

按键上拉,没有按键的时候高电平,有按键的时候低电平,另外,为了突出问题,这里没有将延时消抖的程序写上去,在实际项目中应该加上。C语言函数参数的传递多种多样,这里作为例子,用了最简单的全局变量来传递参数,当然你也可以用 unsigned char ReadPort(void) 返回一个读键结果,甚至还可以 void ReadPort(unsigned char *pt) 用一个指针变量传递地址而达到直接修改变量的目的。方法是多种多样的,这个决定于每个人的程序风格。





1)开始写硬件层程序,完成映射

#define KYE_MIN  0X01

#define KEY_PLUS 0X01



unsigned char KeyDat;



void ReadPort(void)

{

      if (P1 & KEY_PLUS == 0 ){

          KeyDat |= 0x01 ;

      }

      if (P2 & KEY_MIN  == 0 ){

          KeyDat |= 0x02 ;

      }                  

}



C语言应该很容易看懂吧?如果 KEY_PLUS 按下,P10口读到低电平,则 P1 & KEY_PLUS 的结果为 0 ,满足if 的条件,进入KeyDat |= 0x01  是将 KeyDat 的bit0 置一,也就是说,将 KEY_PLUS 映射到 KeyDat 的 bit0

KEY_MIN 是同样的道理映射到 KeyDat 的 bit1

如果 KeyDat 的 bit0 为 1 ,则说明 KEY_PLUS 按下,反则亦然。

不需要想的很神秘,映射就是这么一回事。如果还有其他按键的话,用同样办法,将他们全部映射到 KeyDat 上面。



2)驱动层程序编写

如果将 KeyDat想象成 P1 口,那么这个跟学习板那标准的扫描程序不就是一样了吗?对的,这个就是底层映射的目的了。



3)应用层程序编写

根据消息



硬件层是必须分离出来,然而驱动层和应用层的要求就不那么严格了,事实上一些简单的项目没有必要将这两层分离开来,根据实际应用灵活应对就可以了。其实这样写程序是很方便移植的,根据板子的不同而适当的修改一下硬件层那个 ReadPort 函数就完成了,驱动层和应用层很多代码可以不经过修改直接用,很能提高开发效率的。当然这个按键程序会存在一定的问题,特别是遇到常闭按键和点触按键的混合使用的场合。这个留给大家自己去想了,反正问题总是能找到解决办法的,尽管方法有好有坏。





结束语

以按键为媒介,介绍了程序设计当中的“分层屏蔽”的思想的原理和应用,按键只是一个例子,其实分层的思想普遍存在着程序设计当中。细心留意一下的话发现其实window,linux,网络的tcp/ip 结构全部都是分层的。这东西不是绣花枕头,而是实际用在工程上面的,只是平时不多见帖子介绍,或者没有人特意这样来总结,又或者是有经验的工程师作为藏在心中的法宝吧,这个就不得而知。不过好东西应该共享,菜鸟应该共勉,一起来学飞吧。

出0入0汤圆

发表于 2010-7-21 20:06:05 | 显示全部楼层
楼上干嘛的。这么nb

出0入0汤圆

发表于 2010-7-24 00:07:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-26 15:09:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-26 16:16:54 | 显示全部楼层
mark一下,

出0入0汤圆

发表于 2010-7-26 17:16:29 | 显示全部楼层
冒似很高深呀,改天再细看。

出0入0汤圆

发表于 2010-7-26 18:02:24 | 显示全部楼层
mark!
下班回家。

出0入0汤圆

发表于 2010-7-27 10:46:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-27 13:00:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-27 16:47:56 | 显示全部楼层
不错 以后可以用用。

出0入0汤圆

发表于 2010-8-7 13:43:04 | 显示全部楼层
确实好  不过要是处理 双击 单击 长按 怎么处理

出0入0汤圆

发表于 2010-8-7 19:27:24 | 显示全部楼层
沒時間, 第二再看

出0入0汤圆

发表于 2010-8-7 21:33:18 | 显示全部楼层
这个必须mark

出0入0汤圆

发表于 2010-8-8 00:51:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-8 21:07:46 | 显示全部楼层
新型的按键扫描程序

出0入0汤圆

发表于 2010-8-10 19:06:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-10 19:46:07 | 显示全部楼层
高,实在是高

出0入10汤圆

发表于 2010-8-11 09:10:38 | 显示全部楼层
mark

出0入17汤圆

发表于 2010-8-11 11:28:14 | 显示全部楼层
回复【楼主位】stanley.zhao
-----------------------------------------------------------------------
检测上升沿语句:
Trg = ReadData & (ReadData ^ Cont);      // 2

为什么不直接写为:
Trg = Read & (~Cont);

出0入0汤圆

发表于 2010-8-11 15:35:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-7 13:19:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-7 15:18:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-7 23:09:36 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-9-8 00:00:43 | 显示全部楼层
仔细研读

出0入0汤圆

发表于 2010-9-8 06:46:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-8 07:36:00 | 显示全部楼层
that's just way too complicated.

mine is here:

=========code============
#define PORT_TYPE unsigned char //for 8-bit ports
//#define PORT_TYPE unsigned long //for 32-bit ports

//set bits where the pins have gone through a low-high or high-low transition
PORT_TYPE port_get(PORT_TYPE port, PORT_TYPE pins) {
        PORT_TYPE tmp;
        static PORT_TYPE pins_prev=0x00;

        tmp=pins_prev;                                        //save pins_prev
        pins_prev=port & pins;                        //read pins from port
        return (pins_prev ^ tmp);                //return rising or falling edge
        //return (pins_prev ^ tmp) & tmp;        //return falling edge
        //return (pins_prev ^ tmp) & pins_prev;        //return rising edge
}
===========end of code============

by choosing one of the return statement,  the code can detect either port changes, or falling / rising changes.

the principle is really simple: tmp retains the value of the port during the last read, pins_prev retains the value of the port during the current read. so tmp ^ pins_prev is set for pins where the two reads differ.

by ANDing (tmp ^ pins_prev) with tmp, you have picked up the pins that changed and was 1 -> falling edge.
by ANDing (tmp ^ pins_prev) with pins_prev, you have picked the pins that changed and is 1 -> rising edge.

出0入0汤圆

发表于 2010-9-9 10:32:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-9 11:10:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-9 11:37:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-19 09:58:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-19 10:12:20 | 显示全部楼层
mark

出0入296汤圆

发表于 2010-9-19 10:18:36 | 显示全部楼层
顶~~~~~~~~!

出0入0汤圆

发表于 2010-9-19 11:04:09 | 显示全部楼层
这个得顶 我做按键长按 短按 处理的很麻烦

出0入0汤圆

发表于 2010-9-19 17:46:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-25 15:00:54 | 显示全部楼层
ding ,mark!

出0入0汤圆

发表于 2010-9-25 15:13:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-27 17:45:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-27 18:53:50 | 显示全部楼层

出0入0汤圆

发表于 2010-9-27 23:33:50 | 显示全部楼层
mark,明天再仔细看看!

出0入0汤圆

发表于 2010-9-28 00:09:47 | 显示全部楼层
Cool!

出0入0汤圆

发表于 2010-10-22 17:49:59 | 显示全部楼层

出0入0汤圆

发表于 2010-10-25 16:31:37 | 显示全部楼层
这个很好!!!!!

出0入0汤圆

发表于 2010-10-25 17:30:24 | 显示全部楼层
好贴,mark

出0入0汤圆

发表于 2010-10-27 01:27:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-27 10:03:30 | 显示全部楼层
积分:135
派别:
等级:------
来自:
Cool!

出0入0汤圆

发表于 2010-10-27 21:06:38 | 显示全部楼层
mark~

出0入0汤圆

发表于 2010-10-31 15:52:12 | 显示全部楼层
谢谢~

出0入0汤圆

发表于 2010-11-2 16:42:47 | 显示全部楼层
学习,谢谢!

出0入0汤圆

发表于 2010-11-2 18:35:51 | 显示全部楼层
顶~~~~~~~~!

出0入0汤圆

发表于 2010-11-2 21:11:52 | 显示全部楼层
回复【楼主位】stanley.zhao
-----------------------------------------------------------------------

顶啊,收益匪浅

出0入0汤圆

发表于 2010-11-2 21:11:54 | 显示全部楼层
再记号一次!

出0入0汤圆

发表于 2010-11-2 21:16:01 | 显示全部楼层
看看

出0入0汤圆

发表于 2010-11-2 22:00:45 | 显示全部楼层
路过

出0入0汤圆

发表于 2010-12-1 21:13:54 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-12-1 21:35:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-2 00:58:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-3 10:06:39 | 显示全部楼层
留着慢慢体会

出0入0汤圆

发表于 2011-1-17 16:42:49 | 显示全部楼层
这个太好了。真的是很好!

出0入0汤圆

发表于 2011-1-21 16:26:53 | 显示全部楼层
回复【楼主位】stanley.zhao
-----------------------------------------------------------------------

好东西,顶!

出0入0汤圆

发表于 2011-1-21 16:35:41 | 显示全部楼层
一时半会看不懂,mark一下,抽空研究研究!嘿嘿

出0入0汤圆

发表于 2011-1-21 20:08:52 | 显示全部楼层
看了两遍,呵呵……

出0入0汤圆

发表于 2011-1-21 22:31:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-24 15:20:26 | 显示全部楼层
这个具体是怎么去抖的 还请指点下

出0入0汤圆

发表于 2011-1-24 15:21:11 | 显示全部楼层
这个具体是怎么去抖的 还请指点下

出0入0汤圆

发表于 2011-1-26 21:17:45 | 显示全部楼层
牛人,,我得好好理解一下

出0入0汤圆

发表于 2011-1-27 08:44:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-27 09:44:32 | 显示全部楼层
不错不错

出0入0汤圆

发表于 2011-1-27 13:04:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-1 10:43:22 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-2-1 10:50:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-1 11:11:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-1 23:52:03 | 显示全部楼层
#define KEY_BEEP 0x01

void KeyProc(void)

{

       if (Trg & KEY_BEEP) // 如果按下的是KEY_BEEP

    {

         Beep();            // 执行蜂鸣器处理函数

    }

}



怎么感觉这样没有防抖呢?????
是不是应该这样
if(trg+cont==key_beep)
长按的话应该在加一个寄存器。

出0入0汤圆

发表于 2011-3-2 11:56:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-2 22:07:17 | 显示全部楼层
mark~!!

出0入0汤圆

发表于 2011-3-2 22:25:59 | 显示全部楼层
留个记号哈

出0入0汤圆

发表于 2011-3-3 10:39:31 | 显示全部楼层
很好学习了 不过这个 跟状态机的程序 很像。。。。。。

出0入0汤圆

发表于 2011-3-5 17:34:31 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2011-3-5 18:08:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-6 00:07:32 | 显示全部楼层
回复【23楼】my_avr  
楼主处的程序还不是最精妙的。把程序稍改一下,可以兼容所有的电平变化:
unsigned char prekey;
unsigned char nowkey;
volaitile unsigned char keycode;
void readkey(void)
{
     prekey  = nowkey;
     nowkey  = pinx;
     keycode = prekey^nowkey^keycode;      //注意:等式左边的keycode是本次读按键的结果,等式右边的keycode是上次读按键的结果
}
keycode 是全局变量,和lz位处的cont一样。
------------------------------------------------------------------------
综合楼主和my_avr给出的代码,小弟斗胆提出改进代码:

static volatile unsigned long g_PreKey;          //前次按键值
static volatile unsigned long g_NowKey;          //当前按键值
           volatile unsigned long g_ShortKeyCode;//短按键,单次触发
           volatile unsigned long g_LongKeyCode; //长按键,持续触发
void KeyRead(void)
{
//g_NowKey ^ g_PreKey                          :边缘触发
//g_NowKey & (g_NowKey ^ g_PreKey):上升沿触发
//g_PreKey & (g_NowKey ^ g_PreKey):下降沿触发
//g_NowKey ^ (g_NowKey ^ g_PreKey):高电平触发(带消抖)
        static unsigned char CntPlus=0;
     g_PreKey  = g_NowKey;
     g_NowKey  = KeyScan();
         g_ShortKeyCode = g_PreKey & (g_NowKey ^ g_PreKey);   
    if (g_NowKey^g_PreKey^g_NowKey)
    {                
                if(CntPlus++>LONG_KEY_TIME)//是否符合长按键要求
                {
                      g_LongKeyCode|= g_NowKey;//添加长按键值
                  }
    }
        else
        {
                CntPlus=0;//无新增按键出现,计数归零
                g_LongKeyCode &= g_NowKey; //剔除已释放的按键
        }          
}

优点:
1.将短按键改为下降沿触发,省去判释放的麻烦。
2.提供短按键并行触发的支持。
3.提供长按键和短按键并行触发的支持。
缺点:
1.目前还不能支持长按键的并行触发,有待各位大侠提出改进方案。

出0入0汤圆

发表于 2011-3-6 00:51:02 | 显示全部楼层
回复【楼主位】stanley.zhao  
-----------------------------------------------------------------------

mark

出0入0汤圆

发表于 2011-3-6 08:57:53 | 显示全部楼层
回复【187楼】mojinpan  
回复【23楼】my_avr  
楼主处的程序还不是最精妙的。把程序稍改一下,可以兼容所有的电平变化:
unsigned char prekey;
unsigned char nowkey;
volaitile unsigned char keycode;
void readkey(void)
{
     prekey  = nowkey;
     nowkey  = pinx;
     keycode = prekey^nowkey^keycode;      //注意:等式左边的keycode是本次读按键的结果,等式右边的keycode是上次读按键的结果
}
keycode 是全局变量,和lz位处的cont一样。
------------------------------------------------------------------------
综合楼主和my_avr给......
-----------------------------------------------------------------------
睡了一觉起来再次对自己的代码进行改进:
static volatile unsigned long g_PreKey;          //前次按键值
static volatile unsigned long g_NowKey;          //当前按键值
           volatile unsigned long g_ShortKeyCode;//短按键,单次触发
           volatile unsigned long g_LongKeyCode; //长按键,持续触发
void KeyRead(void)
{
//g_NowKey ^ g_PreKey                          :边缘触发
//g_NowKey & (g_NowKey ^ g_PreKey):上升沿触发
//g_PreKey & (g_NowKey ^ g_PreKey):下降沿触发
//g_NowKey ^ (g_NowKey ^ g_PreKey):高电平触发(带消抖)
//触发方式 ^  g_KeyCode           :仅更新变化部分按键值
        static unsigned char CntPlus=0;
     g_PreKey  = g_NowKey;
     g_NowKey  = KeyScan();
         g_ShortKeyCode = g_PreKey & (g_NowKey ^ g_PreKey)^g_LongKeyCode;   
    if (g_NowKey^g_PreKey^g_NowKey^g_LongKeyCode)
    {                
                if(CntPlus++>LONG_KEY_TIME)//是否符合长按键要求
                {
                      g_LongKeyCode|= g_NowKey;//添加长按键值
                  }
    }
        else
        {
                CntPlus=0;//无新增按键出现,计数归零
                g_LongKeyCode &= g_NowKey; //剔除已释放的按键
        }          
}

核心算法:
//g_NowKey ^ g_PreKey                          :边缘触发
//g_NowKey & (g_NowKey ^ g_PreKey):上升沿触发
//g_PreKey & (g_NowKey ^ g_PreKey):下降沿触发
//g_NowKey ^ (g_NowKey ^ g_PreKey):高电平触发(带消抖)
//触发方式 ^  g_KeyCode           :仅更新变化部分按键值

修正bug:
1.修正多个长按键公用一个LONG_KEY_TIME的问题,即增加了长按键并行处理的能力。
2.修正长按键松手时会返回短按键的bug

出0入0汤圆

发表于 2011-3-6 09:18:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-13 14:41:33 | 显示全部楼层
记录 以后看,会用到

出0入0汤圆

发表于 2011-3-13 15:04:05 | 显示全部楼层
谢谢了

出0入0汤圆

发表于 2011-3-15 17:16:34 | 显示全部楼层
顶顶顶!!!

出0入0汤圆

发表于 2011-3-21 21:51:49 | 显示全部楼层
学习了.....

出100入0汤圆

发表于 2011-3-29 12:31:28 | 显示全部楼层
这程序上次在论坛看到过忘记mark了,现在要用到又回来搜索的~
好程序,这次一定要标记好。哈哈~

出0入0汤圆

发表于 2011-4-2 01:14:25 | 显示全部楼层
嘿嘿,记号下,一直在用延时消抖

出0入0汤圆

发表于 2011-4-2 07:54:20 | 显示全部楼层
用到了位运算什么的

出0入0汤圆

发表于 2011-4-2 08:01:44 | 显示全部楼层
牛人

出0入0汤圆

发表于 2011-4-2 08:01:50 | 显示全部楼层

出0入0汤圆

发表于 2011-4-2 08:13:57 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-4-2 11:34:44 | 显示全部楼层
MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表