《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

《多个按键的连按处理技巧》大话篇
程序匠人 发表于 2005-6-1 23:56:00  阅读全文 | 回复(6) | 引用通告 | 编辑

主题:《多个按键的连按处理技巧》大话篇 返回主题列表

刷新 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篇 首页 前页 后页 尾页 

看《匠人手记》,与匠人同行!北航出版,正在热卖!

Re:《多个按键的连按处理技巧》大话篇
eason_lee(游客)发表评论于2008-2-25 10:42:00  个人主页 | 引用 | 返回 | 删除 | 回复

eason_lee(游客)匠人,小弟下载了你的全部技术文章,以供学习.
在此谢过了.

以下为程序匠人的回复:
欢迎常来

看《匠人手记》,与匠人同行!北航出版,正在热卖!

Re:《多个按键的连按处理技巧》大话篇
学生(游客)发表评论于2007-12-12 16:49:00  个人主页 | 引用 | 返回 | 删除 | 回复

学生(游客)谢谢匠人可以将源程序贴上去,而且加了自己的一些调侃,让人感觉真实,不像从别人那借来的。

看《匠人手记》,与匠人同行!北航出版,正在热卖!

回复:《多个按键的连按处理技巧》大话篇
huang jun wu(游客)发表评论于2006-7-29 17:11:00  个人主页 | 引用 | 返回 | 删除 | 回复

huang jun wu(游客)

我稍微看了一下,该按键程序处理比较简单,不实用,还不如我做的程序。而且,当多行多列按键按下去的时候,每做处理,容易出错。

 

看《匠人手记》,与匠人同行!北航出版,正在热卖!

回复:《多个按键的连按处理技巧》大话篇
cxjr发表评论于2006-3-27 23:59:00  个人主页 | 引用 | 返回 | 删除 | 回复

cxjr不会吧,各位睡在偶下铺的兄弟,这段程序中的注释比程序还多,应该很容易看懂的啊!

看《匠人手记》,与匠人同行!北航出版,正在热卖!

回复:《多个按键的连按处理技巧》大话篇
wk(游客)发表评论于2006-3-26 11:23:00  个人主页 | 引用 | 返回 | 删除 | 回复

wk(游客)

 

我们不懂汇编都嘛,那我们乍办呢,还是写一份C语言的吧!

看《匠人手记》,与匠人同行!北航出版,正在热卖!

回复:《多个按键的连按处理技巧》大话篇
hongyang01(游客)发表评论于2006-2-26 0:16:00  个人主页 | 引用 | 返回 | 删除 | 回复

hongyang01(游客)

以下引用菠菜(游客)在2006-2-14 8:36:00的评论:

能不能将上述的程序用c51写出来,我看着吃力

但很想弄明白

谢谢!

我的EMAIL:

hongyang01613@163.com

再一次表示感谢!我期待着你的答复


看《匠人手记》,与匠人同行!北航出版,正在热卖!

回复:《多个按键的连按处理技巧》大话篇
菠菜(游客)发表评论于2006-2-14 8:36:00  个人主页 | 引用 | 返回 | 删除 | 回复

菠菜(游客)

能不能将上述的程序用c51写出来,我看着吃力

但很想弄明白

谢谢!

我的EMAIL:zhuguangxing12345@tom.com

再一次表示感谢!我期待着你的答复

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!