本帖最后由 芯圣电子官方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
|