当前位置: 网站首页 > 技术应用 > 单片机应用

单片机处理中一个很常见的问题键盘处理

单片机处理中一个很常见的问题,键盘处理,搜集过来大家共享一下,精彩还会继续,敬请期待!
    在设计中,常常用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
----结束

   ********************* 源程序以emc单片机指令系统为例*****************************

点击次数:  【关闭
  • 壹零零单片机©版权所有 2008-2023 粤ICP备17151077号

Powered by  xinfuke  5.2.5 ©2008-2024  www.100mcu.com