; ; "lcdinit.asm" ;.include "2313def.inc" ; lcd_routine: ; LCD-Initialisierung ; push temp ; Sicherung Temporaer- und push temp1 ; Statusregister auf Stack in temp1, SREG push temp1 cbi daten, 0 ; RS-Bit auf "low" ldi temp, 0x00 ; Reset des Ports out daten, temp rcall enable ; Enable-Impuls toggeln rcall verzoegerung3 ; ; Acht-Bit Init: ; dreimal Hex 0x30 ; ; immer notwendig, cbi daten, 0 ; wenn einmal 8/4-Bit-Modus ldi temp, 0x30 ; gewechselt wurde out daten, temp ; dazu steht RegisterSelect-Bit rcall enable ; stets auf "low" rcall verzoegerung3 ; und jedesmal ein Enable- cbi daten, 0 ; Impuls-Toggeln ldi temp, 0x30 out daten, temp rcall enable rcall verzoegerung3 cbi daten, 0 ldi temp, 0x30 out daten, temp rcall enable rcall verzoegerung3 ; ; Acht-zu-Vier-Bit-Modus-Wechsel ; cbi daten, 0 ldi temp, 0x20 ; zunaechst nur 4-Bit-Modus out daten, temp ; untere vier Bit werden rcall enable ; ignoriert, aber immer noch rcall verzoegerung3 ; 8-Bit-Bus-Befehlsbreite ; ; Vier-Bit-Modus; zwei Zeilen ; cbi daten, 0 ; dann 4-Bit-Modus ldi temp, 0x28 ; und zweizeilig rcall kommando ; ab hier bereits Steuerbefehle rcall verzoegerung3 ; im Vierbit-Modus senden ; ; On Off Control; Display einschalten: ; cbi daten, 0 ldi temp, 0x08 ; Display ausschalten, rcall kommando ; Cursor aus, Blinken aus rcall verzoegerung3 ; ; Anzeige loeschen: ; cbi daten, 0 ; Anzeige wird im "Space"- ldi temp, 0x01 ; Modus geloescht rcall kommando ; braucht mehr Zeit rcall verzoegerung3 rcall verzoegerung3 ; ; Entry Mode/Shift Set: ; cbi daten, 0 ldi temp, 0x06 ; Cursor von links nach rechts rcall kommando ; kein Schieben rcall verzoegerung3 cbi daten, 0 ldi temp, 0x10 ; kein Schieben, Cursorbewegung rcall kommando ; von links nach rechts rcall verzoegerung3 cbi daten, 0 ldi temp, 0x0F ; Anzeige wieder einschalten rcall kommando ; Cursor ein, Blinken ein rcall verzoegerung3 cbi daten, 0 ldi temp, 0x01 ; Anzeige nochmals loeschen rcall kommando rcall verzoegerung3 pop temp1 ; Temporaerregister und out SREG, temp1 ; Statusregister wiederherstellen pop temp1 pop temp ret ; datenuebernahme: ; Schreiben von Zeichen ins Display ; push temp sbi daten, 0 ; RS-Bit auf "high" fuer Schreiben ; ; von Charakters ins Display mov temp1, temp ; Kopie des Wertes fuer weitere; ; ; Operation unten andi temp, 0b11110000 ; unteres Nibble ausblenden ori temp, 0b00001111 ; RS, etc. auf "high" maskieren Port B out daten, temp ; Ausgabe oberes Nibble auf D4-D7 sbi daten, 0 rcall enable nop nop swap temp1 ; Nibble-Vertauschen, Wert aus temp; ; ; kopiert, s.o. andi temp1, 0b11110000 ; unteres Nibble ausblenden ori temp1, 0b00001111 ; RS, etc. auf "high" maskieren; Port B out daten, temp1 ; Ausgabe unteres Nibble auf D4-D7 rcall enable rcall verzoegerung2 sbi daten, 0 pop temp ret ; kommando: ; Schreiben von Steuerbefehlen ins Display ; push temp cbi daten, 0 ; RS-Bit auf "low" fuer Befehlsmodus mov temp1, temp ; Kopie des Wertes fuer weitere; ; ; Operation unten andi temp, 0b11110000 ; unteres Nibble ausblenden ori temp, 0b00001000 ; Port maskieren, RS auf "low" out daten, temp ; Ausgabe oberes Nibble auf D4-D7 cbi daten, 0 rcall enable nop nop swap temp1 ; Nibble-Vertauschen, Wert aus temp; ; ; kopiert, siehe oben andi temp1, 0b11110000 ; unteres Nibble ausblenden ori temp1, 0b00001000 ; Port maskieren, RS auf "low" out daten, temp1 ; Ausgabe unteres Nibble auf D4-D7 rcall enable rcall verzoegerung2 pop temp ret ; enable: ; nop sbi daten, 1 ; Enable-Bit auf "high" setzen nop ; Zeitverzoegerung mindestens nop ; 1000 (500)Nanosekunden laut Datenblatt nop ; lieber ein paar "nops" mehr nop ; spendieren nop nop nop cbi daten, 1 ; Enable-Bit wieder auf "low" zurücksetzen nop ret ; einschaltverzoegerung: ; rcall verzoegerung3 rcall verzoegerung3 rcall verzoegerung3 ret ; ; FIN