我正在尝试使一个点上下移动RA1
列的8x8矩阵显示。我使用微控制器上的开关使点向上移动(RB5
)和向下移动(RB0
)。我在位置0x08处开始点。代码工作正常但两个开关打开时点都向下移动。我在想像XORWF这样的东西会有帮助吗?有什么想法吗?
#include "p18F4520.inc"
;:::::CONFIG::::::::::::::::::::::::
CONFIG OSC = HS
CONFIG PWRT = OFF
CONFIG WDT = OFF
CONFIG PBADEN = OFF
CONFIG LVP = OFF
org 0x000000
PORST GOTO MAIN
org 0x000020
;:::::DELAY:::::::::::::::::::::::::
IDSHORT equ 0x20
IDLONG equ 0x21
ED10MS CLRF IDSHORT
MOVLW 0XFF
MOVWF IDLONG
LDLOOP DECFSZ IDSHORT
GOTO LDLOOP
DECFSZ IDLONG
GOTO LDLOOP
RETURN
;:::::::::::::::::::::::::::::::::::
MAIN CLRF TRISD
CLRF PORTD
CLRF TRISA
CLRF PORTA
BCF PORTA,RA1
BSF PORTA,RA1
SETF TRISB
MOVLW 0X08
MOVWF PORTD
LOOP BSF PORTA,RA1
CALL ED10MS
BCF PORTA,RA1
BTFSS PORTB,RB0 ;CHECKS IF SWHITCH IS ON - MOVE DOWN IF TRUE
GOTO DOWN
BTFSS PORTB,RB5 ;CHECKS IF SWHITCH IS ON - MOVE UP IF TRUE
GOTO UP
GOTO LOOP
UP MOVLW 0X80
CPFSEQ PORTD,W ;CHECKS IF IT REACHED THE TOP
RLNCF PORTD
GOTO LOOP
DOWN MOVLW 0X01
CPFSEQ PORTD,W ;CHECKS ID IT REACHED THE BOTTOM
RRNCF PORTD
GOTO LOOP
END
答案 0 :(得分:1)
您可以复制PORTB寄存器中的位并使用XORLW。如果PORTB上的所有其他位都为零,则忽略ANDLW。如果不是,则使用ANDLW线清除其他位(RB0和RB5除外)。在LOOP中,用这个替换你的位测试。无论何时你的开关都关闭或两者都打开,这个代码将简单地通过和循环。应在INC文件中定义STATUS和Z,但您将定义TEMP。注意,这将适用于PORTB的一个“快照”,如果你愿意的话。这样可以保持您对UP和DOWN使用GOTO:
MOVF PORTB,W ; put PORTB bits in w
ANDLW b'00100001' ; clr unused bits
MOVWF TEMP ; save w in TEMP
XORLW 0X20 ; look for RB0 'on', RB5 'off'
BTFSC STATUS,Z ; if untrue, Z bit clr, skip
GOTO DOWN ; if true, goto DOWN
MOVF TEMP,W ; get saved copy of PORTB bits
XORLW 0X01 ; look for RB0 'off', RB5 'on'
BTFSC STATUS,Z ; if untrue, Z bit clr, skip
GOTO UP ; if true, goto UP
GOTO LOOP ; any other case, goto LOOP