Fragen zu Grundlagen AVR-GCC, LCD Ansteuerung

Gast #1478900
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
Persönliche Seite #1479003
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
Gast #1857888
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
Gast #1857907
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.
#1857911
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren