Hein (fub) wrote,
Hein
fub

  • Mood:

Matrix code

This is the code for the matrix-display. I haven't properly commented it, but it's pretty basic anyway.

; LED Matrix 10x10
        LIST P=16F628A    ; Use the PIC16F628A and decimal system

        #include "P16F628A.INC"  ; Include header file

        __config  _INTOSC_OSC_NOCLKOUT & _LVP_OFF & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF

        #define COUNTER_CLOCK        PORTA, 3
        #define COUNTER_RESET        PORTA, 2
        #define SHIFT_STROBE        PORTA, 1
        #define SHIFT_DATA                PORTA, 0
        #define SHIFT_CLOCK                PORTA, 7
        #define SHIFT_OE                        PORTA, 6
        #define CONTROL_LED                PORTB, 0
       
       
        cblock 0x20
          counter
          counter_2
          teller
          temp_byte
          stream_head
          stream_byte
          bit_counter
        endc

  #define STREAM_START        0x28
  #define STREAM_END                0x35
init
        goto main

prefill_table
        addwf PCL, f
        retlw b'01010101'
        retlw b'01101010'
        retlw b'10100101'
        retlw b'01010110'
        retlw b'10101010'
        retlw b'01010101'
        retlw b'01101010'
        retlw b'10100101'
        retlw b'01010110'
        retlw b'10101010'
        retlw b'01010101'
        retlw b'01101010'
        retlw b'10100101'
        retlw b'01011111'
       
main
        bsf STATUS,RP0          ; RAM PAGE 1
        clrf TRISB                ; portB all pins output
        clrf TRISA                ; portA all pins output
        MOVLW        b'10001000'        ; Set the options (prescaler for watchdog timer)
        MOVWF        OPTION_REG
  bcf STATUS,RP0          ; RAM PAGE 0
        CLRF        INTCON
        movlw 0x07
        movwf CMCON                ; No comparators
        CLRF PORTA
        CLRF PORTB
       
        movlw STREAM_START
        movwf stream_head
        movlw 0x0D
        movwf teller
        clrf counter
prefill
        movf stream_head, W
        movwf FSR
        movf counter, W
        call prefill_table
        movwf INDF
        incf counter, f
        incf stream_head, f
        decfsz teller, f
        goto prefill
       
infinite
        bsf COUNTER_RESET
        bcf COUNTER_RESET
        movlw 0x0A
        movwf teller
        movlw STREAM_START
        movwf stream_head
        call fetch_byte
counter_step
        call start_shifting
        movlw 0x0A
        movwf counter
shift_step
        btfss stream_byte, 7
        goto send_zero
        bsf SHIFT_DATA                ; 8th bit high, set data high
        goto send_clock
send_zero
        bcf SHIFT_DATA                ; 8th bit low, set data low
send_clock
        bsf SHIFT_CLOCK                ; Clock high
        bcf SHIFT_CLOCK                ; Clock low
        bcf STATUS, C
        rlf stream_byte, f
        decfsz bit_counter, f
        goto skip_fetch
        call fetch_byte
skip_fetch
        decfsz counter, f
        goto shift_step
        call end_shifting
        call toggle_led
        call short_pause
        bsf COUNTER_CLOCK
        bcf COUNTER_CLOCK
        decfsz teller, f
        goto counter_step
        goto infinite

; Long delay loop
long_pause                                       
                MOVLW        0xFF                ;10 times...
                MOVWF        counter
outerloop
                MOVLW        0xFF                ;100 times...
                MOVWF        counter_2
innerloop
                DECFSZ        counter_2, 1
                GOTO innerloop
                DECFSZ        counter, 1
                GOTO outerloop
                RETURN

; Short delay loop
short_pause                                       
                MOVLW        0x08                ;16 times...
                MOVWF        counter
short_outerloop
                MOVLW        0x64                ;100 times...
                MOVWF        counter_2
short_innerloop
                DECFSZ        counter_2, 1
                GOTO short_innerloop
                DECFSZ        counter, 1
                GOTO short_outerloop
                RETURN

start_shifting                                ; Commands to start shifting in information
                bcf SHIFT_OE
                bcf SHIFT_STROBE                ; Pull stobe low to latch inputs
                bsf SHIFT_STROBE                ; Strobe back high
                return

end_shifting                                ; Commands to end shifting
                bcf SHIFT_STROBE                ; Pull stobe low to latch inputs
                bsf SHIFT_STROBE                ; Strobe back high
                bsf SHIFT_OE                ; OE high
                return

toggle_led
                btfss CONTROL_LED
                goto turn_led_on
                bcf CONTROL_LED
                return
turn_led_on
                bsf CONTROL_LED
                return

fetch_byte
                movf stream_head, W
                movwf FSR
                movf INDF, W
                movwf stream_byte
                movlw 0x08
                movwf bit_counter
                incf stream_head, f
                movf stream_head, W
                xorlw STREAM_END
                btfss STATUS, Z
                return
                movlw STREAM_START
                movwf stream_head
                return

        end
Subscribe

  • Gundam

    My love for the mecha anime genre is well-documented on this blog and elsewhere. And of course, Gundam is the granddaddy of the genre, such a huge…

  • Kakiage

    I’ve been on a manga-reading spree these days. It all started out with Dungeon Meshi, which merges my interest in RPGs and dungeon delving…

  • Anime movie introduction

    Two weeks back, a colleague wore a shirt with a text that also included ‘NEO-TOKYO’. I asked him if this was a reference to Akira, and…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments