obsługa wyświetlacza LCD 2x16

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
ciscoc
-
Posty: 10
Rejestracja: 08 lis 2008, 22:59
Lokalizacja: wola

obsługa wyświetlacza LCD 2x16

Post autor: ciscoc » 18 sie 2013, 19:26

Witam,
czy ktoś jest wstanie podać przykład prostego wysłania znaku literki alfabetu na wyświetlacz np. litery W, albo dowolnego napisu np. WITAM! na wyświetlacz?

gdzie PB7 podłączone do DB7
gdzie PB6 podłączone do DB6
gdzie PB5 podłączone do DB5
gdzie PB4 podłączone do DB4
gdzie PB3 podłączone do EN
RW do 0V
RS do PB2

Awatar użytkownika
joon
Użytkownik
Posty: 2076
Rejestracja: 30 cze 2007, 22:56
Lokalizacja: Kraków, Przemyśl, Warszawa
Kontakt:

Post autor: joon » 18 sie 2013, 19:41

W jakim języku?

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 19 sie 2013, 7:27

W jakim języku?
Powinno być w jakim języku programowania ? ;).
Bo ci napiszą po Polskiemu, chce ą, ź, ę :).

ciscoc
-
Posty: 10
Rejestracja: 08 lis 2008, 22:59
Lokalizacja: wola

Post autor: ciscoc » 19 sie 2013, 7:59

W języku C, na AVR Atmega 32

Awatar użytkownika
Artyliusz
Użytkownik
Posty: 305
Rejestracja: 06 sty 2013, 14:10
Lokalizacja: Z Polski
Kontakt:

Post autor: Artyliusz » 20 sie 2013, 20:59

Zajmowałem się tym jakieś dwa miesiące temu.
Po pierwsze potrzebujesz jakiejś biblioteki jeśli jeszcze nie masz. Ja korzystałem z biblioteki Radzia, które można pobrać ze strony http://radzio.dxp.pl/hd44780/
Tam znajduje się też trochę teorii.
Opierając się o tę bibliotekę, którą musisz włączyć poprzez #include do swojego programu, możesz wysyłać znaki do LCD poprzez funkcję

Kod: Zaznacz cały

LCD_WriteText((char *)"Tekst");

Jednakże musisz wpierw w pliku nagłówkowym HD44780.h skonfigurować swoje wyprowadzenia. Reszta funkcji jest opisana w pliku HD44780.c tejże biblioteki.

Jakbyś był zainteresowany to też bardzo łatwo można tworzyć swoje znaki. ;)

Mimo pozoru taki LCD obsługuje się dość prosto. :)

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 20 sie 2013, 21:17

Artyliusz pisze:Mimo pozoru taki LCD obsługuje się dość prosto.
Dokładnie, chyba prościej już się nie da, oto przykład:

http://www.youtube.com/watch?v=tOLnAFhUVjw

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 20 sie 2013, 22:24

Artyliusz pisze:Po pierwsze potrzebujesz jakiejś biblioteki jeśli jeszcze nie masz.
Nie potrzeba biblioteki, bo to tak proste polecenia, że samemu w kilkanaście minut można to zrobić.

ciscoc
-
Posty: 10
Rejestracja: 08 lis 2008, 22:59
Lokalizacja: wola

Post autor: ciscoc » 23 sie 2013, 15:21

Witam, poprawiłem program
Ale nic nie wyświetla.
Panowie proszę o prześledzenie programu, kompilator nic nie krzyczy ładuje program do AVR i nic się nie dzieje gdzie może być błąd?

Kod: Zaznacz cały


    #include <avr/io.h>
    #define F_CPU 1000000
    #include <util/delay.h>



    #define DDR_DB4 DDRB
    #define PORT_DB4 PORTB
    #define DB4 PB4

    #define DDR_DB5 DDRB
    #define PORT_DB5 PORTB
    #define DB5 PB5

    #define DDR_DB6 DDRB
    #define PORT_DB6 PORTB
    #define DB6 PB6

    #define DDR_DB7 DDRB
    #define PORT_DB7 PORTB
    #define DB7 PB7

    #define DDR_RS DDRB
    #define PORT_RS PORTB
    #define RS PB2

    #define DDR_EN DDRB
    #define PORT_EN PORTB
    #define EN PB3


    #define SET_DB4 PORT_DB4|=_BV(DB4)
    #define CLR_DB4 PORT_DB4&=~(_BV(DB4))

    #define SET_DB5 PORT_DB5|=_BV(DB5)
    #define CLR_DB5 PORT_DB5&=~(_BV(DB5))

    #define SET_DB6 PORT_DB6|=_BV(DB6)
    #define CLR_DB6 PORT_DB6&=~(_BV(DB6))

    #define SET_DB7 PORT_DB7|=_BV(DB7)
    #define CLR_DB7 PORT_DB7&=~(_BV(DB7))

    #define SET_RS PORT_RS|=_BV(RS)
    #define CLR_RS PORT_RS&=~(_BV(RS))

    #define SET_EN PORT_EN|=_BV(EN)
    #define CLR_EN PORT_EN&=~(_BV(EN))


    void set_half_byte(char x);
    void write_to_LCD(char x);
    void write_command(char x);
    void write_char(char x);
    void write_text(char*s);
    //void LCDxy(char x, char y);
    void clear_LCD (void);
    void init_LCD(void);


    int main (void)

    {
    char *s= "W";

    init_LCD();
    write_text(s);
    for(;;)
    return 0;
    } 

    void set_half_byte(char x)
    {
    if (x & _BV(0)) SET_DB4;
    else CLR_DB4;

    if (x & _BV(1)) SET_DB5;
    else CLR_DB5;

    if (x & _BV(2)) SET_DB6;
    else CLR_DB6;

    if (x & _BV(3)) SET_DB7;
    else CLR_DB7;
    }


    void write_to_LCD(char x)
    {
    SET_EN;
    set_half_byte (x>>4);
    CLR_EN;

    SET_EN;
    set_half_byte(x);
    CLR_EN;
    _delay_ms(1);

    }

    void write_command(char x)
    {
    CLR_RS;                     
    write_to_LCD(x);           
    }


    void write_char(char x)
    {
    SET_RS;                       
    write_to_LCD(x);           
    }


    void write_text(char * s)
    {
    while(*s)     
      {
      write_char(*s); 
      s++;   
               
      }
    }


    void LCDxy(char x,char y)
    {
       unsigned char com=0x80;
       com|=(x|(y<<6));
       write_command(com);
    }



    void clear_LCD (void)
    {
        write_command(0x01);
    }


    void init_LCD(void)
    {
    DDR_DB4 |= _BV(DB4);     
    DDR_DB5 |= _BV(DB5);    
    DDR_DB6 |= _BV(DB6);     
    DDR_DB7 |= _BV(DB7);     
    DDR_EN|= _BV(EN);       
    DDR_RS |= _BV(RS);       
                             
                             
                           
    _delay_ms(20);           
    CLR_EN;                 
    CLR_RS;                       

    char i;       
    for (i=0;i<3;i++)         
                           
      {
      SET_EN;                   
      set_half_byte(0x03);     
      CLR_EN;                 
      _delay_ms(5);         
      }

    SET_EN;                   
    set_half_byte(0x02);       
    CLR_EN;                 
    _delay_ms(1);         
                                                                                                                             
    write_command(0x28);   
    write_command(0x08);   
    write_command(0x01);   
    write_command(0x06);   
    write_command(0x0C);   

    }


Awatar użytkownika
Artyliusz
Użytkownik
Posty: 305
Rejestracja: 06 sty 2013, 14:10
Lokalizacja: Z Polski
Kontakt:

Post autor: Artyliusz » 23 sie 2013, 15:46

Po pierwsze: to jakiś zlepek kodu? Zazwyczaj z takiego czegoś nic sensownego nie wychodzi. Wkleiłeś część jakiejś biblioteki czy sam pisałeś ją?

Na pierwszy rzut oka jakoś to tak sensu nie ma.

ciscoc
-
Posty: 10
Rejestracja: 08 lis 2008, 22:59
Lokalizacja: wola

Post autor: ciscoc » 23 sie 2013, 17:50

pisałem to na podstawie dokumentacji ze strony dzio.dxp.pl
Możesz pomóc w tej kwestii, gdzie popełniam błąd?

Awatar użytkownika
Artyliusz
Użytkownik
Posty: 305
Rejestracja: 06 sty 2013, 14:10
Lokalizacja: Z Polski
Kontakt:

Post autor: Artyliusz » 23 sie 2013, 19:48

Mogłeś chociaż opatrzyć to komentarzem.

Może najpierw ściągnij z jego strony, a dokładnie z tego linku to http://radzio.dxp.pl/hd44780/hd44780_4bit_norw.zip i zobacz jak to jest zrobione. Albo w ogóle z Radzia biblioteki skorzystaj. Musisz tylko popodstawiać swoje porty i załączyć pliki do pliku programu głównego. Wtedy będzie bardziej też przejrzyste.

ODPOWIEDZ