Hey Leute
Ich muss als Projekt eine Alarmanlage programmieren. Soweit kam ich noch
klar aber nun muss ich eine Tastatur, mit Tastern programmieren. Dafür
soll ein Taster als Speichern definiert werden, einer als Löschen und
einer als Zurück und einer als Eingabe. Die anderen sollen die Tasten
1-4 darstellen.. Das ist das kleinste Problem, das dürfte ich auh noch
einigermaßen hinbekommen.
Das größte Problem ist das Prgrammieren der LCD anzeige, es sollen
verschiedene Funktionen angezeigt werden und über die Taster dann
ausgewählt werden. Das Problem ist dass ich überhaupt nicht weiß wie man
ein LCD-Bildschirm programmiert. Ich habe bisher alles über die LED oder
7segm-Anzeige gemacht.
Ich wäre froh wenn mir einer von euch einen Link oder einen Code posten
könnte.
Achja es geht um den Mikroprozessor 80C535 und wir programmieren mit dem
MCLS-modular.
Dann noch eine andere Frage,
Gibt es ein Programm mit dem man das programmierte Programm simulieren
kann? dann könnte ich auch noch zu Hause am Programm arbeiten, denn mit
MCLS kann man nicht simulieren.
Hoffe auf eure Hilfe
mfg Willi
Wie gesagt, für LCDs gibt's diverse Librarys im Netz und bei den
Controllerherstellern. Denke mal bei deiner Anwendung hast es mit einem
Standard 1x16 oder 2x16 Textdisplay zu tun. Und ein Menü zur Anzeige
diverser Funktionen auf dem Display realisiert man mit einer
State-Machine.
Ich muss ein ganzes Menü anzeigen und das hab ich mir so vorgestellt
dass ich das mit der Tastatur mache indem ich sage dass Taste5 Rauf
bedeutet und Taste6 Runter, dh dass die erste Zeile durch die zweite
ersetzt wird und die 2te Zeile durch eine neue ersetzt wird. Genaueres
kann ich erst sagen wenn ich die Bautteile vor mir liegen habe. dann
weiß ich auch genau was das für Bautteile sind.
call WRITE_DREG ; Zeichen ins LCD-Datenregister schreiben
12
call wait_kurz ; 100us warten
13
inc b ; Offset +1
14
jmp m00 ; weiter machen
15
m01: ret
In dieser Funktion ist der auszugebende Text offenbar so bestimmt, dass
das dptr die Startadresse des Textes beinhalten soll. Wenn du das also
aus dem Unterprogramm herausziehst, sollte das schon mal die halbe Miete
sein
Du hast dann ein Unterprogramm
1
;
2
; Voraussetzungen
3
; dptr enthält die Startadresse des auszugebenden Textes
4
; der Cursor am LCD ist schon an der richtigen Stelle
5
;
6
; veränderte Register: b, a und alles in WRITE_DREG, wait_kurz
7
;
8
TEXT_OUT:
9
mov b,#000h ; Offset für Text rücksetzen
10
to00: mov a,b ; Offset nach a
11
movc a,@a+dptr ; Zuriff auf Textelement
12
jz to1 ; Endekennung erreicht ?
13
; wenn ja, dann Ausgabe beenden
14
call WRITE_DREG ; Zeichen ins LCD-Datenregister schreiben
15
call wait_kurz ; 100us warten
16
inc b ; Offset +1
17
jmp to00 ; weiter machen
18
to01: ret
welches du so aufrufen kannst
1
mov dptr,#menu_1
2
call TEXT_OUT
3
....
4
5
menu_1 db "Menupunkt 1",00
und das den Text an der Stelle, an der der Cursor gerade steht ausgibt.
Also sollte man vorher noch den Cursor am LCD entsprechend
positionieren.
In deinem Demo ist fast alles enthalten was du brauchst. Lediglich die
eigentlichen Text Ausgabe Funktionen sind ein wenig ungeschickt gemacht,
weil sie zuviel machen und sich nicht mehr weiter auf einfachere
Basisfunktionen, wie zb Textausgabe stützen. Das wäre im Demo so besser
gewesen, da hätte man dann die eigentliche Textausgabe von dem was
ausgegeben werden soll besser getrennt gehabt:
Willi schrieb:> Ich muss ein ganzes Menü anzeigen und das hab ich mir so vorgestellt> dass ich das mit der Tastatur mache indem ich sage dass Taste5 Rauf> bedeutet und Taste6 Runter, dh dass die erste Zeile durch die zweite> ersetzt wird und die 2te Zeile durch eine neue ersetzt wird.
Der Plan klingt erst mal nicht so schlecht.
Ein Menü ist ja nichts anderes als eine Sammlung von Texten und einem
Mechanismus, wie man einen davon auswählt. Dazu braucht man eine
'Variable', die einem sagt, welcher Menüpunkt zur Zeit der wäre, der
gerade selektiert werden würde, wenn der Benutzer selektiert. Also so
was wie einen aktiven Menüpunkt. Du kannst zb sagen, dass immer der
Menüpunkt in der ersten Zeile der ist, der ausgewählt wird, wenn der
Benutzer 'Enter' drückt.
Bei dir kommt noch dazu, dass du von n-Texten immer nur 2 anzeigen
kannst.
Quäl dich aber nicht damit herum, Text auf dem LCD umzukopieren. Schreib
einfach immer alle beiden Texte hin: den gerade aktiven und den nächsten
(falls es noch einen nächsten gibt). Wenn der Benutzer Rauf oder Runter
drückt, wird einfach die Variable für den aktiven Menüpunkt um 1 erhöht
oder erniedrigt und das Unterprogramm aufgerufen, welches den aktiven
Menüpunkt in die erste Zeile und den jeweils nächsten in die zweite
Zeile schreibt.
Soweit bin ich jetzt bei der Tastatur.
die ersten 4 Tasten sind bereits mit den Zahlen 0-4 belegt und werden
mom noch über eine 7segm-Anzeige ausgegeben. Die anderen 4 Tasten sollen
mit den Befehlen "Enter"; "Löschen/Zurück", "Rauf" und "Runter" belegt
werden. Damit wàre das Problem eig gelöst, allerdings verstehe ich immer
noch nicht wie die LCD funktionieren soll, also das mit dem Menü.
Willi schrieb:> werden. Damit wàre das Problem eig gelöst, allerdings verstehe ich immer> noch nicht wie die LCD funktionieren soll,
Was genau verstehst du daran nicht?
Es gibt eine Init Funktion, die das LCD initialisiert, so dass man
darauf Texte ausgeben kann.
Und es gibt eine Funktion, die einen Text ausgeben kann.
> also das mit dem Menü.
Ein Menü ist auch nur eine Sammlung mehrer Texte, von denen einer einer
ausgezeichneter ist als alle anderen
Dein Menü ist eine Sammlung von Texten
Licht ein
Licht aus
Ton ein
Ton aus
dazu brauchst du noch eine Variable (in einem Register oder sonstwo),
die festlegt, welches der aktive Menüpunkt ist. Ich nenn sie mal actMenu
Am Anfang sein actMenu gleich 0
das heisst von den 4 Texten, ist der mit der 0-te der 'aktive'
als Konsequenz davon wird auf deinem 2-zeiligen LCD angezeigt
Licht ein
Licht aus
mehr Platz hast du nicht. Um die Texte anzuzeigen, hast du ja schon eine
Ausgabefunktion. Für den Anfang ist es für dich am einfachsten, wenn
alle Texte gleich lang sind (gegebenenfalls hinten mit Leerzeichen
auffüllen). Denn dann kannst du aus der Adresse des ersten Textes
ausrechnen, an welcher Stelle im Speicher der n-te Text anfängt. Und das
brauchst du, weildu ja bei einem Wert von 0 in ActMenu den 0-ten und den
1-ten Text anzeigen musst.
Jetzt kommt der Benutzer und drückt einmal runter
Als Folge davon wird actMenu um 1 erhöht und hat jetzt den Wert 1.
Es geht wieder in die Anzeigefunktion. Die sieht sich das actMenu an und
weiß daher, dass es jetzt in die 1. Zeile den Text mit der Nummer 1 und
in die 2te Zeile den Text mit der Nummer 2 ausgeben muss.
Also malt sie aufs LCD
Licht aus
Ton ein
Der Benutzer drückt wieder runter. actMenu wird wieder um 1 erhöht und
hat jetzt den Wert 2.
Das heisst für die Textausgabefunktion, dass sie von den vorhandenen
Texten
Licht ein ;0
Licht aus ;1
Ton ein ;2
Ton aus ;3
den mit der Nummer 2 (weil ja actMenu 2 ist) in die erste Zeile ausgeben
soll und in die 2. Zeile kommt der mit der Nummer 3. Wieder: mit der
Textnummer, der bekannten Startadresse des ersten Textes und der Länge
der Texte (die alle gleich sind) kann man ausrechnen, wo im Speicher der
Text mit der Nummer 3 anfängt. Und den kann man wiederrum ausgeben.
Auf dem LCD steht dann
Ton ein
Ton aus
Sinngemaß drückt jetzt der Benutzer die Taste rauf. actMenu wird um 1
vermindert und ist wieder 1. Die Funktion die basierend auf actMenu die
beiden Texte ausgeben soll, gibt daher
Licht aus
Ton ein
aus.
Für deinen Benutzer sieht es so aus, als ob das Menü mit jedem
Tastendruck um 1 Zeile durchscrollt.
Ok das mit der Tabelle habe ich drauf aber ich verstehs immer noch
nicht, wie sage ich der LCD jetzt dass das so sein muss...
Ich habe noch nie mit LCD gearbeitet und erst seit einem Semester mit
Mikrokontroller.
Wäre echt froh wenn mir jemand Schritt für Schritt erklären könnte wie
ich vorgehen muss
>dazu brauchst du noch eine Variable (in einem Register oder sonstwo),>Für den Anfang ist es für dich am einfachsten, wenn>alle Texte gleich lang sind (gegebenenfalls hinten mit Leerzeichen>auffüllen). Denn dann kannst du aus der Adresse des ersten Textes>ausrechnen, an welcher Stelle im Speicher der n-te Text anfängt. Und das>brauchst du, weildu ja bei einem Wert von 0 in ActMenu den 0-ten und den>1-ten Text anzeigen musst.
diese Zeilen versteh ich nicht, also wörtlich verteh ich sie schon aber
ich versteh nicht wie ich das realisieren soll
Willi schrieb:> Ok das mit der Tabelle habe ich drauf aber ich verstehs immer noch> nicht, wie sage ich der LCD jetzt dass das so sein muss...> Ich habe noch nie mit LCD gearbeitet und erst seit einem Semester mit> Mikrokontroller.
Du legst zuviel Augenmerk auf das LCD.
Die Situation eines Menüs wäre auch keine andere, wenn du es auf einem
PC im Textmodus auf dem Monitor ausgeben willst und nur 2 Anzeigezeilen
zur Verfügung hast.
Du hast eine Anzeigeeinheit, auf der du Text ausgeben kannst.
Punkt
Da musst du jetzt ein Menü draufpappen
Punkt
Ob das ein LCD ist, oder ein Monitor oder eine Laser-Projektionseinheit
oder .... spielt keine Rolle. Du hast 2 Anzeigezeilen und mit denen
musst du klarkommen.
Du kannst in eine AUsgabezeile einen Text schreiben.
Gut
Du kannst in die andere Ausgabezeile einen Text schreiben
Auch gut
Ein Menü besteht auch nur aus Texten, die zum richtigen Zeitpunkt in die
richtige Ausgabezeile geschrieben werden.
Du scheinst da in der Vorstellung zu leben, dass Menüs irgendwie etwas
besonderes wären. Nein! Das sind sie nicht.
Menüs sind (in deinem Fall) einfach nur: Aus einer Sammlung von mehreren
Texten, die zusammen das Menü bilden, werden 2 ausgewählt (weil du nicht
mehr Anzeigezeilen hast) die auf das LCD geschrieben werden. Und zwar
jeder Text für sich. Es ist dein Job als Programmierer dafür zu sorgen,
dass der jeweils richtige Text in der richtigen Ausgabezeile auftaucht.
Egal was der Benutzer macht.
Willi schrieb:>>dazu brauchst du noch eine Variable (in einem Register oder sonstwo),>>>Für den Anfang ist es für dich am einfachsten, wenn>>alle Texte gleich lang sind (gegebenenfalls hinten mit Leerzeichen>>auffüllen). Denn dann kannst du aus der Adresse des ersten Textes>>ausrechnen, an welcher Stelle im Speicher der n-te Text anfängt. Und das>>brauchst du, weildu ja bei einem Wert von 0 in ActMenu den 0-ten und den>>1-ten Text anzeigen musst.>>> diese Zeilen versteh ich nicht, also wörtlich verteh ich sie schon aber> ich versteh nicht wie ich das realisieren soll
Das sei dein Text. Er steht ab Adresse 200 im Speicher
MENUPUNKT1#MENU2#MEN9#Exit#
^ ^ ^ ^
| | | |
| | | +-- 222
| | +--- 216
| +--- 210
+--- 200
(# sei jeweils ein 0-Byte als Ende Kennung eines Textes)
Wenn alles was du hast
* die Startadresse der Texte, die hintereinander im Speicher stehen
* und die Textnummer ist
wo fängt dann der 3.te Text an? Du brauchst seine Startadresse, weil du
diese Adresse der Textausgabefunktion übergeben musst, damit die diesen
Text auf die Anzeige an eine bestimmte Stelle schreibt.
Und jetzt das ganze mit fixen Textlängen. Sagen wir 8 Zeichen pro Text
Wieder: die Texte fangen an der Adresse 200 im Speicher an
MENU1 #Exit #Status #Setup #
^ ^ ^ ^
| | | |
| | | +---- 224
| | +--- 216
| +--- 208
+--- 200
Wo fängt der dritte Text im Speicher an?
Da jeder Text 8 Zeichen lang ist, fängt der 3.te Text an der
Speicherposition (3-1) * 8 + 200 = 216 an.
Und der 4. Text? (4-1) * 8 + 200 = 224
Und der 2. Text? (2-1) * 8 + 200 = 208
Du kannst dir hier ausrechnen, wo genau im Speicher ein Text anfängt.
Alles was du brauchst ist die Textnummer und die Adresse an der der
erste Text steht. Alles andere kann dann davon errechnet werden.
Hast du denn keinen C-Compiler, der dir die ganzen lästigen Details
abnimmt, so dass du das alles in Assembler machen musst? Das kann ja
noch heiter werden mit deiner Alarmanlage, wenn es schon bei Textausgabe
scheitert.