[技术支持] 关于SQ013L汇编实现长按键

[复制链接]
390|7
 楼主 | 2019-1-4 11:29 | 显示全部楼层 |阅读模式
本帖最后由 liulangr 于 2019-1-4 14:09 编辑

各位大虾:
    我采用sq013L片子,实现按键扫描程序时,同一按键需要两个功能,短按切换功能,长按sleep,短按是松开时切换功能,长按是不松手就Sleep,下面代码已经实现了此功能,但有一个问题:长按后进入SLEEP,但释放按键时,会引起一次端口变化中断,导致释放按键时,直接又唤醒了,各位有什么好的建议没?问题代码如下:
;***********************************************
;name        :Scankey
;function:按键扫描及处理
;input  :
;output        :
;register used:
;***********************************************
Scankey:
        clrf        KeyDownValue
        btfss        key_p                                ;检测是否有键按下
        goto        Key_Debouncing
       
Key_Up

        movlw        d'100'                       
        subwf        key_delay,W
        btfsc        STATUS,C
        goto        Long_Key_Pro       
       
       
        clrf        KeyUpValue
        btfsc        key_p                                ;检测是否有键按释放
        bsf                KeyUpValue,0
       
        movf        KeyUpValue,W
        xorwf        Old_KeyUpValue,W
        btfsc        STATUS,Z
        goto        Key_On
       
        movf        KeyUpValue,W
        movwf        Old_KeyUpValue
        clrf        key_delay
        goto        EndKey
       
Key_Debouncing:                ;去抖动        ;10ms * 5 = 50ms
        movlw        0x05
        subwf        key_delay,W
        btfsc        STATUS,C
        goto        Long_Key_Down
       
        incf        key_delay,F       
        goto        EndKey
       
Key_On:       
       
        movlw        0x05                       
        subwf        key_delay,W
        btfsc        STATUS,C                ;同一键值连续6次扫描时间按下
        goto        Key_On1
       
        incf        key_delay,F
        goto        EndKey

Long_Key_Down:        ;判断是否长按键

        movlw        d'100'                        ;10ms * 100 = 1000ms = 1S
        subwf        key_delay,W
        btfsc        STATUS,C                ;同一键值连续6+95次扫描时间按下
        goto        Long_Key_Pro

        incf        key_delay,F
       
        goto        Key_Up

Key_On1:                       
        movlw        0x01
        subwf        KeyUpValue,W
        btfsc        STATUS,C
        goto        Key_On_Pro
       
no_key:                                                ;按键释放

        bcf                f_Shortkey                       
        goto        EndKey        
       
       
Key_On_Pro:

        btfsc        f_Shortkey
        goto        EndKey
       
        bsf                f_Shortkey

        movf        KeyUpValue,W
        xorlw        h'01'
        btfsc        STATUS,Z
        goto        Key1_On
       
        goto        EndKey
       
Long_Key_Pro:
       
        clrf        KeyUpValue
        clrf        KeyDownValue
        clrf        key_delay
       
        bcf                f_Shortkey
       
        call        Long_Key_Sleep
        nop

        goto        EndKey               
                               

;*******************************************************************************
Key1_On:       
;********************************************************************************
        incf        KeyStrokes,1                ;当按键按下,KeyStrokes值加1
        movlw        .16       
        subwf        KeyStrokes,0                ;判断KeyStrokes值是否为16,若是则清掉KeyStrokes值,以此来达到按键切换功能的目的。
        btfsc        STATUS,C
        clrf        KeyStrokes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-
EndKey:       
        return

 楼主 | 2019-1-5 14:33 | 显示全部楼层
自己顶一下,别沉贴!
麻烦哪位老司机,给予指点,谢谢!
| 2019-1-7 08:52 | 显示全部楼层
长按松开后的那次唤醒,你判断一下按键的有效值是否达到,如果没达到就再次进入睡眠。
 楼主 | 2019-1-7 09:05 | 显示全部楼层
雨后梧桐 发表于 2019-1-7 08:52
长按松开后的那次唤醒,你判断一下按键的有效值是否达到,如果没达到就再次进入睡眠。 ...

好的,我试试。
谢谢!
| 2019-1-25 13:21 | 显示全部楼层
真的看不懂汇编呀
| 2019-2-14 09:22 | 显示全部楼层
短按与长按,要分二个标志,有长按的话,最好,都要在松键后判断对应标志执行,如,在按下子程序中,判断如果有长按标志了,goto endkey,如果没有判断按下时间,达到短按时间,置短按标志f_shortkey,当有短按标志,再继续计时,达到你长按的时间后,置长按标志f_keepkey,并把短按标志f_shortkey要置零。,在松键子程序中,要先判断是否是长按标志有,有就执行长按,没有再判断是否有短按标志,有就执行短按。逻辑顺序自己整理一下。我做这类产品做过很多。长按,短按,双击,等都正常执行的。如有不明白可以单独Q我484624303
 楼主 | 2019-2-16 10:30 | 显示全部楼层
haibao1213 发表于 2019-2-14 09:22
短按与长按,要分二个标志,有长按的话,最好,都要在松键后判断对应标志执行,如,在按下子程序中,判断如 ...

明白你说的逻辑了,我之前用C编写的按键程序,都没有问题,采用这个片子,需要用汇编,我汇编比较烂,只能慢慢来!
非常感谢!!
| 2019-2-16 13:53 | 显示全部楼层
liulangr 发表于 2019-2-16 10:30
明白你说的逻辑了,我之前用C编写的按键程序,都没有问题,采用这个片子,需要用汇编,我汇编比较烂,只 ...

扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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