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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.