; ********************************************************************** ; *** Max7219 Displaytreiber-Ansteuerung ; *** Die Programmierung des Bausteins erfolgt seriell lt. Datenblatt ; *** (c) by Rainer Rick 3/2001 ; ********************************************************************** ; 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 ;Benutze Speicheradressen: Max_Adresse EQU 20h Max_Daten EQU 21h ;Benutze Register: ; A, R0, R1 = Zählregister (Temporär) ; ********************************************************************** ; *** Testprogramm: ; ********************************************************************** ; *** Zum Test des Displays werden alle Digits nacheinander hoch- ; *** gezählt, jedes von 0 bis 9, um dann wieder bei 0 zu beginnen. ; ********************************************************************** Testprogramm: LCALL Max_DISP_INIT ;Initialisierung des Max7219 Endlosschleife: LCALL Max_DISP_CLEAR ;Löschen der Anzeige FOR Max_Adresse = #1 to #8 ;Max_Adresse hochzählen FOR Max_Daten = #0h To #9h ;Max_Daten hochzählen LCALL Max_DISP_OUT ;Anweisung an den Max7219 senden LCALL Pause ;Abwarten NEXT Max_Daten NEXT Max_Adresse 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,#FFh ;Dekodiermodus = FFh = > alle 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 #5Fh FOR R1 = #0h To #FFh NOP NEXT R1 NEXT R0 RET