;LCD-Ansteuerung AV1621 im 4-Bit-Modus ;**************************************************************** LCD EQU P2 ;LCD-Port2 BUSY EQU LCD.3 ;LCD-busy-Flag defineren E EQU P2.4 ;LCD Enable Port 2.4 RS EQU P2.7 ;Daten- /Instruktionsregister laden RW EQU LCD.5 ;LCD Read/Write ;**************************************************************** start: ORG 0000h lcall zeit30 ;30ms Verzögerung ;---------------------------------------------------------------- mov dptr,#text ;Lade Datapointer mit der Code-Adr. 'text' jnb P3.2,vo jnb P3.3,rk sjmp prog vo: mov dptr,#vor sjmp prog rk: mov dptr,#rueck prog: ;---------------------------Initialisierung---------------------- LCD_INIT: mov a,#28h ;2 Zeilen 5x7 (Function Set) --> 3x acall befehl mov a,#28h ;2 Zeilen 5x7 (Function Set) acall befehl mov a,#28h ;2 Zeilen 5x7 (Function Set) acall befehl lcall zeit40 ;>40µs Verzögerung mov a,#0Eh ;Display ON acall befehl lcall zeit40 ;>40µs Verzögerung mov a,#01h ;Display löschen acall befehl lcall zeit30 ;>1,53ms(30ms) Verzögerung mov a,#06h ;Entry Mode acall befehl lcall zeit40 ;>40µs Verzögerung mov a,#80h ;Startadr. Display/DDRAM (80h-8Fh,C0h-CFh) acall befehl lcall zeit40 ;>40µs Verzögerung ljmp daten ;================================================================ befehl: mov b,a ;Accu speichern in Reg. b acall ready ;LCD ready? lcall LCD_aus ;Unterprogr. Ausgabe mov a,b ;gespeicherter Wert laden swap a ;Nibbletausch lcall LCD_aus ;Unterprogr. Ausgabe clr RS ;RS=0 (Befehlseingabe) clr RW ;Schreiben ret ;----LCD_AUS----Ausgabe: Befehle/Daten--------------------------- LCD_aus: clr RW anl a,#0F0h ;High-Nibble(Befehl) aktiv anl LCD,#0F0h ;Low-Bereich=0, High-Bereich (Steuerung) bleibt swap a ;Nibbletausch in a (auf Lower setzen) orl LCD,a ;High-Nibble(Befehl) und Steurung aktiv setb E ;LCD aktivieren clr E ret ;---Datenanzeige------------------------------------------------- daten: mov R7,#00h ;Zählregister auf 0 next: inc R7 ;+1 (nächste Adresse) movc a,@a+dptr ;Inhalt a+dptr laden acall dataout ;Datenausgabe mov a,R7 ;Anzeige-Stelle in den Accu cjne R7,#10h,next ;Vergleich auf letzte Anzeigestelle (16) ;---Zeile2------------------------------------------------ mov a,#0C0h ;Startadr. Display 2.Zeile acall befehl ;Befehl ausführen mov a,R7 ;Anzeige-Stelle in den Accu mov R7,#10h ;auf Zeichen 16 setzen next1: inc R7 ;+1 (nächste Adresse) movc a,@a+dptr ;Inhalt a+dptr laden acall dataout ;Datenausgabe mov a,R7 ;Anzeige-Stelle in den Accu cjne R7,#20h,next1;Vergleich auf letzte Anzeigestelle (32) ;---------------------------------------------------------------- stop:SJMP stop ;------Datenausgabe---------------------------------------------- dataout: mov b,a ;Accu speichern in Reg. b acall ready ;LCD ready? setb RS ;RS=1 Daten ausgeben! lcall LCD_aus ;Unterprogr. Ausgabe mov a,b ;gespeicherter Wert laden swap a ;Nibbletausch lcall LCD_aus ;Unterprogr. Ausgabe clr RS ;RS und RW zurücksetzen clr RW ret ;---Ready?------------------------------------------------------- READY:setb BUSY ;in Betrieb! clr RS setb RW BACK: clr E setb E jb BUSY,BACK;warten auf Busy-Signal (Busy=0) ret ;===Zeit========================================================= zeit30: mov a,#150d ;Zeitverzögerung 30ms z12: mov r1,#99d z11: djnz r1,z11 djnz acc,z12 ret ;---------------------------------------------------------------- zeit40: mov a,#30d ;Zeitverzögerung 40µs z13: dec a djnz acc,z13 ret ;-----Ende-LCD-Anzeige------------------------------------------- text: db ' Projektarbeit ','Janssen & Meier ' ;Anzeigetext vor: db ' Vorwaerts ',' ' rueck: db ' Rueckwaerts ',' ' ljmp start