-         

Ergebnis 1 bis 5 von 5

Thema: Frage zu Displayansteuerung von Microcontroller.net

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    32
    Beiträge
    199

    Frage zu Displayansteuerung von Microcontroller.net

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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:
    Code:
    // 
    // 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:
    Code:
    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:
    Code:
    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
    Habe Mut, dich deines eigenen Verstandes zu bedienen.

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    32
    Beiträge
    199
    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...
    Habe Mut, dich deines eigenen Verstandes zu bedienen.

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Man müsste sich dazu den Code ansehen der beim compilieren erzeugt wird. Es kann sein das man sich ein paar Befehle spart.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    32
    Beiträge
    199
    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
    Habe Mut, dich deines eigenen Verstandes zu bedienen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •