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