'{$STAMP BS2} '{$PBASIC 2.5} ' Program Listing 70.1 ' Nuts & Volts - February 2000 ' ----[ Title ]----------------------------------------------------------- ' ' File...... LEDARRAY.BS2 ' Purpose... Uses the MAX7219 to drive a 5x7 LED array ' Author.... Jon Williams ' E-mail.... jonwms@aol.com ' Started... 06 JAN 2001 ' Updated... 07 JAN 2001 ' {$STAMP BS2} ' ----[ Program Description ]--------------------------------------------- ' ' Demonstrates the use of Maxim's MAX7219 LED display driver in the ' non-decoded mode. In this mode, the programmer is responsible for ' sending segment (row) data for each digit (column). ' ' In this application, the MAX7219 is connected to a common-cathode LED ' array. The array is five columns wide by 7 rows tall (35 LEDs). The ' digit outputs from the MAX7219 are connect to the columns; the segment ' control lines to the rows. ' ' MAX7219 --> LED Connections: ' ' MAX7219.2 (0) --> Col 1 (left) ' MAX7219.11 (1) --> Col 2 ' MAX7219.6 (2) --> Col 3 ' MAX7219.7 (3) --> Col 4 ' MAX7219.3 (4) --> Col 5 ' ' MAX7219.17 (g) --> Row 1 (top) ' MAX7219.15 (f) --> Row 2 ' MAX7219.21 (e) --> Row 3 ' MAX7219.23 (d) --> Row 4 ' MAX7219.20 (c) --> Row 5 ' MAX7219.16 (b) --> Row 6 ' MAX7219.14 (a) --> Row 7 ' ----[ Revision History ]------------------------------------------------ ' ' 07 JAN 2001 - Version 1 ' ----[ I/O Definitions ]------------------------------------------------- ' Clock CON 0 ' shift clock to MAX7219 DPin CON 2 ' shift data to MAX7219 Load CON 1 Clock2 CON 8 ' shift clock to MAX7219 DPin2 CON 10 ' shift data to MAX7219 Load2 CON 9 ' ----[ Constants ]------------------------------------------------------- Decode CON $09 ' bcd decode Intensity CON $0A ' brightness Scan CON $0B ' scan (column) limit ShutDn CON $0C ' shutdown (1 = on) Test CON $0F ' display test mode Yes CON 1 No CON 0 ' ----[ Variables ]------------------------------------------------------- ' index VAR NIB ' loop counter index2 VAR NIB ' loop counter idxOdd VAR index.BIT0 ' is index odd? (1 = yes) id2Odd VAR index2.BIT0 ' is index odd? (1 = yes) d7219 VAR BYTE ' data for MAX7219 char VAR BYTE ' character ee address d7219b VAR BYTE ' data for MAX7219 char2 VAR BYTE ' character ee address col VAR NIB ' column value col2 VAR NIB ' row value eeAddr1 VAR BYTE ' ee pointer eeAddr2 VAR BYTE ' ee pointer PDdata VAR NIB ' ----[ EEPROM Data ]----------------------------------------------------- ' Char_touristA DATA %00000000 ' ...xx... DATA %00010000 DATA %00100000 DATA %00010100 DATA %01000000 DATA %00000000 DATA %10000001 DATA %01000010 Char_touristB DATA %00000110' ...xx... DATA %00001000 DATA %00000000 DATA %00100000 DATA %00000000 DATA %00000000 DATA %00000100 DATA %00000000 Char_volcanoA DATA %00100000 ' ...xx... DATA %01100000 DATA %00100000 DATA %00100000 DATA %01100000 DATA %01111111 DATA %10111111 DATA %10011111 Char_volcanoB DATA %00011100 ' ...xx... DATA %00111000 DATA %00111000 DATA %00000011 DATA %00000000 DATA %01001100 DATA %00000000 DATA %00000000 Char_temperatureA DATA %00000000 ' ...xx... DATA %00000000 DATA %00000000 DATA %00011010 DATA %11111101 DATA %00111100 DATA %00010001 DATA %00000011 DATA 0 Char_temperatureB DATA %00000000 ' ...xx... DATA %00000000 DATA %00000000 DATA %00100000 DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 DATA 0 Char_rainfallA DATA %00000000 ' ...xx... DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 DATA %11111000 DATA %10011110 DATA 0 Char_rainfallB DATA %00001111 ' ...xx... DATA %00000000 DATA %00000000 DATA %00001100 DATA %00000000 DATA %00000011 DATA %00000111 DATA %00000000 Char_glacierA DATA %00000000 ' ...xx... DATA %00000000 DATA %00000000 DATA %00000000 DATA %10000011 DATA %11111111 DATA %00111100 DATA %00011100 Char_glacierB DATA %00000000 ' ...xx... DATA %00000000 DATA %00000000 DATA %00010000 DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 Char_crustalA DATA %00000000 ' ...xx... DATA %00000000 DATA %00000000 DATA %00011110 DATA %00111110 DATA %00011100 DATA %00011100 DATA %00000000 Char_crustalB DATA %00000000 ' ...xx... DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 Char_boundaryA DATA %00000000 ' ...xx... DATA %00000000 DATA %00011000 DATA %00111111 DATA %11111111 DATA %11111111 DATA %11111111 DATA %10111111 Char_boundaryB DATA %01111110 ' ...xx... DATA %00111000 DATA %00000000 DATA %01111110 DATA %11100000 DATA %10000001 DATA %00011010 DATA %00000000 Char_Blank DATA %00000000 ' ...xx... DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 DATA %00000000 ' ----[ Initialization ]-------------------------------------------------- ' Initialize: DIRL = %111 ' clock, data and load pins FOR index2 = 0 TO 5 LOOKUP index2,[Scan,7,Intensity,9,ShutDn,1],d7219b SHIFTOUT Dpin2,Clock2,MSBFIRST,[d7219b] IF id2Odd = No THEN NoLoad2 'DEBUG "index2 = ", DEC index2, CR PULSOUT Load2,3 ' load parameter NoLoad2: 'DEBUG "noLoad_2", CR NEXT FOR index = 0 TO 5 LOOKUP index,[Scan,7,Intensity,9,ShutDn,1],d7219 SHIFTOUT Dpin,Clock,MSBFIRST,[d7219] IF idxodd = No THEN NoLoad 'DEBUG "index = ", DEC index, CR PULSOUT Load,3 ' load parameter NoLoad: 'DEBUG "NoLoad", CR NEXT ' ----[ Main Code ]------------------------------------------------------- Main: PDdata = 6 'SERIN 16,16572,[PDdata] IF PDdata = 0 THEN LED0 IF PDdata = 1 THEN LED1 IF PDdata = 2 THEN LED2 IF PDdata = 3 THEN LED3 IF PDdata = 4 THEN LED4 IF PDdata = 5 THEN LED5 IF PDdata = 6 THEN LED6 IF PDdata = 7 THEN LED0 IF PDdata = 8 THEN LED1 IF PDdata = 9 THEN LED2 IF PDdata = 10 THEN LED3 IF PDdata = 11 THEN LED4 IF PDdata = 12 THEN LED5 IF PDdata = 13 THEN LED6 END ' LED0: FOR char2 = 0 TO 1 FOR char = 0 TO 1 LOOKUP char2,[Char_touristB],eeAddr2 LOOKUP char,[Char_touristA],eeAddr1 GOSUB ShowChar NEXT NEXT GOTO Initialize LED1: FOR char2 = 0 TO 1 FOR char = 0 TO 1 LOOKUP char2,[Char_volcanoB],eeAddr2 LOOKUP char,[Char_volcanoA],eeAddr1 GOSUB ShowChar NEXT NEXT GOTO Initialize LED2: FOR char2 = 0 TO 1 FOR char = 0 TO 1 LOOKUP char2,[Char_temperatureB],eeAddr2 LOOKUP char,[Char_temperatureA],eeAddr1 GOSUB ShowChar NEXT NEXT GOTO Initialize LED3: FOR char2 = 0 TO 1 FOR char = 0 TO 1 LOOKUP char2,[Char_rainfallB],eeAddr2 LOOKUP char,[Char_rainfallA],eeAddr1 GOSUB ShowChar NEXT NEXT GOTO Initialize LED4: FOR char2 = 0 TO 1 FOR char = 0 TO 1 LOOKUP char2,[Char_glacierB],eeAddr2 LOOKUP char,[Char_glacierA],eeAddr1 GOSUB ShowChar NEXT NEXT PAUSE 500 GOTO Initialize LED5: FOR char2 = 0 TO 1 FOR char = 0 TO 1 LOOKUP char2,[Char_crustalB],eeAddr2 LOOKUP char,[Char_crustalA],eeAddr1 GOSUB ShowChar NEXT NEXT GOTO Initialize LED6: FOR char2 = 0 TO 1 FOR char = 0 TO 1 LOOKUP char2,[Char_boundaryB],eeAddr2 LOOKUP char,[Char_boundaryA],eeAddr1 GOSUB ShowChar NEXT NEXT GOTO Initialize blank: FOR char2 = 0 TO 1 FOR char = 0 TO 1 LOOKUP char2,[Char_blank],eeAddr2 LOOKUP char,[Char_blank],eeAddr1 GOSUB ShowChar NEXT NEXT GOTO Initialize ' ----[ Subroutines ]----------------------------------------------------- ' ShowChar: FOR col = 1 TO 8 ' character is 8 columns wide READ (eeAddr1 + col - 1),d7219 ' read column data from EEPROM SHIFTOUT Dpin,Clock,MSBFIRST,[col,d7219] PULSOUT Load,3 NEXT FOR col2 = 1 TO 8 ' character is 8 columns wide READ (eeAddr2 + col2 - 1),d7219b ' read column data from EEPROM SHIFTOUT Dpin2,Clock2,MSBFIRST,[col2,d7219b] PULSOUT Load2,3 NEXT RETURN