;************************************************************************** ; FILE: dazzler.asm * ; CONTENTS: 'Razzle Dazzler' * ; COPYRIGHT: MadLab Ltd. 1999-2003 * ; AUTHOR: James Hutchby * ; UPDATED: 09/11/03 * ;************************************************************************** list p=12C508 include "p12c508.inc" __config _IntRC_OSC & _WDT_OFF & _MCLRE_OFF & _CP_ON __idlocs h'AE21' errorlevel -305 ; N.B. '508 (2.5V min Vdd) rather than '508A (3.0V min Vdd) ;************************************************************************** ; * ; Specification * ; * ;************************************************************************** ; power-up self-test - all LED's flash twice ; button pressed when power applied -> step sequence mode ; else -> random sequence mode ; button pressed and released -> sequence mode ; button held down for ~2 seconds -> setup mode ; setup mode :- ; button held down -> brightness cycles ; button released -> sequence mode ; sequence mode :- ; button pressed -> next sequence if step mode + sleep mode ;************************************************************************** ; * ; Port assignments * ; * ;************************************************************************** GPIO_IO equ b'001000' ; GPIO I/O status BUTTON equ 3 ; pushbutton LED0 equ 4 ; LED #0 LED1 equ d'8'+4 ; LED #1 LED2 equ 5 ; LED #2 LED3 equ d'8'+5 ; LED #3 LED4 equ 1 ; LED #4 LED5 equ d'8'+1 ; LED #5 LED6 equ 2 ; LED #6 LED7 equ d'8'+2 ; LED #7 LED_MASK equ b'110110' ; LED mask LED_MUX equ 0 ; LED multiplexer ;************************************************************************** ; * ; Constants and timings * ; * ;************************************************************************** CLOCK equ d'4000000' ; processor clock frequency in Hz PRESCALE equ b'00000000' ; prescale RTCC 1:2 (weak pull-ups ; enabled, wake-up on pin change) FLASH_PERIOD equ d'150' ; LED flash period POLL_PERIOD equ d'7' ; button poll period SETUP_PERIOD equ d'80' ; setup mode period CYCLE_PERIOD equ d'20' ; setup cycle period SEQUENCES equ d'16' ; number of sequences BRIGHTNESS equ d'4' ; default brightness ;************************************************************************** ; * ; File register usage * ; * ;************************************************************************** RAM equ h'07' cblock RAM mode ; mode (bit 0 = setup, bit 1 = step) brightness ; LED brightness, 1 to 8 pattern ; LED pattern LEDS_A, LEDS_B ; port data delay ; delay timer ; timer rand_l, rand_h ; random number speed ; speed repeat ; repeat count step ; sequence index count1, count2 ; scratch counters work1, work2 ; work registers endc ;************************************************************************** ; * ; Macros * ; * ;************************************************************************** routine macro label ; routine label endm table macro label ; define lookup table label addwf PCL endm entry macro value ; define table entry retlw value endm index macro label ; index lookup table call label endm jump macro label ; jump through table goto label endm tstw macro ; test w register iorlw 0 endm movff macro f1,f2 ; move file to file movfw f1 movwf f2 endm movlf macro n,f ; move literal to file movlw n movwf f endm ;-------------------------------------------------------------------------- ; reset vector ;-------------------------------------------------------------------------- org 0 movwf OSCCAL goto main_entry ;************************************************************************** ; * ; Lookup tables * ; * ;************************************************************************** table seq_jump ; sequence jump table goto seq1 goto seq2 goto seq3 goto seq4 goto seq5 goto seq6 goto seq7 goto seq8 goto seq9 goto seq10 goto seq11 goto seq12 goto seq13 goto seq14 goto seq15 goto seq16 table repeats ; repeat counts entry d'4' entry d'45' entry d'12' entry d'12' entry d'5' entry d'1' entry d'18' entry d'12' entry d'3' entry d'24' entry d'8'*d'10' entry d'8'*d'7' entry d'11' entry d'7' entry d'8'*d'8' entry d'8'*d'6' table patterns ; initial patterns entry b'01000100' entry b'00000001' entry b'00000000' entry b'00000000' entry b'01000100' entry b'01010101' entry b'00000000' entry b'00000000' entry b'00000001' entry b'00001001' entry b'00000001' entry b'00001111' entry b'00000000' entry b'00000000' entry b'00000001' entry b'00000001' table speeds ; initial speeds entry d'22' entry d'22' entry d'12' entry d'22' entry d'15' entry d'27' entry d'15' entry d'16' entry d'28' entry d'30' entry d'44' entry d'60' entry d'21' entry d'26' entry d'35' entry d'35' table pattern3 entry b'10000010' entry b'10000010' entry b'01000100' entry b'01000100' entry b'00101000' entry b'00101000' entry b'00010000' entry b'00010000' entry b'00010000' entry b'00101000' entry b'00101000' entry b'01000100' entry b'01000100' entry b'10000010' entry b'10000010' entry b'00000001' entry b'00000001' entry b'00000001' len3 equ $-pattern3-1 table pattern4 entry b'00000001' entry b'10000011' entry b'11000111' entry b'11101111' entry b'11111111' entry b'11111110' entry b'01111100' entry b'00111000' entry b'00010000' entry b'00000000' len4 equ $-pattern4-1 table pattern7 entry b'10001000' entry b'10011001' entry b'10111011' entry b'11111111' entry b'01110111' entry b'01100110' entry b'01000100' entry b'00000000' entry b'00000000' len7 equ $-pattern7-1 table pattern13 entry b'10000011' entry b'11000110' entry b'01101100' entry b'00111000' entry b'00010000' entry b'00010000' entry b'00111000' entry b'01101100' entry b'11000110' entry b'10000011' entry b'00000001' entry b'00000001' len13 equ $-pattern13-1 table pattern14 entry b'00010001' entry b'10101010' entry b'01000100' entry b'10101010' entry b'00010001' entry b'00000000' entry b'00000000' entry b'01000100' entry b'10101010' entry b'00010001' entry b'10101010' entry b'01000100' entry b'00000000' entry b'00000000' len14 equ $-pattern14-1 ;************************************************************************** ; * ; Procedures * ; * ;************************************************************************** ;-------------------------------------------------------------------------- ; tests the button ;-------------------------------------------------------------------------- test_button macro movlw 1<