; ********************************************************* ; * LCD-Interface Routinen fuer Vielzweck-Anwendung * ; * mit dem ATMEL STK200 Board, Version 0.1 Beta * ; * (C) 1999 Gerhard Schmidt, http://avr-asm-tutorial.net * ; ********************************************************* ; ; Zweck: ; Include-Datei fuer den AVR assembler ; Stellt die Standardroutinen fuer die Ansteuerung einer ; LCD auf dem ATMEL STK200 Board zur Verfuegung ; Ausgelegt fuer und kompatibel mit externem SRAM auf ; diesem Board (bis zu 32 kB) ; ; Benoetigt: ; mpr ... Vielzweckregister, alles zwischen R16 und R31, ; Inhalt wird von allen Routinen erhalten ; LCD ist Memory-mapped angeschlossen ; Eingerichteter Stapel, wird von Subroutinen und fuer ; PUSH/POP verwendet ; LCD muss korrekt angeschlossen sein, andernfalls wartet ; der Prozessor fuer immer auf das geloeschte Busy- ; Flag! (Blockade, kein Timeout!) ; 39 Worte Programmspeicher ; ; Interface-Routinen: ; lcd_wt Wartet bis die Busy-Flagge der LCD auf Null geht ; lcd_fc Sendet die LCD-Instruktion im Register mpr an ; die LCD, wenn die Busy-Flagge Null ist ; lcd_cl Loescht die LCD und setzt den Cursor auf die ; Home-Position, wenn die Busy-Flagge aus ist ; lcd_st Setzt den LCD-Modus auf 8-bit-Transfer, friert ; die Anzeige ein und setzt den Cursor auf ; Increment, wenn die Busy-Flagge aus ist ; lcd_sc Setzt den Cursor auf die Displayposition im ; Register mpr (Zeile 1: 00 .. 0F hex, Zeile 2: ; 40 .. 4F hex) ; lcd_ch Gibt das ASCII-Zeichen in Register rmp an der ; aktuellen Position der LCD aus, wenn die Busy- ; Flagge aus ist ; lcd_on Schaltet das Display an und den Cursor an und ; auf blinkend ; ; Adressendefinitionen im oberen Speicherraum: .equ lcd_rs = 0x8000 ; Registerauswahl = 0 adress .equ lcd_ds = 0xC000 ; Registerauswahl = 1 adress ; ; Subroutinen ; ; Warte bis die LCD nicht mehr busy ist ; lcd_wt: push mpr ; sichere Register lcd_wt1: lds mpr,lcd_rs ; Lese Busy-Flagge rol mpr ; Busy = Bit 7 in das Carry brcs lcd_wt1 ; noch busy, wiederhole pop mpr ; stelle Registerinhalt wieder her ret ; ; Gib die Instruktion in mpr an das LCD aus ; lcd_fc: rcall lcd_wt ; Warte bis nicht mehr busy sts lcd_rs,mpr ; Gib Instruktion an LCD ret ; ; Loescht die LCD and setzt den Cursor auf Home ; lcd_cl: push mpr ; sichere Register ldi mpr,0x01 ; clear Instruktion rcall lcd_fc ; Funktion an LCD ausgeben pop mpr ; Stelle Register wieder her ret ; ; Setze die LCD in 8-Bit-Modus, friere das Display ein ; und setze den Cursor auf Auto-Increment (Standardmodus) ; lcd_st: push mpr ; sichere Register ldi mpr,0b00111000 ; 8-Bit-Transfer rcall lcd_fc ; Instruktion an LCD ldi mpr,0b00000110 ; Increment, Display freeze rcall lcd_fc ; an LCD ldi mpr,0b00010000 ; Cursor move, nicht shift rcall lcd_fc ; an LCD pop mpr ; stelle Register wieder her ret ; ; Setze Cursor der LCD auf Position in mpr ; lcd_sc: push mpr ; sichere Register ori mpr,0x80 ; Setze Bit 7 der Position rcall lcd_fc ; Position an LCD pop mpr ; stelle Register wieder her ret ; ; Sende Zeichen in mpr an die LCD an der aktuellen ; Position, Position wird nach Schreiben erhoeht ; lcd_ch: rcall lcd_wt ; warte auf nicht mehr busy sts lcd_ds,mpr ; Schreibe Zeichen auf LCD-Display ret ; ; Setze LCD Display an, Cursor an und blinkend ; lcd_on: push mpr ; sichere Register ldi mpr,0b00001111 ; Instruktiion rcall lcd_fc ; an LCD pop mpr ; stelle Register wieder her ret