; ********************************************************************** ; *** Max7219 Displaytreiber-Ansteuerung ; *** Beispielprogramm zur Anzeige einer Laufschrift mit dem Text: ; *** "HALLO - ICH bIN EIN bEISPIEL FUEr EINE LAUFSCHrIFT" ; ********************************************************************** ; Quartzfrequenz: 12 MHz ; Prozessortyp (Es können natürlich auch andere verwendet werden): INCLUDE 89c2051.mc ; Benutzte Portleitungen: Max_Clock EQU P1.1 Max_ChipSelect EQU P1.2 Max_DataIn EQU P1.3 ;Benutzte Speicheradressen: Max_Adresse EQU 20h Max_Daten EQU 21h Laufposition EQU 22h ;Benutzte Register: ; A, R0, R1 = Zählregister (Temporär) ; ********************************************************************** ; *** Testprogramm: ; ********************************************************************** Testprogramm: LCALL Max_DISP_INIT ;Initialisierung des Max7219 MOV DPTR,#Datenfeld_Laufschrift Endlosschleife: FOR Laufposition = #0 to #57 ;Die Laufposition hochzählen FOR Max_Adresse = #1 to #8 ;Max_Adresse hochzählen MOV A,Max_Adresse ADD A,Laufposition MOVC A,@A+DPTR ;Speicherstelle Datenfeld_Hallo + Max_Adresse ... ; + Laufposition in den Akku einlesen MOV Max_Daten, A LCALL Max_DISP_OUT ;Anweisung an den Max7219 senden NEXT Max_Adresse LCALL Pause ;Abwarten NEXT Laufposition LJMP Endlosschleife ; ********************************************************************** ; *** Unterprogramm Max_DISP_INIT ; ********************************************************************** ; *** Der Baustein Max7219 hat insgesamt 14 Register: ; *** Adr.: 00: NOP (No Operation) ; *** 01-08: Digits 1-8 ; *** 09: Dekodier-Modus (00h = 00000000 = keine Dekodierung ; *** 01h = 00000001 = Dekodierung Dig0 ; *** 02h = 00000010 = Dekodierung Dig1 ; *** .. = ........ = Dekodierung .... ; *** FFh = 11111111 = Dekodierung Dig0-7) ; *** ; *** 0A: Helligkeit der Anzeige (00 = dunkel bis 0F = hell) ; *** 0B: Anzahl der verwendeten Digits ; *** 0C: Operation (1 = Normalbetrieb, 0 = Shutdown) ; *** 0F: Selbst Test (0 = Normalbetrieb, 1 = Display Test) ; *** genauere Beschreibung siehe Datenblatt! ; ********************************************************************** Max_DISP_INIT: MOV Max_Adresse,#0Bh ;Adresse 0Bh = Scan Limit MOV Max_Daten,#07h ;Scan Limit = 8 Digits LCALL Max_DISP_OUT ;Anweisung an den Max7219 senden MOV Max_Adresse,#09h ;Adresse 09h = Dekodiermodus MOV Max_Daten,#00h ;Dekodiermodus = 00h = > keine Digits dekodieren LCALL Max_DISP_OUT ;Anweisung an den Max7219 senden MOV Max_Adresse,#0Ah ;Adresse 0Ah = Helligkeit MOV Max_Daten,#0Fh ;Helligkeit = 0Fh = > größte Helligkeit LCALL Max_DISP_OUT ;Anweisung an den Max7219 senden MOV Max_Adresse,#0Ch ;Adresse 0Ch = Operationsmodus MOV Max_Daten,#01h ;Operationsmodus = 01h = > Normalbetrieb LCALL Max_DISP_OUT ;Anweisung an den Max7219 senden RET ; ********************************************************************** ; *** Unterprogramm Max_DISP_CLEAR ; ********************************************************************** ; *** Jedes Digit wird definiert zurückgesetzt (blank) ; ********************************************************************** Max_DISP_CLEAR: FOR Max_Adresse = #1 to #8 ;Digit 1-8 ansprechen MOV Max_Daten,#0Fh ;0Fh = Alle Segmente aus, blank LCALL Max_DISP_OUT ;Ausgabe an die Anzeige NEXT Max_Daten RET ; ********************************************************************** ; *** Unterprogramm Max_DISP_OUT ; ********************************************************************** ; *** Adresse und Befehl werden seriell ausgegeben ; ********************************************************************** Max_DISP_OUT: CLR Max_ChipSelect ;active LOW ! ;HighByte (Adresse) ausgeben: MOV A,#10000000b MOV R2,A 'Bit 0 - 7 der Max_Adresse in den MAX7219 schieben: FOR R3 = #0 to #7 ANL A,Max_Adresse 'Adressbit an den MAX7219 legen: IF A = #0 THEN CLR Max_DataIn ELSE SETB Max_DataIn END IF ;Bit in den MAX7219 schieben: SETB Max_Clock CLR Max_Clock ;Vergleichsbit durchrotieren MOV A,R2 RR A MOV R2,A NEXT R3 ;LowByte (Daten) ausgeben: MOV A,#10000000b MOV R2,A 'Bit 0 - 7 der Max_Daten in den MAX7219 schieben: FOR R3 = #0 to #7 ANL A,Max_Daten 'Datenbit an den MAX7219 legen: IF A = #0 THEN CLR Max_DataIn ELSE SETB Max_DataIn END IF ;Bit in den MAX7219 schieben: SETB Max_Clock CLR Max_Clock ;Vergleichsbit durchrotieren MOV A,R2 RR A MOV R2,A NEXT R3 SETB Max_ChipSelect 'Übertragung der Adresse/Daten beendet RET ; ********************************************************************** ; *** Unterprogramm Pause ; ********************************************************************** Pause: FOR R0 = #0h To #FFh FOR R1 = #0h To #FFh NOP NOP NOP NEXT R1 NEXT R0 RET ; ********************************************************************** ; *** Datenfeld "HALLO - ICH bIN EIN bEISPIEL FUEr EINE LAUFSCHrIFT" ; ********************************************************************** Datenfeld_Laufschrift: ;" " DB 00000000b, 00000000b, 00000000b, 00000000b, 00000000b, 00000000b, 00000000b, 00000000b ;"HALLO - " DB 00110111b, 01110111b, 00001110b, 00001110b, 01111110b, 00000000b, 00000001b, 00000000b ;"ICH bIN " DB 00000110b, 01001110b, 00110111b, 00000000b, 00011111b, 00000110b, 01110110b, 00000000b ;"EIN bEIS" DB 01001111b, 00000110b, 01110110b, 00000000b, 00011111b, 01001111b, 00000110b, 01011011b ;"PIEL FUE" DB 01100111b, 00000110b, 01001111b, 00001110b, 00000000b, 01000111b, 00111110b, 01001111b ;"r EINE L" DB 00000101b, 00000000b, 01001111b, 00000110b, 01110110b, 01001111b, 00000000b, 00001110b ;"AUFSCHrI" DB 01110111b, 00111110b, 01000111b, 01011011b, 01001110b, 00110111b, 00000101b, 00000110b ;"FT -" DB 01000111b, 01000110b ;" " DB 00000000b, 00000000b, 00000000b, 00000000b, 00000000b, 00000000b, 00000000b, 00000000b ;"A" = 01110111b ;"C" = 01001110b ;"E" = 01001111b ;"F" = 01000111b ;"H" = 00110111b ;"I" = 00000110b ;"J" = 00111000b ;"L" = 00001110b ;"O" = 01111110b ;"P" = 01100111b ;"S" = 01011011b ;"U" = 00111110b ;"b" = 00011111b ;"c" = 00001101b ;"d" = 00111101b ;"h" = 00010111b ;"o" = 00011101b ;"u" = 00011100b ;Sonderzeichen: ;" " = 00000000b ;"-" = 00000001b ;"_" = 00001000b ;"." = 10000000b ;"[" = 01001110b ;"]" = 01111000b ;"=" = 00001001b ;Zahlen: ;"0" = 01111110b ;"1" = 00110000b ;"2" = 01101101b ;"3" = 01111001b ;"4" = 00110011b ;"5" = 01011011b ;"6" = 01011111b ;"7" = 01110000b ;"8" = 01111111b ;"9" = 01111011b ;mit Fantasie erkennbar... ;"N" = 01110110b ;"T" = 01000110b ;"Y" = 00110011b ;"Z" = 01101101b ;"n" = 00010101b ;"r" = 00000101b ;"t" = 00000111b