logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Sterowanie wyświetlaczem LCD 2x16 na sterowniku HD44780

gamgee1 13 Lis 2009 16:12 1272 0
  • #1 7255199
    gamgee1
    Poziom 11  
    Posty: 63
    Ocena: 107
    Mam problem z programem do obsługi lcd. Napisałem całość i niby wszystko gra, program się kompiluje a na wyświetlaczu jest tylko podświetlenie. Dodam że sterowanie jest 8-bitowe bez odczytu flagi zajętości (R/W zwarty do masy, regulacja kontrastu również)

    
    #include <avr/io.h>
    #include<util/delay.h>
    
    #define LCD  PORTC
    
    
    #define SET_E   PORTD|=0x40   //ustawienie bitu 6 portu D pod któty podpięty jest Enable signal
    #define CLR_E   PORTD^=0x40   //wyzerowanie bitu 6 portu D pod któty podpięty jest Enable signal
    
    #define SET_RS  PORTD|=0x80   //ustawienie bitu 7 portu D pod któty podpięty jest Register select (wysoki stan na RS -> zapis danej)
    #define CLR_RS  PORTD^=0x80   //wyzerowanie bitu 7 portu D pod któty podpięty jest Register select (niski stan na RS -> zapis instrukcji)
    
    
    
    
    //-----------------------------------------wysłanie danych do LCD---------------------------------------------------
    void zapis_do_lcd(char x)
    {
    SET_E;   //ustawienie  E w stan wysoki
    LCD=x;   // wysłanie bajtu na port danych wyświetlacza
    CLR_E;   //ustawienie E w stan niski -> zapis do wyświetlacza
    _delay_ms(1); // opużnienie na zapamiętanie bajtu
    }
    
    //-------------------------------------------zapis instrukcji do LCD----------------------------------------------------
    void zapis_instrukcji(char x)
    {
    CLR_RS; // niski stan na RS odpowiada zapisowi instrukcji
    zapis_do_lcd(x); // zapis do LCD
    }
    
    //------------------------------------zapis danej do wyświetlacza LCD-------------------------------------------
    void zapis_danej(char x)
    {
    SET_RS; // wysoki stan na RS odpowiada zapisowi danej
    zapis_do_lcd(x); // zapis do LCD
    }
    
    
    //----------------------------------zapis tekstu do wyświetlacza LCD------------------------------------------
    void zapis_tekstu(char * s)
    {
    while(*s) // pętla trwa do napotkania 0
      {
      zapis_danej(*s); // zapisz znak wskazywany przez "s" na LCD
      s++; // zwiększ s (przygotuj nastepny znak)
      }
    }
    
    
    //----------------------------------inicjalizacja wyświetlacza LCD---------------------------------------------
    void lcd_inicjal(void)
    {
    char i;
    
    _delay_ms(15);// opuźnienie dla ustabilizowania się napięcia
    CLR_RS;
    CLR_E;
    
    for(i = 0; i < 3; i++) 
     {
     SET_E;
     LCD=0x30;
     CLR_E;
     _delay_ms(5);
    }
    
    
    zapis_instrukcji(0x38);   // interfejs 8-bity, 2-linie, znak 5x7
    zapis_instrukcji(0x0F);   //wyłączenie LCD, kursora i migania
    zapis_instrukcji(0x01);   // czyszczenie wyświetlacza
    zapis_instrukcji(0x06);   // kursor przesówa się w prawo
    }
    
    
    
    //----------------------------------program główny-----------------------------------------------------
    int main(void)
    {
    DDRC=0xff;
    DDRD=0xff;
    
    // inicjalizacja LCD
    lcd_inicjal();
    // zapisz na LCD przykładowy tekst
    zapis_tekstu("A");
    
    while(1);
    return 0;
    }


    Linia danych podłączona do portu C. Kto tu widzi jakiś błąd?

    Dodano po 12 [minuty]:

    Wziąłem przed chwilą miernik do ręki i na wyjściu portu rzeczywiście jest stan odpowiadający "dużej literze A". Więc wyświetlacz dostaje informację co ma wyświetlić ale tego nie robi.
    Może problem tkwi w konfiguracji?
REKLAMA