nomad
- 19th December 2007, 19:18
Saw a 5x5 display on you tube, daughter liked it so decided to make one.
there was no code for it, so here it is in PBP.
'************************************************* **
'* Christmas stocking stuffer for Andi from dad
'* 5x5 home made led display
'* pic 16F648A
'* December 2007
'* by: Nomad (DSobelman(at)hotmail(dot)com)
'************************************************* ***
' USE ALL CAPS for now, will add lower case or lower case conversion to caps later
' very limited character set for now (no time to add the rest right now)
' added space at beginning of data, project was skipping first character
data " ANDREA ROCKS # MERRY CHRISTMAS MUNCHKIN #"
@ DEVICE pic16F648A, INTRC_OSC_NOCLKOUT
'@ DEVICE pic16F648A, HS_OSC
' osc setting
@ DEVICE pic16F648A, WDT_OFF
' Watchdog Timer
@ DEVICE pic16F648A, PWRT_ON
' Power-On Timer
@ DEVICE pic16F648A, MCLR_OFF
' Master Clear Options (Internal)
@ DEVICE pic16F648A, BOD_OFF
' Brown-Out Detect
@ DEVICE pic16F648A, LVP_OFF
' Low-Voltage Programming
@ DEVICE pic16F648A, CPD_OFF
' code protect
@ DEVICE pic16F648A, PROTECT_OFF
'data protect
defines:
'define osc 20
DEFINE OSC 4
PORTB = 0 'turn off all
PORTA = 0
TRISB = 0 'all output
TRISA = 0
CMCON = 7 'disable comparators
Variables:
row var byte
col var byte[8] 'was originally going to do scrolling on 8x8 but didn't have a board
x var word 'how many random patterns in random sub
temp var word 'temp var for random HAS TO BE WORD (random doesn't work with byte)
rowx var byte[5] 'store constant for each row
char var byte ' index for lookup
lettermark var BYTE 'pointer to eeprom address
letter var byte 'temp for ascii convert
clear
constants: 'rows numbered 1-5, single each row out
rowx[1] = 1
rowx[2] = 2
rowx[3] = 4
rowx[4] = 8
rowx[5] = 16
start:
GOSUB READ_STRING 'READ EEPROM DATA
gosub get_char 'GET CHARACTER DATA
gosub display_run 'DISPLAY CHARACTER
gosub rand_disp 'SHOW RANDOM BLINKY STUFF (THEY LIKE BLINKY STUFF)
goto start 'DO IT AGAIN WITH NEXT LETTER OVER AND OVER
rand_disp: 'generate random noise on display
for x=1 to 5 'dispplay "x" random patterns (full 5x5(8x8) patterns)
random temp 'make random number
pauseus 50
PORTA = temp 'put out on porta (only uses low byte?)
random temp 'make row random number
pauseus 50
PORTB = temp 'put out on portb
pause 20 'how long to show pattern
next x 'next pattern
return
display_run: 'show characters
PORTA=0 'turn off all leds
PORTB=0
PAUSE 50 'forgot why this is here
for temp = 1 to 1000 'how many full character loops (how long to display character)
for row = 1 to 5 '5 loops, one for each row
porta = 0 'turn rows off (kill ghosting)
portb = col[row] 'put out row data for row(x)
PAUSEUS 100 'settle
porta = rowx[row] 'turn on row
pauseus 100 'settle
next row 'do again for each row to show full character
next temp 'show character again (refresh/scan/whatever you wish to call it)
return
read_string: 'read data (message) from eprom
lettermark = lettermark + 1 'go to next eeprom address
IF LETTERMARK > 255 THEN ' if at end hmmm don't think I need this anymore
LETTERMARK = 0 'was testing
ELSE
ENDIF
READ LETTERMARK, LETTER 'read byte from eprom, assign to letter
IF LETTER = $FF THEN 'check for end of message
LETTERMARK = 0 'if end, reset eeprom pointer, make a space character
LETTER = $20
ELSE
ENDIF
PAUSEUS 500
find_index: ' use lookdown to change ascii to a sequential index to keep lookup small
LOOKDOWN LETTER,["- #ABCDEFGHIJKLMNOPQRSTUVWXYZ"],CHAR
RETURN
get_char: ' get each of the row's data with index from converted ascii
LOOKUP char,[$00,$00,$0A,$0E,$1E,$0E,$1C,$1F,$1E,$1E,$11,$0E,$0 7,$09,$08,$11,$11,$0E,$0E,$0E,$1E,$0E,$1F,$00,$11, $11,$11,$11,$1F],col[1]
LOOKUP char,[$00,$00,$1B,$11,$09,$10,$0A,$10,$10,$10,$11,$04,$0 2,$0A,$08,$1B,$19,$11,$09,$11,$09,$10,$04,$0A,$11, $11,$0A,$11,$02],col[2]
LOOKUP char,[$1F,$00,$04,$1F,$0E,$10,$0A,$1E,$1C,$16,$1F,$04,$0 2,$0C,$08,$15,$15,$11,$0E,$15,$0E,$0E,$04,$0A,$0A, $15,$04,$1F,$04],col[3]
LOOKUP char,[$00,$00,$1B,$11,$09,$10,$0A,$10,$10,$12,$11,$04,$0 A,$0A,$08,$11,$13,$11,$08,$12,$0A,$01,$04,$0A,$04, $1B,$0A,$04,$08],col[4]
LOOKUP char,[$00,$00,$0A,$11,$1E,$0E,$1C,$1F,$10,$1E,$11,$0E,$0 E,$09,$0E,$11,$11,$0E,$08,$0D,$09,$0E,$04,$0E,$00, $11,$11,$04,$1F],col[5]
return
end
will have to extend the character set and add serial to change the message. but this was just for a quick toy, so I didn't do any of that.
there was no code for it, so here it is in PBP.
'************************************************* **
'* Christmas stocking stuffer for Andi from dad
'* 5x5 home made led display
'* pic 16F648A
'* December 2007
'* by: Nomad (DSobelman(at)hotmail(dot)com)
'************************************************* ***
' USE ALL CAPS for now, will add lower case or lower case conversion to caps later
' very limited character set for now (no time to add the rest right now)
' added space at beginning of data, project was skipping first character
data " ANDREA ROCKS # MERRY CHRISTMAS MUNCHKIN #"
@ DEVICE pic16F648A, INTRC_OSC_NOCLKOUT
'@ DEVICE pic16F648A, HS_OSC
' osc setting
@ DEVICE pic16F648A, WDT_OFF
' Watchdog Timer
@ DEVICE pic16F648A, PWRT_ON
' Power-On Timer
@ DEVICE pic16F648A, MCLR_OFF
' Master Clear Options (Internal)
@ DEVICE pic16F648A, BOD_OFF
' Brown-Out Detect
@ DEVICE pic16F648A, LVP_OFF
' Low-Voltage Programming
@ DEVICE pic16F648A, CPD_OFF
' code protect
@ DEVICE pic16F648A, PROTECT_OFF
'data protect
defines:
'define osc 20
DEFINE OSC 4
PORTB = 0 'turn off all
PORTA = 0
TRISB = 0 'all output
TRISA = 0
CMCON = 7 'disable comparators
Variables:
row var byte
col var byte[8] 'was originally going to do scrolling on 8x8 but didn't have a board
x var word 'how many random patterns in random sub
temp var word 'temp var for random HAS TO BE WORD (random doesn't work with byte)
rowx var byte[5] 'store constant for each row
char var byte ' index for lookup
lettermark var BYTE 'pointer to eeprom address
letter var byte 'temp for ascii convert
clear
constants: 'rows numbered 1-5, single each row out
rowx[1] = 1
rowx[2] = 2
rowx[3] = 4
rowx[4] = 8
rowx[5] = 16
start:
GOSUB READ_STRING 'READ EEPROM DATA
gosub get_char 'GET CHARACTER DATA
gosub display_run 'DISPLAY CHARACTER
gosub rand_disp 'SHOW RANDOM BLINKY STUFF (THEY LIKE BLINKY STUFF)
goto start 'DO IT AGAIN WITH NEXT LETTER OVER AND OVER
rand_disp: 'generate random noise on display
for x=1 to 5 'dispplay "x" random patterns (full 5x5(8x8) patterns)
random temp 'make random number
pauseus 50
PORTA = temp 'put out on porta (only uses low byte?)
random temp 'make row random number
pauseus 50
PORTB = temp 'put out on portb
pause 20 'how long to show pattern
next x 'next pattern
return
display_run: 'show characters
PORTA=0 'turn off all leds
PORTB=0
PAUSE 50 'forgot why this is here
for temp = 1 to 1000 'how many full character loops (how long to display character)
for row = 1 to 5 '5 loops, one for each row
porta = 0 'turn rows off (kill ghosting)
portb = col[row] 'put out row data for row(x)
PAUSEUS 100 'settle
porta = rowx[row] 'turn on row
pauseus 100 'settle
next row 'do again for each row to show full character
next temp 'show character again (refresh/scan/whatever you wish to call it)
return
read_string: 'read data (message) from eprom
lettermark = lettermark + 1 'go to next eeprom address
IF LETTERMARK > 255 THEN ' if at end hmmm don't think I need this anymore
LETTERMARK = 0 'was testing
ELSE
ENDIF
READ LETTERMARK, LETTER 'read byte from eprom, assign to letter
IF LETTER = $FF THEN 'check for end of message
LETTERMARK = 0 'if end, reset eeprom pointer, make a space character
LETTER = $20
ELSE
ENDIF
PAUSEUS 500
find_index: ' use lookdown to change ascii to a sequential index to keep lookup small
LOOKDOWN LETTER,["- #ABCDEFGHIJKLMNOPQRSTUVWXYZ"],CHAR
RETURN
get_char: ' get each of the row's data with index from converted ascii
LOOKUP char,[$00,$00,$0A,$0E,$1E,$0E,$1C,$1F,$1E,$1E,$11,$0E,$0 7,$09,$08,$11,$11,$0E,$0E,$0E,$1E,$0E,$1F,$00,$11, $11,$11,$11,$1F],col[1]
LOOKUP char,[$00,$00,$1B,$11,$09,$10,$0A,$10,$10,$10,$11,$04,$0 2,$0A,$08,$1B,$19,$11,$09,$11,$09,$10,$04,$0A,$11, $11,$0A,$11,$02],col[2]
LOOKUP char,[$1F,$00,$04,$1F,$0E,$10,$0A,$1E,$1C,$16,$1F,$04,$0 2,$0C,$08,$15,$15,$11,$0E,$15,$0E,$0E,$04,$0A,$0A, $15,$04,$1F,$04],col[3]
LOOKUP char,[$00,$00,$1B,$11,$09,$10,$0A,$10,$10,$12,$11,$04,$0 A,$0A,$08,$11,$13,$11,$08,$12,$0A,$01,$04,$0A,$04, $1B,$0A,$04,$08],col[4]
LOOKUP char,[$00,$00,$0A,$11,$1E,$0E,$1C,$1F,$10,$1E,$11,$0E,$0 E,$09,$0E,$11,$11,$0E,$08,$0D,$09,$0E,$04,$0E,$00, $11,$11,$04,$1F],col[5]
return
end
will have to extend the character set and add serial to change the message. but this was just for a quick toy, so I didn't do any of that.