PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu Displayansteuerung von Microcontroller.net



Spongebob85
21.01.2008, 12:24
Moin!!!
Ich habe zur ansteuerung von meinem Display den code aus dem Tutorial von Microcontroller.net genommen. Es funktioniert auch alles, aber ich hab da mal ne frage zum Code. Ich wollte mal der Funktionsweise auf den Grund gehen, und hab also in der main-Funktion angefangen. Da steht:


//
// Anpassungen im makefile:
// ATMega8 => MCU=atmega8 im makefile einstellen
// lcd-routines.c in SRC = ... Zeile anhängen
//
#include <avr/io.h>
#include "lcd-routines.h"

int main(void)
{
lcd_init();

lcd_data('T');
lcd_data('e');
lcd_data('s');
lcd_data('t');

set_cursor(0,2);

lcd_string("Hello World!");

while(1)
{
}

return 0;
}


Dann hab ich erstmal gekuckt wie "lcd_init" funktioniert.
diese Funktion sieht so aus:


void lcd_init(void)
{
LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN); // Port auf Ausgang schalten

// muss 3mal hintereinander gesendet werden zur Initialisierung

_delay_ms(15);
LCD_PORT &= 0xF0;
LCD_PORT |= 0x03;
LCD_PORT &= ~(1<<LCD_RS); // RS auf 0
lcd_enable();

_delay_ms(5);
lcd_enable();

_delay_ms(1);
lcd_enable();
_delay_ms(1);

// 4 Bit Modus aktivieren
LCD_PORT &= 0xF0;
LCD_PORT |= 0x02;
lcd_enable();
_delay_ms(1);

// 4Bit / 2 Zeilen / 5x7
lcd_command(0x28);

// Display ein / Cursor aus / kein Blinken
lcd_command(0x0C);

// inkrement / kein Scrollen
lcd_command(0x06);

lcd_clear();
}

Die erste Zeile ist klar. Da werden die nötigen Pins als Ausgang gesetzt.
Dann kommt eine Wartezeit von 15ms. Warum weiß ich auch nicht so genau, aber das ist nicht meine hauptsächliche Frage. Meine Frage stellt sich mir in der nächsten Zeile. Da steht:


LCD_PORT &= 0xF0;

Zu diesem Zeitpunkt ist doch vom LCD_PORT kein bit high. Wenn man das jetzt Bitweise "Und-Verknüpft" dürfte doch eigentlich nichts passieren, oder? Dann wäre diese Zeile aber doch sinnlos.
Kann mir da jemand helfen?

MfG Jan

Hubert.G
21.01.2008, 13:12
Zu den 15ms, während dem init kann kein busy abgefragt werden, daher sind die Wartezeiten einzuhalten.
Das andere ist eine Sicherheitslöschung damit garantiert nichts anderes drinnen steht. Schau dir zum Vergleich auch den Assembler Code an.

Spongebob85
21.01.2008, 13:30
Das andere ist eine Sicherheitslöschung damit garantiert nichts anderes drinnen steht.

Warum nichts anderes. wenn noch nichts gesetzt ist würde doch dann gar nichts drinn stehen. F0 spricht ja die Pins4-7 an, da ist ja im Beispiel "RS" und "E" drauf geschaltet. Macht man das dann, weil diese Ausgänge in dem moment "egal" sind? Man könnte doch genau so gut "LCD_PORT = 0x00;" schreiben, oder?


Schau dir zum Vergleich auch den Assembler Code an.

Mit Assembler hab ich leider noch nie was gemacht...

Hubert.G
21.01.2008, 14:03
Man müsste sich dazu den Code ansehen der beim compilieren erzeugt wird. Es kann sein das man sich ein paar Befehle spart.

Spongebob85
21.01.2008, 20:14
Hab das jetzt mal so umgeschrieben... also LCD_PORT = 0x00; statt LCD_PORT &= 0xf0. Es klappt trotzdem. Verstehe immer noch nicht wirklich, warum die das mit 0x0f geschrieben haben.

Naja,
MfG Jan