mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage AVR-GCC-Tutorial => lcd-routines.c


Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich (Anfänger) gehe gerade das o.g. Tutorial durch und habe eine 
Verständnisfrage. Funktionieren wird der Code wohl, sonst stünde er hier 
ja nicht, also verzweifle ich gerade mit meinem C-Büchlein. Also:
// Pinbelegung für das LCD, an verwendete Pins anpassen
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_RS        PD4
#define LCD_EN        PD5
// DB4 bis DB7 des LCD sind mit PD0 bis PD3 des AVR verbunden 
// sendet ein Datenbyte an das LCD
 
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);
}

temp1 = temp1 >> 4;
Soweit klar: Soll ein unsigned char um 4 Stellen nach rechts shiften; 
dadurch kommen von links Nullen nach und das höherwertige Nibble 
befindet sich nun im niederwertigen Nibble, da PD0 bis PD3 im 
höherwertigen Nibble DB4 bis PD7 des LCD entsprechen und zuerst 
übertragen werden.

temp1 = temp1 & 0x0F;
Verstehe ich inhaltlich schon nicht mehr, denn nach meinem bisherigen 
Verständnis kann sich der Inhalt von temp1 dadurch überhaupt nicht 
verändern (höherwertiges Nibble ist ja schon Null und niederwertiges 
Nibble wird mit 1111 verUNDet; ergibt das, was vorher schon im 
niederwertigen Nibble da war).

LCD_PORT &= 0xF0;
Hier wird DB0 bis DB3 auf Null gesetzt. Warum? Mit dem nächsten Befehl

LCD_PORT |= temp1;
wird doch sowieso das ins Register geschrieben, was in temp1 steht?

Und hier hör ich lieber auf, denn wenn ich 2 Schritte hintereinander 
schon nicht verstehe, frage ich lieber nach.

Danke und Gruß
Lutz

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stelle 1:

> temp1 = temp1 >> 4;
> ...
> temp1 = temp1 & 0x0F;
> ...

Schritt 2 könnte man an der Stelle weglassen. Mag sein, dass das ein 
Rest von der Ururversion ist. Die Zeile "schadet" aber auch nicht.

Stelle 2:

> LCD_PORT &= 0xF0;
> Hier wird DB0 bis DB3 auf Null gesetzt. Warum? Mit dem nächsten Befehl
>
> LCD_PORT |= temp1;
> wird doch sowieso das ins Register geschrieben, was in temp1 steht?

"Durch das ODER (|) werden nur die 1-en aus temp1 nach LCD_PORT 
gschrieben".

Nimm Papier und Bleistift und rechne ab Stelle 2 mit den Anfangswerten

LCD_PORT = 0x81;
temp1 = 0x82;

durch und lasse dann die Anweisung

LCD_PORT &= 0xF0;

mal weg...

Weitere Lektüre: Bitmanipulation

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Autsch! Die 1 von 0x81 bleibt beim verODERn stehen und wird 
"durchgereicht". Mit LCD_PORT &= 0xF0; wird das niederwertige Nibble 
vorher "gereinigt".
=> Kapiert.

Vielen Dank.

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.