HD44780 LCD Ansteuern Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
HD44780 LCD Ansteuern Suche nach: lcd (4680) |
|
|
|
|
BID = 529410
lord_fritte Gerade angekommen
Beiträge: 8
|
|
Hallo ich habe ein kleines HD44780 kompatibles 2 x 16 Zeichen Display.
Jetzt würde es mich interessieren mit welchen Befehlen ich Pixel manuell ansteuern kann.
Ich möchte gerne als Beispiel in der 2. Zeile am 14. Zeichen 5 Pixel ansteuern. |
|
BID = 529420
Nukeman Schriftsteller
Beiträge: 754 Wohnort: bei Kleve
|
|
Hallo Lord Fritte,
diese Displays sind Zeichenorientiert. Sie lassen sich nur
quasi pixelweise ansteuern, indem man eigene Zeichen definiert.
Das steht aber alles im Datenblatt, wovon ich hier jetzt keine
Nacherzählung zum besten geben möchte Mit anderen Worten: RTFM
Gruß
Stefan
|
|
BID = 529421
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
@Mods:
Bitte nach µC verschieben. Danke.
Edit: Danke Sam
@Topic
Hallo lord_fritte, erstmal willkommen im Forum .
Sowas ist machbar, wenn auch nur eingeschränkt.
Wenn du etwas vom Programmieren verstehst, z.B. im Mikrokontrollerbereich, dann ist das noch einfacher, als es diskret zu probieren.
Erstmal sind die Pixel nicht direkt ansteuerbar, da dieser Kontroller schon eine Ebene höher arbeitet und als Daten ASCII-Zeichen haben möchte. Die stellt er dann, anhand eines eigenen Char Generators (Zeichengenerator-ROM) auf dem Display dar.
Allerdings, und das dürfte dir in diesem Fall helfen, sind 8 Byte dieses Zeichengenerators in einem RAM gemappt, den man selbst beschreiben kann. Klartext: 8 Zeichen können definiert werden, und zwar mithilfe von Bitmustern. Setzt man dort eine 1 an einer bestimmten Position, wird das entspr. Pixel angeschaltet, andernsfalls bleibt es aus.
Mist, sobald man mal ausführlicher schreibt, sind andere schneller ...
_________________
[ Diese Nachricht wurde geändert von: DonComi am 21 Jun 2008 14:33 ]
|
BID = 529426
Nukeman Schriftsteller
Beiträge: 754 Wohnort: bei Kleve
|
Zitat :
| Mist, sobald man mal ausführlicher schreibt, sind andere schneller ... |
Dafür hat Deine Erklärung mehr Details
|
BID = 529447
lord_fritte Gerade angekommen
Beiträge: 8
|
Hallo also ich habe vor einen Fortschrittsbalken in der 2. Zeile darzustellen.
Dazu habe ich vor einmal außenrum einen Rahmen darzustellen, dies soll den leeren Fortschrittsbalken darstellen:
#####....#####
# #
# #
#####....#####
Und je nachdem wie voll er wird, werden die Zeichen immer weiter augefüllt:
#####....#####
### #
### #
#####....#####
usw.
Aber wenn es nicht geht oder zu aufwendig ist, dann muss ich eben mit ASCII Zeichen arbeiten, sieht zwar nicht schön aus aber was will man machen.
[ Diese Nachricht wurde geändert von: lord_fritte am 21 Jun 2008 15:41 ]
|
BID = 529449
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Hallo genausowas habe ich grade gemacht.
Das Problem, dass du hast: es sind maximal 8 Bytes erlaubt.
Ich habe folgende Bytes genommen, damit es klappt:
1. [ Begrenzung auf einer Seite
2. ] Begrenzung auf der anderen Seite
3. Strich oben/unten, sonst leer
4. ein |
5. zwei ||
6. drei |||
7. vier ||||
8. fünf |||||
Damit habe ich eine ordentliche ProgressBar gezaubert. Allerdings läuft das Programmmodul dazu auf einem Prozessor, der hervorragend mit großen Zahlen rechnen kann, denn es sind Multiplikationen und Divisionen/Modulodivisionen notwendig.
Die kompliziertere Version bekommt nur noch eine struct, anhand derer sie dann die Progressbar auf dem Display zeichnet. Damit kann man viele machen, die auch die Skalierung selbstständig übernehmen.
Finde grade die Kamera nicht.
Edit
Zitat :
| Aber wenn es nicht geht oder zu aufwendig ist, dann muss ich eben mit ASCII Zeichen arbeiten, sieht zwar nicht schön aus aber was will man machen. |
Wieso, wir haben doch gesagt, dass es geht! Nur eben mit maximal 8 selbstdefinierten Zeichen.
So sehen die entsprechenden Daten dazu aus:
Code : |
static const unsigned char prgData[] PROGMEM =
{
0x1F,0x00,0x00,0x00,0x00,0x00,0x1F,0,
0x1F,0x00,0x10,0x10,0x10,0x00,0x1F,0, /* | */
0x1F,0x00,0x18,0x18,0x18,0x00,0x1F,0, /* || */
0x1F,0x00,0x1C,0x1C,0x1C,0x00,0x1F,0, /* ||| */
0x1F,0x00,0x1E,0x1E,0x1E,0x00,0x1F,0, /* |||| */
0x1F,0x00,0x1F,0x1F,0x1F,0x00,0x1F,0, /* ||||| */
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0, /*| */
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0 /* | */
};
|
|
_________________
[ Diese Nachricht wurde geändert von: DonComi am 21 Jun 2008 15:46 ]
|
BID = 529457
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Hier sieht man das, was ich meinte.
Edit: Die Software ist aber noch nicht fertig. Z.B. sind die "Grafiken" noch garnicht richtig beschriftet. Geht hier eher um die ProgressBar.
Eine einfacherere Version, die ohneviel Skalierung und Rechnerei auskommt, ist die, die nur exakt ein Balkendiagramm zeichnet. Dabei wird das meiste vom Präprozessor ausgerechnet, während hier der Prozessor erst zur Laufzeit die Grafik skaliert und berechnet. Wie gesagt, der Prozessor macht das mit links, aber die AVRs brauchen i.d.R. länger, wenn sie keine Hardwaremultiplikation erlauben.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 21 Jun 2008 15:58 ]
|
BID = 529460
lord_fritte Gerade angekommen
Beiträge: 8
|
Hallo, danke das werde ich mir mal ansehen.
Also ich mache die Programmierung eh Software technisch unter Windows mit einem 2GHz DualCore, also sollte die Prozessorleistung kein Problem darstellen.
EDIT: Genau so stelle ich mir das auch vor.
[ Diese Nachricht wurde geändert von: lord_fritte am 21 Jun 2008 15:56 ]
|
BID = 529462
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Na dann ist das ja kein Problem. Hier steuert halt kein 2GHz Dualkoreprozessor das Display sondern ein kleiner Mikroprozessor...
_________________
|
BID = 529464
lord_fritte Gerade angekommen
Beiträge: 8
|
Oder ich überlege ob ich nicht doch schon eine fertig Software wie LCDSmartie verwende.
|
BID = 529465
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Wenn die alles kann, was man will, könnte man drüber nachdenken.
Ich würde es selbst machen, aber das ist Einstellungssache.
_________________
|
BID = 529469
lord_fritte Gerade angekommen
Beiträge: 8
|
Zitat :
DonComi hat am 21 Jun 2008 16:10 geschrieben :
|
Wenn die alles kann, was man will, könnte man drüber nachdenken.
Ich würde es selbst machen, aber das ist Einstellungssache.
|
Ja ich hatte mich schon bisschen damit beschäftigt, aber mit C# bekomme ich reingarnichts auf Display, keine Ahnung warum.
|
BID = 529475
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Mit C# kenn ich micht nicht aus.
Ich würde einen Treiber unter Windows benutzen, den in ein C++-Programm einbinden und alles in C++ schreiben, oder eben in C. Aber C macht eigentlich keinen Sinn, wenn man eine Oberfläche zur Verfügung hat, es sei denn, man benutzt Unix oder ähnliche.
_________________
|
BID = 529511
lord_fritte Gerade angekommen
Beiträge: 8
|
Also C# ist eigentlich eine ganz schöne Sprache, ist im Grunde C++ ziemlich ähnlich.
Mit DLLImport kann ich auch die dlportio.dll nutzen.
Aber hast du vielleicht auch ein kleines Beispiel wie man deinen prgData Array benutzt?
|
BID = 529553
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Hallo,
Das sind die Bitmuster, die benutzt werden, um die ProgressBar (Balkendiagramm hätte man vor zehn Jahren gesagt zeichenweise zeichnen zu können.
Schau dir mal im Datenblatt an, was die einzelnen Bytes jeweils zu sagen haben:
0x1F ist binär (000)11111 als Byte. Die Adressen für je ein neues Zeichen sind jeweils immer 8 Bit von der vorherigen vorhanden, also Zeichen 0 liegt im RAM von 0x00 bis 0x07. Ab 0x08 folgen dann die nächsten Bytes für das nächste Zeichen.
Der Übersicht und Sauberkeit halber habe ich je 8 Bytes jeweils in eine Zeile geschrieben, am Anfang jeder Zeile ist das Bitmuster für die erste Reihe eines Zeichens:
0x1F ist binär 11111, und wie oben erwähnt bedeutet eine 1 ein angeschaltetes Pixel.
0x00 heißt alle Pixel aus. Die oberen drei Bits sind egal, da ja pro Zeile nur 5 Pixel vorhanden sind.
Um dann diese definierten Zeichen auch ausgeben zu können, schreibt man entsprechende Zeichen mit den Codes 0 - 7, und erhält dann diese Bitmuster auf dem Display.
Einen Quelltext kann ich dir sinnigerweise nicht geben, aber es müssen erstmal Routinen her, die das Display unter Kontrolle haben. In meinem Fall gibts also eine Routine, selbstgeschrieben, die lcdPut(char *, unsigned char); genannt wurde.
Sie akzeptiert binäre Daten bzw. orientiert sich nicht an Terminatoren (wioe es im Fall des Zeichenkodes 0 der Fall wäre) sondern an der Länge der Daten.
Bevor man die 64 Bytes in einem Rutsch in den Zeichengenerator schreibst, muss man vorher aber festlegen, dass die folgenden Daten dort hinkommen.
Dazu führt man einen entsprechenden Befehl aus, in meinem Triber heißt der lcdCommand(SET_GC_ADDR). Dann werden die 64 Byte geschrieben
lcdPut(prgData, 64);
und danach wird wieder in den normalen Modus umgeschaltet.
Achso, lass dich nicht von den anderen Angaben wie static und PROGMEM beeinflussen, die sind bei AVRs dann notwendig, wenn man aus dem Flash lesen will. Das ist hier aber nicht der Fall, das PROGMEM nur ein Leermakro.
Edit: Verzeih die kleineren Fehlerchen - komme grad von nem Ball wieder und bin dermaßen müde...
_________________
[ Diese Nachricht wurde geändert von: DonComi am 22 Jun 2008 0:49 ]
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag heute wurden bisher 26 Beiträge verfasst © x sparkkelsputz Besucher : 182114744 Heute : 5819 Gestern : 5426 Online : 633 2.10.2024 23:26 5 Besucher in den letzten 60 Sekunden alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0451622009277
|