Forum: Mikrocontroller und Digitale Elektronik LCD_Display_Routines


von sonic (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte folgende Aufgabenstellung (siehe Anhang) im Keil µ Vision2 
implementieren. Ich bin jedoch noch nicht sehr vertraut mit Assembler 
und möchte nun wissen ob ich den folgenden Code bereits so für mein 
Projekt übernehmen kann oder ob ich da etwas ändern muss (mal von den 
Namen der Routinen abgesehen). Wäre nett wenn mir da jemand helfen 
könnte.

;*********************************************************************** 
***
;************************   Display-Routine 
****************************
;Name:         *
;Datum:          *
;Klasse:         *
;Titel:  display.asm        *
;Aufgabe: Ein Display wird initialisiert, der Name des Autors aufs  *
;   Display geschrieben und nach einem Zeilenwechsel ein String
;  (Klasse) immer um ein Zeichen nach rechts geschoben.   *
;Reihenfolge der Funktionsaufrufe:       *
;  1. CALL init Initialisierung      *
;  2. CALL name Autorname am Display ausgeben    *
;  3. CALL line2 In die 2. Zeile wechseln    *
;  4. CALL klasse Klasse ausgeben und verschieben    *
;Programm ist vom Systemtakt abhängig!       *
;*********************************************************************** 
***
$MOD51
CSEG AT 8000H
 JMP MAIN
AUTOR: db '              TESTSTRING',0
CLASS: db ' dfg',0
CLEAR: db '     ',0
EN     EQU P1.6    ; ENABLE
RW     EQU P1.5    ; READ/WRITE
RS     EQU P1.4    ; READ_STATUS
BUSY   EQu P1.7    ; BUSY-FLAG
LCDD   EQU P2    ; Ausgabe-Port
;*********************************************************************** 
***
;Hauptprogramm
;*********************************************************************** 
***
MAIN: MOV R2,#0  ;Laufvariable für Buchstabennummer
 MOV R3,#0  ;Bedingung für 2. String
 MOV R5,#11000000b ;um in die 2.Zeile zu wechseln

 call init  ;Initialisierung
 call name  ;Ausgabe des Namen
 call line2  ;Wechsle in 2. Zeile
 call klasse  ;Ausgeben der Klasse
 JMP $   ;Endlosschleife

;*********************************************************************** 
***
;Diese UP erstellt einen Timer für eine Verzögerungszeit
;*********************************************************************** 
***
timer: ANL TMOD,#11110000b  ;Einstellungen für den Timer
 ORL TMOD,#00000001b
 MOV TH0,#HIGH(60536)  ;für die Verzögerungszeit
 MOV TL0,#LOW(60536)  ;von 5ms
 CLR TF0
 SETB TR0   ;Starte Timer
 JNB TF0,$   ;Warte 5ms
 CLR TF0
 RET

;*********************************************************************** 
***
;Mit diesem Timer wird eine Wartzeit für das Verschieben der Schrift 
generiert
;*********************************************************************** 
***
secund: ANL TMOD,#11110000b  ;Taktzeit zum verschieben in
 ORL TMOD,#00000001b  ;der 2.Zeile
 MOV R4,#10   ;Der Timer wird 10 mal aufgerufen
LOOPS: MOV TH0,#HIGH(15536)  ;50ms
 MOV TL0,#LOW(15536)
 CLR TF0
 SETB TR0   ;Starte Timer
 JNB TF0,$
 CLR TF0
 DJNZ R4,LOOPS   ;mehrmals Durchlaufen für laengere
 RET    ;Zeit
;*********************************************************************** 
***
;Dient zum Initialisieren des Displays
;*********************************************************************** 
***
init: MOV A,#00000000b
 CALL output
 MOV A,#00000001b  ;lösche Display
 CALL output
 MOV A,#00000010b  ;Cursor auf AnfangsPos
 CALL output
 MOV A,#00111000b  ;aktiviert Zweizeilig
 CALL output
 MOV A,#00001111b
 CALL output
 RET
;*********************************************************************** 
***
;Inhalt von Akku wird ausgegeben
;*********************************************************************** 
***
output: clr EN
 clr RS
 clr RW
 SETB EN    ;Bedingungen
 MOV LCDD,A   ;Akku auf Display hinausschreiben
 clr EN
 CALL timer   ;Verzögerungszeit
 RET
;*********************************************************************** 
***
;Der String AUTO wird in den Akku geschrieben
;*********************************************************************** 
***
name: MOV A,R2
 MOV DPTR,#AUTOR
 MOVC A,@A+DPTR   ;String auf Akku
 CJNE A,#0,write   ;Solange, bis String-Ende
 MOV R2,#0   ;Laufvariable rücksetzen
 MOV R3,#1   ;Bedingung für 2. String
 RET

;*********************************************************************** 
***
;Der gewünschte String wird über P1 auf das Display geschrieben
;*********************************************************************** 
***
write: clr EN
 clr RW    ;LÖSCHE BIT READ/WRITE
 setb RS
 setb EN
 MOV LCDD,A   ;SCHREIBE AKKU AUF PORT
 clr EN    ;SETZE BIT ENABLE
 CALL timer   ;Verzögerung
 INC R2    ;erhöhe für nächsten Buchstaben
 CJNE R3,#1,name   ;Abfrage ob String 1 oder 2
 JMP klasse
;*********************************************************************** 
***
;Wechselt in die 2.Zeile und bewegt dann den Cursor um eins nach rechts
;*********************************************************************** 
***
line2: clr EN
 clr RS
 CLR RW    ;Bedingungen
 MOV A,R5   ;beim 1. Mal wird die Zeile
 setb EN    ;gewechselt, dann um eins nach
 MOV LCDD,R5   ;rechts gerückt
 clr EN
 CALL timer   ;Verzögerungszeit
 INC R5
 RET
;*********************************************************************** 
***
;Der String "Klasse" wird in den Akku geschrieben
;*********************************************************************** 
***
klasse: MOV A,R2   ;Eingabeparameter R2 als Laufvariable
 MOV DPTR,#CLASS
 MOVC A,@A+DPTR
 CJNE A,#0,write
 MOV R2,#0
 CALL Secund   ;Zeit zwischen Verschiebungen abwarten
 CALL cleark   ;Zeile wechseln oder 1Zeichen weiter
 CALL line2   ;Falls String am Ende, löschen
 JMP klasse   ;Startet die Endlosschleife
;*********************************************************************** 
***
;Löscht den Sting, wenn er am Ende des Displays ist
;*********************************************************************** 
***
cleark: CJNE R5,#0e3h,ENDE  ;falls Zeilenende, String löschen
 MOV R2,#0
 MOV DPTR,#CLEAR
clrk: MOV A,R2
 MOVC A,@A+DPTR   ;String auf Akku
 clr EN
 clr RW    ;LÖSCHE BIT READ/WRITE
 setb RS
 setb EN
 MOV LCDD,A   ;SCHREIBE AKKU AUF PORT
 clr EN    ;SETZE BIT ENABLE
 CALL timer
 INC R2    ;Buchstabennummer erhöhen
 CJNE A,#0,clrk
 MOV R5,#11000000b  ;Wert zum wechseln der Zeile
 call line2
 MOV R2,#0
ENDE: RET

END


Hier wäre ein Datenblatt:

http://www.siteupload.de/p484015-LCDpdf.html

danke sonic

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.