mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Routine für Zeichen Definition, HD44780, CGRAM, 2x16 Displa


Autor: Bernhard Bauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hat hier vielleicht jemand eine gut funktionierene Routine, mit der man
auf einem 2x16 Display im CGRAM freie Zeichen definieren kann.
Ich habe selbst eine Routine geschrieben, die allderings nicht zu
funktionieren scheint:




.
.
.
DEFINE_CHAR:  ldi temp1, 0b01000000  ;Setze CGRAM Adresse auf 0
rcall LCD_COMMAND       ;Befehl Ausführen (RS=0)
    ldi ZL, LOW(2*char1)    ;Z_Pointer laden
    ldi ZH, HIGH(2*char1)
    rcall PRINT

PRINT:    lpm                     ;Z-Pointer Inhalt nach R0
    tst r0                  ;Teste R0 auf 0 (Abschluss)
    breq PRINT_END
    mov temp1, r0
    rcall LCD_DATA          ;Daten aufs LCD (RS=1)
    adiw ZL, 1
    rjmp PRINT
PRINT_END:  ret

char1:          .db 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0
.
.
.
.


Die Funktionen LCD_COMMAND und LCD_DATA funktionieren sicher. Ich habe
sie schon anderweitig getestet.
Vielleicht hat jemand eine elegantere und vor allem funktionierende
Lösung hierzu.

DesWeiteren habe ich folgende Frage: Ist es überhaupt sinnvoll auf die
CGRAM Adresse 0 ein Zeichen zu definieren, da dieses Zeichen dann den
ASCII-Code 0 hat und gleichzeitig auch als Abschluss eines Strings
hergenommen wird, und somit nie geschrieben wird.
Ein Simulationsprogramm für 2x16 LCD mit HD44780 Controller findet man
unter:
http://www.sxlist.com/techref/io/lcd/djlcdsim/djlcdsim.html
Dort funktioniert meine Routine, nur in der Realität nicht.
Für Lösungsansätze wäre ich sehr dankbar.

Gruß
Bernhard

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DEFINE_CHAR:  ldi temp1, 0b01000000  ;Setze CGRAM Adresse auf 0

rcall LCD_COMMAND       ;Befehl Ausführen (RS=0)
    ldi ZL, LOW(2*char1)    ;Z_Pointer laden
    ldi ZH, HIGH(2*char1)
    rcall PRINT
hier fehlt ein ret, wie soll es denn weiter gehen, wenn das Programm
von print zurückkommt?

PRINT:    lpm                     ;Z-Pointer Inhalt nach R0
    tst r0                  ;Teste R0 auf 0 (Abschluss)
    breq PRINT_END
    mov temp1, r0
    rcall LCD_DATA          ;Daten aufs LCD (RS=1)
    adiw ZL, 1
    rjmp PRINT
PRINT_END:  ret


char1:          .db 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0

Ob das mit tst 0 der richtige Weg ist? Kann ja schon mal vorkommen,
dass in einem Zeichen eine 0 vorkommt. Eine einfache for/next
-schleife mit fester Schleifenzahl entsprechend der Spaltenzahl (oder
wird das zeilenweise adressiert? Weiss ich jetzt nicht aus dem Kopf.)
des Displays.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Routine habe ich nicht, da ich bisher immer mit dem vorhandenen
ROM-Zeichensatz zurecht kam.

Was Adresse 0 betrifft, die 8 selbstdefinierten Zeichen sind doch auch
über Adresse 8...15 erreichbar.

...

Autor: Lightning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hy,
Ich hab eine die mit dem LCD-Code
aus dem AVR-Tutorial funktioniert:

.......
.......
.......


           rcall lcd_init
           rcall lcd_clear    ;Display löschen

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;In den CG-RAM wechseln (Addresse 0)
ldi temp1, 0x48
rcall lcd_command
;----------------------------------------------------
;Daten senden (Zeichen deffinieren) (Die ersten 3 Bit's müssen 0 sein
da nur 5 Pixel/Zeile)
ldi temp1, 0b00010001 ;#ooo#
rcall lcd_data

ldi temp1, 0b00001010 ;o#o#o
rcall lcd_data

ldi temp1, 0b00000100 ;oo#oo
rcall lcd_data

ldi temp1, 0b00001010 ;o#o#o
rcall lcd_data

ldi temp1, 0b00000100 ;oo#oo
rcall lcd_data

ldi temp1, 0b00001010 ;o#o#o
rcall lcd_data

ldi temp1, 0b00010001 ;#ooo#
rcall lcd_data


;Cursorzeile sollte leer
;bleiben, kann aber auch Deffiniert werden:

ldi temp1, 0b00000000 ;ooooo
rcall lcd_data
;----------------------------------------------------

;Wieder in den DD-RAM wechseln
ldi temp1, 0b10000000
rcall lcd_command
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;deffiniertes Zeichen aufrufen.
ldi temp1, 0x01
       rcall lcd_data

loop:
rjmp loop  ;Endlosschleife


.......
.......
.......

Gruß Lightning

Autor: Bernhard Bauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Tipps. Manchmal sieht man halt den Wald vor lauter
Bäumen nicht mehr. Nun aber noch eine Frage:

Wenn ich in den CGRAM wechsle (z.B. Adresse 0), dann wechselt der
Cursor in die zweite Zeile, erste Spalte, bei Adresse 1 dann in die
zweite Spalte. Ich möchte ja eigentlich im CGRAM Zeichen definieren,
und nicht die Cursor-Position wechseln. Ist das normal, oder gewollt?
Wenn ja für welche Zwecke, oder muß man darüber hinweg sehen?
Danke schon mal für die Antworten.

Gruß
Bernhard

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.