|
旋转式编码开关用了104的电容做防抖,也可以用延时做防抖,还是用RB4口电平变化中断功能,RB4判高电平,RB1判方向,RB2和RB3作指示,编码开关的用途非常广泛,用作数调很方便,程序很简单就不解释了,后面有个小延时,改一改可做实验用,谢谢! ;=============================
LIST P=16F72
INCLUDE"P16F72.INC"
;=================================
W_TEMP EQU 0X21
STATUS_TEMP EQU 0X22
PCLATH_TEMP EQU 0X23
N0 EQU 0X24
N1 EQU 0X25
;=================================
ORG 0000H
NOP
GOTO MAIN
ORG 0004H
GOTO ZD
;===========中断返回==================
RETFIE_IN
RETFIE
;=======================================
MAIN
BSF STATUS,RP0
MOVLW B'11110011'
MOVWF TRISB
BCF OPTION_REG,NOT_RBPU ;启动上拉
MOVLW B'10001001' ;启动总中断、RBIE中断
MOVWF INTCON
BCF STATUS,RP0
CLRF PORTB
BCF INTCON,RBIF
LOP
GOTO LOP
;==============现场保护子程序==================
ZD
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
MOVF PCLATH,W
MOVWF PCLATH_TEMP
;================================================
ZD1 BCF INTCON,RBIF
NOP
BTFSC INTCON,RBIF
CALL KKK
CLRF INTCON
BSF INTCON,RBIE
;===============现场恢复子程序===================
POP
MOVF PCLATH_TEMP,W
MOVWF PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
GOTO RETFIE_IN
;=====================================================
KKK
MOVF PORTB,F ;读RB口,锁定状态
NOP
BTFSS PORTB,4 ;检测RB4口,为0则继续检测,为1则检另一侧RB2
GOTO $-1
BTFSS PORTB,1
GOTO KK
BTFSS PORTB,1
GOTO KK
BSF PORTB,2
MOVF PORTB,F
RETURN
;===================================================
KK BTFSC PORTB,1
GOTO RETFIE_IN
BSF PORTB,3
MOVF PORTB,F
RETURN
;=======================20MS=========================
DELAY2MS
MOVLW 0x9D ;外层
MOVWF N1
MOVLW 0xBE ;内层
MOVWF N0
INCFSZ N0
GOTO $-1
INCFSZ N1
GOTO $-5
RETURN
END
|
|