PIC18如何在8x8矩阵显示器上移动点?

时间:2018-02-05 19:12:17

标签: pic xor microchip mplab

我正在尝试使一个点上下移动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

1 个答案:

答案 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