;=======================================================
; Проект 18. Бегущая строка на светодиодной матрице 8x8
; PIC16F84A, 4 МГц
; PORTB — строки, RA0..RA2 — адрес столбца (74HC138)
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        d1, col, shift, frames, tmp
        endc

        ORG     0x000
        goto    Start

;--- 16 столбцов бегущего образа ---
Font
        addwf   PCL,f
        retlw   b'01111110'
        retlw   b'00010001'
        retlw   b'00010001'
        retlw   b'01111110'
        retlw   b'00000000'
        retlw   b'01111111'
        retlw   b'01001001'
        retlw   b'01001001'
        retlw   b'00000000'
        retlw   b'00111110'
        retlw   b'01000001'
        retlw   b'01000001'
        retlw   b'00100010'
        retlw   b'00000000'
        retlw   b'00000000'
        retlw   b'00000000'

Start
        bsf     STATUS,RP0
        clrf    TRISB
        clrf    TRISA
        bcf     STATUS,RP0
        clrf    PORTB
        clrf    shift

Main
        movlw   .30             ; сколько кадров держать положение
        movwf   frames
Frame
        clrf    col
Scan
        movf    col,w           ; столбец экрана
        addwf   shift,w         ; + текущее смещение
        andlw   0x0F            ; кольцевой проход по 16 столбцам
        call    Font
        movwf   PORTB
        movf    col,w
        movwf   PORTA
        call    Delay1ms
        clrf    PORTB
        incf    col,f
        movf    col,w
        xorlw   .8
        btfss   STATUS,Z
        goto    Scan
        decfsz  frames,f
        goto    Frame

        incf    shift,f         ; сдвигаем строку
        movf    shift,w
        andlw   0x0F
        movwf   shift
        goto    Main

Delay1ms
        movlw   .200
        movwf   d1
D1      nop
        decfsz  d1,f
        goto    D1
        return

        END
