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


von Schlaumacher.... (Gast)


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-Tutorial/LCD-Ansteuerung

wird auf einen Programmabschnitt hingewiesen mit der Funktion 
"lcd_data()":
1
void lcd_data(unsigned char temp1)
2
{
3
   unsigned char temp2 = temp1;
4
 
5
   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
6
 
7
   temp1 = temp1 >> 4;
8
   temp1 = temp1 & 0x0F;
9
   LCD_PORT &= 0xF0;
10
   LCD_PORT |= temp1;               // setzen
11
   lcd_enable();
12
 
13
   temp2 = temp2 & 0x0F;
14
   LCD_PORT &= 0xF0;
15
   LCD_PORT |= temp2;               // setzen
16
   lcd_enable();
17
   
18
   _delay_us(42);
19
}

Dabei Frage ich mich was bei diesem Zeilenabschnitt genau gemacht wird:
1
temp1 = temp1 >> 4;
2
   temp1 = temp1 & 0x0F;
3
   LCD_PORT &= 0xF0;
4
   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

von Stefan B. (stefan) Benutzerseite


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

von Schlaumacher.... (Gast)


Lesenswert?

Danke! Das Beispiel hilft unheimlich !

von Schlaumacher.... (Gast)


Lesenswert?

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

beide das selbe ?

denn es kommt bei beidem das selbe Ergebnis heraus !?

von Schlaumacher.... (Gast)


Lesenswert?

achneee das zweite sagt aus dass gelöscht wird !!!! :-)

von andi (Gast)


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

von holger (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


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.

von andi (Gast)


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

von Klaus W. (mfgkw)


Lesenswert?

Hexadezimal 54 ist dezimal 84.
Oder binär 1010100.
Oder 'T' in ASCII.


Alles nur verschiedene Darstellungen für denselben Wert.

von andi (Gast)


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

von holger (Gast)


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.

von andi (Gast)


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^^

von Klaus W. (mfgkw)


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.

von andi (Gast)


Lesenswert?

ok danke. jetzt hab ich es verstanden.

mfg

von Klaus W. (mfgkw)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.