打印
[通用PIC核OTP系列]

关于SQ013L汇编实现长按键

[复制链接]
2153|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liulangr|  楼主 | 2019-1-4 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-25 09:35 编辑

各位大虾:
    我采用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

沙发
liulangr|  楼主 | 2019-1-5 14:33 | 只看该作者
自己顶一下,别沉贴!
麻烦哪位老司机,给予指点,谢谢!

使用特权

评论回复
板凳
雨后梧桐| | 2019-1-7 08:52 | 只看该作者
长按松开后的那次唤醒,你判断一下按键的有效值是否达到,如果没达到就再次进入睡眠。

使用特权

评论回复
地板
liulangr|  楼主 | 2019-1-7 09:05 | 只看该作者
雨后梧桐 发表于 2019-1-7 08:52
长按松开后的那次唤醒,你判断一下按键的有效值是否达到,如果没达到就再次进入睡眠。 ...

好的,我试试。
谢谢!

使用特权

评论回复
5
paotangsan| | 2019-1-25 13:21 | 只看该作者
真的看不懂汇编呀

使用特权

评论回复
6
haibao1213| | 2019-2-14 09:22 | 只看该作者
短按与长按,要分二个标志,有长按的话,最好,都要在松键后判断对应标志执行,如,在按下子程序中,判断如果有长按标志了,goto endkey,如果没有判断按下时间,达到短按时间,置短按标志f_shortkey,当有短按标志,再继续计时,达到你长按的时间后,置长按标志f_keepkey,并把短按标志f_shortkey要置零。,在松键子程序中,要先判断是否是长按标志有,有就执行长按,没有再判断是否有短按标志,有就执行短按。逻辑顺序自己整理一下。我做这类产品做过很多。长按,短按,双击,等都正常执行的。如有不明白可以单独Q我484624303

使用特权

评论回复
7
liulangr|  楼主 | 2019-2-16 10:30 | 只看该作者
haibao1213 发表于 2019-2-14 09:22
短按与长按,要分二个标志,有长按的话,最好,都要在松键后判断对应标志执行,如,在按下子程序中,判断如 ...

明白你说的逻辑了,我之前用C编写的按键程序,都没有问题,采用这个片子,需要用汇编,我汇编比较烂,只能慢慢来!
非常感谢!!

使用特权

评论回复
8
冷画| | 2019-2-16 13:53 | 只看该作者
liulangr 发表于 2019-2-16 10:30
明白你说的逻辑了,我之前用C编写的按键程序,都没有问题,采用这个片子,需要用汇编,我汇编比较烂,只 ...

使用特权

评论回复
9
1123506| | 2022-3-18 16:33 | 只看该作者
上海芯圣一级代理 出芯圣ic   企鹅号 2914373240

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

24

帖子

0

粉丝