Source code

flowchart

;directives

PROCESSOR 16F84A
 RADIX HEX

;defs

 PCL EQU 0x02
 OPTREG EQU 0x01
 TMR EQU 0x01
 INTCON EQU 0x0B
 TMR0 EQU 0x01
 TRISB EQU 0x06
 TRISA EQU 0x05
 PORTA EQU 0x05
 PORTB EQU 0x06
 STATUS EQU 0x03
 FSR EQU 0x04
 INDF EQU 0x00
 Z EQU 2 ; Z flags
 GIE EQU 7 ; GIE bit
 INTF EQU 1 ; INTF flag
 LOWL EQU 0x20 ; bottom layer (8 bit pattern)
 MIDL EQU 0x21 ; middle layer (8 bit pattern)
 HIGL EQU 0x22 ; upper layer (8 bit pattern)
 EXTL EQU 0x23 ; extra layer (9th led for each layer)
 TIME EQU 0x24 ; current frame speed
 TCONT EQU 0x25 ; frame speed counter
 LSEL EQU 0x26 ; layer selector
 BCONT EQU 0x27 ; brightness counter
 BRIG EQU 0x28 ; brightness
 CURL EQU 0x29 ; current layer

;program start

ORG 0x0000 ; start from address 0x0000

goto Init

ORG 0x0004

 Interrupt: ; interrupt service routine
 bcf INTCON,INTF
 bsf INTCON,GIE ; enabling the interrupt service
 movf TMR,0
 andlw 0x07
 addwf PCL,1
 goto Pattern_treble
 goto Pattern_updown
 goto Pattern_twobars
 goto Pattern_buildframe
 goto Pattern_rotplane
 goto Pattern_rlplane
 goto Pattern_snake
 goto Pattern_fourface
 Init: ; initialization
 bsf STATUS,5 ; select RAM bank 1
 movlw b'00000001'
 movwf TRISB
 movlw b'00000000'
 movwf TRISA
 bcf OPTREG,5 ; start the TMR module in counter mode
 bcf STATUS,5 ; select RAM bank 0
 movlw 0x00
 movwf PORTA
 movwf PORTB
 clrf LSEL
 call IdleCube

;******** ShowLayer **********************************
;
; Shows the layer encoded in W and EXTL for x msec.
; (BRIG/255)% of the time the layer is ON, the
; remaining (255-BRIG)/255)% of the time the layer
; is OFF. (this is a PWM controlled brightness)
;
;*****************************************************

ShowLayer:
 ; layer on for (255/BRIG)*x msec
 ; layer off for (255/(255-BRIG))*x msec
 ; where x depends on the osc used

; set the first seven leds (bit0 of PORTB is used to receive interrupts!)
 movwf PORTB ; PORTB <- W

; set/clear the 8th led
 btfsc CURL,0
 bsf PORTA,2

; test the 9th bit of the current layer and set
; the 9th led accordingly (9th led = bit3 of PORTA)
 movf EXTL,0
 andwf LSEL,0 ; W <- EXTL & LSEL
 btfss STATUS,Z ; is the 9th bit clear (9th led off)?
 bsf PORTA,3 ; no, set the 9th bit

 ; set the 9th bit of the current layer and turn on
 ; the entire layer
 movf LSEL,0
 xorwf PORTA,1 ; PORTA <- W ^ LSEL

; wait (BRIG/255)%
 movf BRIG,0
 movwf BCONT
 ShowLayer_loop_layeron:
 decfsz BCONT
 goto ShowLayer_loop_layeron

 ; turn off the entire layer
 clrf PORTA

; wait ((255-BRIG)/255)%
 movf BRIG,0
 movwf BCONT
 decf BCONT,1
 ShowLayer_loop_layeroff:
 incfsz BCONT
 goto ShowLayer_loop_layeroff

 return

;******** ShowCube ***********************************
;
; Shows the cube pattern for 0.01 * TIME sec using
; brightness level BRIG. The refresh rate is 100Hz.
;
;*****************************************************

ShowCube:

; setup counter
 movf TIME,0
 movwf TCONT ; TCONT <- TIME

ShowCube_loop:

; upper layer
 movlw b'00010000'
 movwf LSEL ; LSEL = b00010000;
 movf HIGL,0
 movwf CURL ; loads upper layer
 call ShowLayer ; shows upper layer

; mid layer
 movlw b'00000010'
 movwf LSEL ; LSEL = b00000010;
 movf MIDL,0
 movwf CURL ; loads mid layer
 call ShowLayer ; shows mid layer

; bottom layer
 movlw b'00000001'
 movwf LSEL ; LSEL = b00000001;
 movf LOWL,0
 movwf CURL ; loads bottom layer
 call ShowLayer ; shows bottom layer

; repeat until TCONT>0
 decfsz TCONT,1
 goto ShowCube_loop

 return

;******** IDLECUBE ***********************************
;
; The cube is glowing and ready to trigger...
;
;*****************************************************

IdleCube:

 movlw b'11111111'
 movwf LOWL
 movlw b'11111111'
 movwf MIDL
 movlw b'11111111'
 movwf HIGL
 movlw b'00010011'
 movwf EXTL

 movlw 0x01
 movwf BRIG ; smallest brightness
 movlw 0x02
 movwf TIME ; smallest pattern duration

 bcf INTCON,INTF
 bsf INTCON,4 ; enabling the interrupt from the RB0/INT pin
 bsf INTCON,GIE ; enabling the interrupt service

 IdleCube_fadein: ; fade in loop
 call ShowCube
 incfsz BRIG
 goto IdleCube_fadein
 IdleCube_fadeout: ; fade out loop
 call ShowCube
 decfsz BRIG
 goto IdleCube_fadeout
 incf BRIG,1
 goto IdleCube_fadein

;******** PATTERN BUILDFRAME ************************
;
; Shows a self-building cube frame
;
;*****************************************************

Pattern_buildframe

 movlw 0x00
 movwf BRIG
 movlw 0x40
 movwf TIME

Pattern_buildframe_loop:

 clrf HIGL
 movlw b'10000000'
 movwf MIDL
 clrf LOWL
 clrf EXTL
 call ShowCube
 clrf HIGL
 movlw b'10010001'
 movwf MIDL
 clrf LOWL
 clrf EXTL
 call ShowCube
 movlw b'00010001'
 movwf HIGL
 movlw b'10010001'
 movwf MIDL
 movlw b'00010001'
 movwf LOWL
 clrf EXTL
 call ShowCube
 movlw b'00010001'
 movwf HIGL
 movlw b'00010001'
 movwf MIDL
 movlw b'00010001'
 movwf LOWL
 clrf EXTL
 call ShowCube
 movlw b'01110101'
 movwf HIGL
 movlw b'00010001'
 movwf MIDL
 movlw b'01110101'
 movwf LOWL
 movlw b'00010001'
 movwf EXTL
 call ShowCube
 movlw b'01110101'
 movwf HIGL
 clrf MIDL
 movlw b'01110101'
 movwf LOWL
 movlw b'00010001'
 movwf EXTL
 call ShowCube
 movlw b'01110101'
 movwf HIGL
 movlw b'01100100'
 movwf MIDL
 movlw b'01110101'
 movwf LOWL
 movlw b'00010011'
 movwf EXTL
 call ShowCube
 movlw b'01111111'
 movwf HIGL
 movlw b'01100100'
 movwf MIDL
 movlw b'01111111'
 movwf LOWL
 movlw b'00010011'
 movwf EXTL
 call ShowCube
 movlw b'01111111'
 movwf HIGL
 movlw b'01100100'
 movwf MIDL
 movlw b'01111111'
 movwf LOWL
 movlw b'00010011'
 movwf EXTL
 call ShowCube
 movlw b'01111111'
 movwf HIGL
 movlw b'01100100'
 movwf MIDL
 movlw b'01111111'
 movwf LOWL
 movlw b'00010011'
 movwf EXTL
 call ShowCube

 decfsz BRIG
 goto Pattern_buildframe_loop
 goto IdleCube

;******** PATTERN TWO BARS ***************************
;
; Shows two spinning bars
;
;*****************************************************

Pattern_twobars

 movlw 0x00
 movwf BRIG
 movlw 0x20
 movwf TIME

Pattern_twobars_loop:

 movlw b'01000000'
 movwf HIGL
 movwf MIDL
 movwf LOWL
 movlw b'00010011'
 movwf EXTL
 call ShowCube
 movlw b'00001010'
 movwf HIGL
 movwf MIDL
 movwf LOWL
 clrf EXTL
 call ShowCube
 movlw b'00100100'
 movwf HIGL
 movwf MIDL
 movwf LOWL
 clrf EXTL
 call ShowCube
 movlw b'00010001'
 movwf HIGL
 movwf MIDL
 movwf LOWL
 clrf EXTL
 call ShowCube

 decfsz BRIG
 goto Pattern_twobars_loop
 goto IdleCube

;******** PATTERN UPDOWN *****************************
;
; Shows a layer moving up and down.
;
;*****************************************************

Pattern_updown:

 movlw 0x00
 movwf BRIG
 movlw 0x50
 movwf TIME
 goto Pattern_treble_loop

;******** PATTERN TREBLE *****************************
;
; Shows a fast flickering cube
;
;*****************************************************

Pattern_treble:

 movlw 0x00
 movwf BRIG
 movlw 0x10
 movwf TIME

Pattern_treble_loop:

 movlw b'11111111'
 movwf HIGL
 clrf MIDL
 clrf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube

 clrf HIGL
 movlw b'11111111'
 movwf MIDL
 clrf LOWL
 movlw b'00000010'
 movwf EXTL
 call ShowCube

 clrf HIGL
 clrf MIDL
 movlw b'11111111'
 movwf LOWL
 movlw b'00000001'
 movwf EXTL
 call ShowCube

 decfsz BRIG
 goto Pattern_treble_loop
 goto IdleCube

;******** PATTERN SNAKE *****************************
;
; Shows a snake running across the cube
;
;*****************************************************

Pattern_snake

 movlw 0x00
 movwf BRIG
 movlw 0x30
 movwf TIME

Pattern_snake_loop:

 movlw b'10100010'
 movwf HIGL
 clrf MIDL
 clrf LOWL
 clrf EXTL
 call ShowCube
 movlw b'00110010'
 movwf HIGL
 clrf MIDL
 clrf LOWL
 clrf EXTL
 call ShowCube
 movlw b'01110000'
 movwf HIGL
 clrf MIDL
 clrf LOWL
 clrf EXTL
 call ShowCube
 movlw b'01011000'
 movwf HIGL
 clrf MIDL
 clrf LOWL
 clrf EXTL
 call ShowCube
 movlw b'01001100'
 movwf HIGL
 clrf MIDL
 clrf LOWL
 clrf EXTL
 call ShowCube
 movlw b'00001101'
 movwf HIGL
 clrf MIDL
 clrf LOWL
 clrf EXTL
 call ShowCube
 movlw b'00000101'
 movwf HIGL
 clrf MIDL
 clrf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'00000011'
 movwf HIGL
 clrf MIDL
 clrf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'00100010'
 movwf HIGL
 clrf MIDL
 clrf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'00100010'
 movwf HIGL
 movlw b'00100000'
 movwf MIDL
 clrf LOWL
 clrf EXTL
 call ShowCube
 movlw b'00100000'
 movwf HIGL
 movlw b'00100000'
 movwf MIDL
 movwf LOWL
 clrf EXTL
 call ShowCube
 clrf HIGL
 movlw b'00100000'
 movwf MIDL
 movlw b'00110000'
 movwf LOWL
 clrf EXTL
 call ShowCube
 clrf HIGL
 clrf MIDL
 movlw b'01110000'
 movwf LOWL
 clrf EXTL
 call ShowCube
 clrf HIGL
 clrf MIDL
 movlw b'01011000'
 movwf LOWL
 clrf EXTL
 call ShowCube
 clrf HIGL
 clrf MIDL
 movlw b'01001100'
 movwf LOWL
 clrf EXTL
 call ShowCube
 clrf HIGL
 clrf MIDL
 movlw b'00001101'
 movwf LOWL
 clrf EXTL
 call ShowCube
 clrf HIGL
 movlw b'00000001'
 movwf MIDL
 movlw b'00000101'
 movwf LOWL
 clrf EXTL
 call ShowCube
 clrf HIGL
 movlw b'00000001'
 movwf MIDL
 movwf LOWL
 movlw b'00000010'
 movwf EXTL
 call ShowCube
 clrf HIGL
 movlw b'00000011'
 movwf MIDL
 clrf LOWL
 movlw b'00000010'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00100010'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000010'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00110010'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'01110000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'01011000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'01001100'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000100'
 movwf HIGL
 movlw b'00001100'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000101'
 movwf HIGL
 movlw b'00000100'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000101'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'00000011'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'00100010'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'00100010'
 movwf HIGL
 movlw b'00100000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00100000'
 movwf HIGL
 movlw b'00100000'
 movwf MIDL
 movlw b'00100000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00100000'
 movwf MIDL
 movlw b'00110000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'01110000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'01000000'
 movwf MIDL
 movlw b'01010000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'01000000'
 movwf HIGL
 movlw b'01000000'
 movwf MIDL
 movlw b'01000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'01010000'
 movwf HIGL
 movlw b'01000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'01110000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00110010'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00100010'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'00000010'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00010010'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00010011'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000001'
 movwf LOWL
 movlw b'00000011'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000101'
 movwf LOWL
 movlw b'00000001'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00001101'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'01001100'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'01000000'
 movwf MIDL
 movlw b'01001000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'01000000'
 movwf HIGL
 movlw b'01000000'
 movwf MIDL
 movlw b'01000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'01001000'
 movwf HIGL
 movlw b'01000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'11001000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'10001010'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube

 decfsz BRIG
 goto Pattern_snake_loop
 goto IdleCube

;******** PATTERN FOURFACE ***************************
;
; Shows four faces of the cube
;
;*****************************************************

Pattern_fourface

 movlw 0x00
 movwf BRIG
 movlw 0x30
 movwf TIME

Pattern_fourface_loop:

 movlw b'00000000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'11111111'
 movwf LOWL
 movlw b'00000001'
 movwf EXTL
 call ShowCube
 movlw b'01001100'
 movwf HIGL
 movlw b'01001100'
 movwf MIDL
 movlw b'01001100'
 movwf LOWL
 movlw b'00000000'
 movwf EXTL
 call ShowCube
 movlw b'11111111'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'00100010'
 movwf HIGL
 movlw b'00100010'
 movwf MIDL
 movlw b'00100010'
 movwf LOWL
 movlw b'00010011'
 movwf EXTL
 call ShowCube

 decfsz BRIG
 goto Pattern_fourface_loop
 goto IdleCube

;******** PATTERN RLPLANE ****************************
;
; Shows a raising-lowering horizontal plane
;
;*****************************************************

Pattern_rlplane

 movlw 0x00
 movwf BRIG
 movlw 0x40
 movwf TIME

Pattern_rlplane_loop:

 movlw b'00000000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'11111111'
 movwf LOWL
 movlw b'00000001'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'01001100'
 movwf MIDL
 movlw b'10110011'
 movwf LOWL
 movlw b'00000001'
 movwf EXTL
 call ShowCube
 movlw b'01001100'
 movwf HIGL
 movlw b'10010001'
 movwf MIDL
 movlw b'00100010'
 movwf LOWL
 movlw b'00000001'
 movwf EXTL
 call ShowCube
 movlw b'11011101'
 movwf HIGL
 movlw b'00100010'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00000010'
 movwf EXTL
 call ShowCube
 movlw b'11111111'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'10110011'
 movwf HIGL
 movlw b'01001100'
 movwf MIDL
 movlw b'00000000'
 movwf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'00100010'
 movwf HIGL
 movlw b'10010001'
 movwf MIDL
 movlw b'01001100'
 movwf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00100010'
 movwf MIDL
 movlw b'11011101'
 movwf LOWL
 movlw b'00000010'
 movwf EXTL
 call ShowCube
 movlw b'00000000'
 movwf HIGL
 movlw b'00000000'
 movwf MIDL
 movlw b'11111111'
 movwf LOWL
 movlw b'00000001'
 movwf EXTL
 call ShowCube

 decfsz BRIG
 goto Pattern_rlplane_loop
 goto IdleCube

;******** PATTERN ROTATEPLANE ************************
;
; Shows a rotating plane
;
;*****************************************************

Pattern_rotplane

 movlw 0x00
 movwf BRIG
 movlw 0x30
 movwf TIME

Pattern_rotplane_loop:

 clrf HIGL
 movlw b'11111111'
 movwf MIDL
 clrf LOWL
 movlw b'00000010'
 movwf EXTL
 call ShowCube
 movlw b'00100010'
 movwf HIGL
 movlw b'10010001'
 movwf MIDL
 movlw b'01001100'
 movwf LOWL
 movlw b'00010000'
 movwf EXTL
 call ShowCube
 movlw b'10010001'
 movwf HIGL
 movwf MIDL
 movwf LOWL
 clrf EXTL
 call ShowCube
 movlw b'01001100'
 movwf HIGL
 movlw b'10010001'
 movwf MIDL
 movlw b'00100010'
 movwf LOWL
 movlw b'00000001'
 movwf EXTL
 call ShowCube

 decfsz BRIG
 goto Pattern_rotplane_loop
 goto IdleCube

END

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s