|
主题:《多个按键的连按处理技巧》大话篇 返回主题列表
刷新 PAGE 1 / 2 共25篇 首页 前页 后页 尾页 程序匠人 发表于 2002-1-8 22:33 侃单片机 ←返回版面
《多个按键的连按处理技巧》大话篇
咚咚呛!咚咚呛!咚咚呛!----锣鼓三响,小匠出场:“如果你的芯是一座作坊,我愿做那不知疲倦的程序匠……”
----台下,鲜花共烂西红柿一色,飞向台前…… ----匠人连忙举起一个键盘,左遮右挡……
话说小匠的大话篇,自隆重推出以来,篇篇都考了个COOL,一时间人气大震。截止昨天,共结交了N位好友,众多MM纷纷到斑竹那里打听小匠的婚否情况……
----西红柿再次飞向台前……
上次贴了一篇《一个按键的多种击键组合判别技巧》,这次再贴个姊妹篇上来……
----匠人正在贴贴子,被值勤的斑竹逮个正着:“好啊!我才打扫干净,你又给糟蹋了……” ----匠人忙堆起一脸的媚笑:“斑竹大人,我贴的可是大话篇,麻烦你再给个COOL……” ----斑竹恍然:“哦,原来满纸胡言,通篇诋毁我斑竹光辉形象的那个匠人,就是你?!……” ----匠人一看情形不对,正想开溜…… ----只见一道白光一晃…… ----3个时辰之后,有人发现昏迷不醒的程序匠人躺在血泊之中…… ----墙上提着一行血字:“十步杀一匠,千里不留行。事了拂衣去,深藏身与名。”……
----好了,言归正传,请看下文:
《多个按键的连按处理技巧》
在设计中,常常用UP键和DOEN来调节参数。这种键在处理时,要考虑连按的问题。而且希望键连续按下的时间越长,动作的响应速度越快(即加速度处理) 在连按的处理过程中,要考虑3个时间常数: 1、连按响应时间常数(首次值),该值用于区分连按/单按。 a)当按键闭和的时间<该参数时,判为单按; b)当按键闭和的时间>该参数时,判为连按; 2、连按缓冲时间常数(最大值)。 在连按操作刚开始时,按键响应速度较慢,这个参数就是用于决定每次动作之间的最大时间。 3、连按缓冲时间常数(最小值) 在连按的过程中,响应的速度越来越快,但也不能无限快。这个参数就是用于决定每次动作之间的最小时间。 还有一个要考虑的问题是,可能并不是所有按键都具有连按功能。这时,可用一个标志位来区分。在读键子程序中返回键值的同时,也返回这个标志,告诉键盘监控程序是否要做连按处理。
下面的一段例程中,可以识别单按/连按,并可处理加速度问题。只要在主程序中调用即可。程序中的延时用现实程序来代替。
;******************************** ;按键处理模块 ;******************************** ;时间常数定义 KEY_T == 250 ;连按响应时间常数(首次值) KEY_TMAX == 120 ;连按缓冲时间常数(最大值) KEY_TMIN == 30 ;连按缓冲时间常数(最小值) ;******************************** KEYWK: MOV A,@KEY_T MOV KEY_JS,A ;连按计数器置初值 BC TT1,KEY ;清连按标志 MOV A,@KEY_TMAX-KEY_TMIN MOV KEY_JSJS,A ;连按加速计数器置初值 CALL READKEY ;读键 JBS R3,C ;有键按下跳 RET FCALL MOVLCD ;显示延时 CALL READKEY ;读键 JBS R3,C ;确实有键按下跳 RET ;====确实有键按下 MOV KEY_BUF,A ;保存键值 KEY1: FCALL MOVLCD ;显示延时 CALL READKEY ;读键 JBS R3,C ;键未释放跳 JMP KEY5 ;====连按判断 JBS TT1,KEY_EN ;连按功能有效跳 JMP KEY1 ;禁止连按跳 JBC TT1,KEY ;不是连按跳 JMP KEY2 DJZ KEY_JS ;连按计数器-1=0跳 JMP KEY1 BS TT1,KEY ;置连按标志 JMP KEY1 ;====连按处理 KEY2: CALL DOKEY ;执行按键功能 MOV WK_MODE,A ;刷新模式 ;连按加速计数器-1 DJZ KEY_JSJS JMP $+2 INC KEY_JSJS ;连按计数器置延时值 MOV A,@KEY_TMIN ADD A,KEY_JSJS MOV KEY_JS,A ;连按计数器置延时值 KEY4: FCALL MOVLCD ;显示延时 DJZ KEY_JS ;连按计数器-1=0跳 JMP KEY4 JMP KEY1 ;====单按处理 KEY5: FCALL MOVLCD ;显示延时 CALL READKEY ;读键 JBC R3,C ;键确实已释放跳 JMP KEY1 JBC TT1,KEY ;不是连按跳 RET ;按键发声 BS TT1,KEY_SP ;开蜂鸣器 FCALL MOVLCD CALL DOKEY ;执行按键功能 MOV WK_MODE,A ;刷新模式 BC TT1,KEY_SP ;关蜂鸣器 FCALL MOVLCD RET ;******************************** ;读键子程序 ;出口: A=键号值(0=无,1=K2定时,2=K3功率选择,3=K4水温上调,4=K5水温下调, ; 5=K6时钟上调,6=K7时钟下调,7=K8时段设置) ; C: (0=无,1=有) ; TT1,KEY_EN: 当前键连按有效标志(0=禁止连按,1=可连按) ; (K4/K5/K6/K7有连按功能) ;******************************** READKEY: BS R3,C ;不可连按的按键 BC TT1,KEY_EN JBS R7,6 ;K2未闭合跳 RETL @01 ;返回A=01 JBS R7,0 ;K3未闭合跳 RETL @02 ;返回A=02 JBS R7,5 ;K8未闭合跳 RETL @07 ;返回A=07 ;可连按的按键 BS TT1,KEY_EN JBS R7,1 ;K4未闭合跳 RETL @03 ;返回A=03 JBS R7,2 ;K5未闭合跳 RETL @04 ;返回A=04 JBS R7,3 ;K6未闭合跳 RETL @05 ;返回A=05 JBS R7,4 ;K7未闭合跳 RETL @06 ;返回A=06 BC R3,C RETL @00 ;返回A=00
----结束
签名:
如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠……
soho 发表于 2002-1-8 23:56 侃单片机 ←返回版面
警告: 下次再贴, 文字加倍, 程序删掉!
又臭又长的程序谁看.
jw5th 发表于 2002-1-9 03:35 侃单片机 ←返回版面
只需要把思路讲出来就可。
虚拟人 发表于 2002-1-9 14:20 侃单片机 ←返回版面
为匠人默哀3分钟。
呜呜~~~~
程序匠人 发表于 2002-1-9 19:43 侃单片机 ←返回版面
如此失败?
没想到各位如此冷落小匠…… 请问SOHO:老哥是喜欢看搞笑的那段,还是凶杀的那段?……
签名:
如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠……
soho 发表于 2002-1-9 21:57 侃单片机 ←返回版面
别伤芯, 要不我给你块糖糖吃 ^-^
hlmfox 发表于 2002-1-10 17:23 侃单片机 ←返回版面
老兄,换C吧!这样掌声会多点!!!
插翅能飞 发表于 2002-1-11 13:02 侃单片机 ←返回版面
我来给点掌声。
啪!啪啪!啪啪啪!。。。
skysea 发表于 2002-1-11 14:12 侃单片机 ←返回版面
保持你的风格
每个人都有自己的风格,我个人觉得你的这种风格比较有个性,感觉文笔还不错,能够让战友们在获取资料信息的同时又轻松一笑,佩服!!! Y are not alone :-)
程序匠人 发表于 2002-1-11 19:48 侃单片机 ←返回版面
skysea的发言真是一针见血!
其实,小匠发这篇帖子的目的,就是想让大家在一个比较轻松愉快的环境下来讨论技术。
签名:
如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠……
hyqiu 发表于 2002-1-11 20:17 侃单片机 ←返回版面
啊……前面的文笔不错……
后面的程序就……
这种功能……用 C 来实现更好些……
另外……对于键盘扫描,我采用的算法是每 1/60 秒扫描一次,然后简单的判断一下本次扫描值和上次扫描值有否区别……类似电视游戏机的做法……
这样……似乎 CPU 利用率会高一些……如此程序的稳定性也比较有提升的空间(不过实时性也会有所降低),而且还可以免于进行抖动去除……
今晚打老虎 发表于 2002-1-11 20:18 侃单片机 ←返回版面
好呀!
现在很难找到一个搞义隆系列单片机的战友了,不错不错对我这种初学者来说很有参考的价值,谢谢。希望程序匠人朋友再接再厉,为我们带来快乐。
程序匠人 发表于 2002-1-11 20:30 侃单片机 ←返回版面
关于EMC++
前面有两位朋友都提到了C语言, 各位真是幸福,可以用C语言, EMC的芯片只有一套伪C语言,叫EMC++ 不过,语法不太严密,界面也不好(FOR DOS 的) 所以,小匠只有…… 不过,我倒是认为,汇编语言对硬件的控制更直接些。 各位以为呢?……
签名:
如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠……
johnsoncao 发表于 2002-1-11 20:52 侃单片机 ←返回版面
Yes! I Agree!
soho 发表于 2002-1-11 20:54 侃单片机 ←返回版面
对, 汇编语言对硬件的控制更直接些
只是程序因芯片而异, 局限性大, 加之芯片不熟的话, 读起来也吃力.
hyqiu 发表于 2002-1-11 20:57 侃单片机 ←返回版面
这个嘛……
个人认为……纯粹的 ANSI C 在处理硬件控制/时序上的能力确实比汇编差,但是这个的相差其实微乎其微……
而 C 在逻辑/算法上的能力绝非汇编可以比拟的……并且汇编程序几乎是不可重用的……
另外,如果以 51 系列单片机来说……许多稍具规模的系统用 C 开发编写的代码甚至比汇编还快……
再者,C 的可移植性是汇编完全没有的……
最后……C 非常容易学……而且 C 的基础打好的话,可以非常容易的转到 FPGA/DSP 甚至 PC 程序的开发上……这个是汇编不可能比拟的优势——你总不会希望自己一辈子跟 8 位单片机较劲吧?
插翅能飞 发表于 2002-1-12 12:12 侃单片机 ←返回版面
关于C与汇编的好坏,谁最有发言权?
一定是两种语言都很精通的人,才能不偏不倚地来评价……
jcws10000 发表于 2002-1-12 13:00 侃单片机 ←返回版面
谁再说C比汇编好,我跟他急.....
alonlee 发表于 2002-1-12 13:22 侃单片机 ←返回版面
呜呜,PL/M如何?大家都把它忘了还是不值一提?
签名:
我想飞 , 可我没有翅膀
hyqiu 发表于 2002-1-12 14:39 侃单片机 ←返回版面
楼上的楼上……急有什么用?
除非你打算一辈子只用一种单片机……否则长远来看,精通 C 并且了解汇编确实比只精通汇编来的有用……
招聘精通单片机通讯工程师1-2名 专业源自专心 串口专家 主题:《多个按键的连按处理技巧》大话篇 返回主题列表
刷新 PAGE 2 / 2 共25篇 首页 前页 后页 尾页 jcws10000 发表于 2002-1-12 21:35 侃单片机 ←返回版面
楼上的朋以,干嘛只懂汇编就只能用一种单片机?哪种单片机不能用汇编?
hyqiu 发表于 2002-1-13 11:51 侃单片机 ←返回版面
啊……只是一种比喻而已……
毕竟只用汇编语言的话,改型后就得重新掌握整套指令体系……
而以 C 为主的话,基本上只要知道新片子的引脚功能和时序就可以了……
程序匠人 发表于 2002-1-13 22:16 侃单片机 ←返回版面
哈哈,小匠也想把C再学透些,免得被时代淘汰
签名:
如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠……
程序匠人 发表于 2002-1-14 14:01 侃单片机 ←返回版面
请大家继续讨论……
* - 本贴最后修改时间:2002-1-21 14:25:10 修改者:程序匠人 * - 修改原因:A
签名:
如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠……
虚拟人 发表于 2002-1-22 12:03 侃单片机 ←返回版面
COOL!
刷新 PAGE 2 / 2 共25篇 首页 前页 后页 尾页
|