www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fragen zu Grundlagen AVR-GCC, LCD Ansteuerung


Autor: Schlaumacher.... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich steige gerade in C und AVR-GCC neu ein. Ich spiele gerade mit dem 
Tutorial mit der LCD Ansteuerung herum, mich würde eine Sache gerne 
interessieren, die mir noch nicht ganz schlüssig ist.

In dem Tutorial :
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

wird auf einen Programmabschnitt hingewiesen mit der Funktion 
"lcd_data()":
void lcd_data(unsigned char temp1)
{
   unsigned char temp2 = temp1;
 
   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
 
   temp1 = temp1 >> 4;
   temp1 = temp1 & 0x0F;
   LCD_PORT &= 0xF0;
   LCD_PORT |= temp1;               // setzen
   lcd_enable();
 
   temp2 = temp2 & 0x0F;
   LCD_PORT &= 0xF0;
   LCD_PORT |= temp2;               // setzen
   lcd_enable();
   
   _delay_us(42);
}

Dabei Frage ich mich was bei diesem Zeilenabschnitt genau gemacht wird:
temp1 = temp1 >> 4;
   temp1 = temp1 & 0x0F;
   LCD_PORT &= 0xF0;
   LCD_PORT |= temp1;               // setzen

So wie ich das verstanden habe wird das Byte temp1 von links nach rechts 
"ge-shifted" richtig ? Was passiert denn danach , wird dann auf temp1 
das untere Nibble auf 1111 gesetzt ? So wie ich das verstehe wird danach 
der selbe Befehl am LCD-Port ausgeführt nur mit dem oberen Nibble?

Am Ende wird das veränderte Byte am LCD ausgegeben. Wäre super wenn ihr 
mir beim Verständnis helfen könntet.

Gruß
Schlaumacher

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitmanipulation

Beispiel:
temp1 sei am Anfang 0b01101010

>    temp1 = temp1 >> 4;

temp1 nach temp1>>4:   0b00000110

>    temp1 = temp1 & 0x0F;

temp1 nach temp1 & 0x0F: 0b00000110

>    LCD_PORT &= 0xF0;

LCD_PORT sei am Anfang 0b01101010
LCD_PORT nach LCD_PORT &= 0xF0: 0b01100000

>    LCD_PORT |= temp1;

temp1 nach temp1 & 0x0F: 0b00000110
LCD_PORT nach LCD_PORT |= temp1: 0b01100110
                                   xxxxyyyy

xxxx = Bits 7..4 aus originalem LCD_PORT
yyyy = Bits 7..4 aus originalem temp1

Autor: Schlaumacher.... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke! Das Beispiel hilft unheimlich !

Autor: Schlaumacher.... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Frage hätte ich noch. Machen :
    temp1 = temp1 >> 4;
und
    temp1 = temp1 & 0x0F;

beide das selbe ?

denn es kommt bei beidem das selbe Ergebnis heraus !?

Autor: Schlaumacher.... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achneee das zweite sagt aus dass gelöscht wird !!!! :-)

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt habe ich mal eine frage zum gleichen thema und deshalb schreib ich 
es gleich in den selben thread. und zwar habe ich jetzt das lcd programm 
im avr-gcc genau unter die lupe genommen, kann aber nirgends finden, wo 
das programm für die textausgabe z.b. von einem buchstaben diesen in den 
dafür vorgesehenen ascii- zahlenwert umwandelt.

wenn ich jetzt zum beispiel im hauptprogramm lcd_data('T'); schreibe, 
muss das programm ja dem display den wert 84, also 1010100 über die 
datenausgänge übermitteln, damit dieser weiß welchen buchstaben er 
darstellen muss.

kann mir mal jemand sagen wo das im programm gemacht wird? das programm 
funktioniert ja, nur würde mich gerne interessieren wie man das genau 
macht.

mfg

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir in einer ASCII Tabelle mal den HEX Wert für 'T' an;)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'T' hat bereits den richtigen Wert, weil der gcc ASCII verwendet und 
dabei das T den Wert 84 hat.
Das LCD hat "zufällig" bei 84 auch ein T stehen.

Das funktioniert für die meisten Zeichen , aber z.B. nicht für Umlaute.

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Schau dir in einer ASCII Tabelle mal den HEX Wert für 'T' an;)

der hexwert ist 54. aber deswegen bin ich jetzt auch nicht schlauer wie 
vorher.

mfg

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hexadezimal 54 ist dezimal 84.
Oder binär 1010100.
Oder 'T' in ASCII.


Alles nur verschiedene Darstellungen für denselben Wert.

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube ihr versteht mein anliegen noch nicht ganz. was ich wissen 
will ist eigentlich wo in diesem programm ein buchstabe in den für die 
ascii tabelle nötigen zahlenwert umgewandelt wird.

mfg

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>was ich wissen
>will ist eigentlich wo in diesem programm ein buchstabe in den für die
>ascii tabelle nötigen zahlenwert umgewandelt wird.

Nirgends, der Compiler setzt den einfach ein weil er ihn kennt.

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Nirgends, der Compiler setzt den einfach ein weil er ihn kennt.

kann du das vielleicht noch ein bischengenauer erklären? endlich hat 
jemand meine frage verstanden^^

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich glaube ihr versteht mein anliegen noch nicht ganz.

Doch, aber du verstehst die Antworten nicht :-)

Wenn du im Quelltext lcd_data('T') schreibst, dann macht der
Compiler daraus einen Maschinencode, der lcd_data(84) oder
lcd_data(0x54) oder lcd_date(0b1010100) entspricht - das ist
alles ein und dasselbe.
Die Funktion lcd_data schiebt dann zur Laufzeit das Bitmuster
1010100 auf die Leitungen. Es werden 8 Bit übertragen, hinter
denen man sich das T denken kann, aber übertragen werden die 8 Bit.
Mit diesen 8 Bit geht das LCD in seinen Zeichengenerator und
findet dort die Pixel, die er hinmalt. Das sieht dann für dich wieder
aus wie ein T.

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke. jetzt hab ich es verstanden.

mfg

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Daß 'T' dasselbe ist wie 84, liegt halt daran, daß
der Compiler von einem ASCII-Zeichensatz ausgeht.

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.