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

Jak zdefiniować własne znaki na wyświetlaczu LCD HD44780?

14 Wrz 2005 11:20 5256 10
REKLAMA
  • #1 1816982
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #2 1817000
    mrq80
    Poziom 15  
    Posty: 57
    Pomógł: 15
    Witam,

    Możesz zdefiniowac do 8 własnych znaków. Zanki mają format 5x7.

    Do odszyfrowania najlepiej widać jak zapiszesz binarnie.
    Np. DB 32, 32, 14, 17,31, 16, 14 , 4, ;ę (10)

    32 00100000
    32 00100000
    14 00001110
    17 00010001
    31 00011111
    16 00010000
    14 00001110
    04 00000100

    Przy czym wyświetlane jest 5 najmłodszych bitów z każdego bajtu wiec tak naprawde zobaczysz:
    00000
    01110
    10001
    11111
    10000
    01110
    00100

    pozdrawim
    Marek
  • REKLAMA
  • #3 1821457
    zwirekimuchomorek
    Poziom 2  
    Posty: 2
    To chyba jednak nie takie proste bo ja jak zmienie jakąś liczbe np. pierwszą po db (32) to program się całkowicie sypie. Po co są te pierwsze wartości 32 podane w przykładzie?
    Więc jak to jest?
  • #4 1821586
    soft.sc
    Poziom 17  
    Posty: 142
    Pomógł: 15
    Ocena: 4
    Definicja 'ę' dla HD44780 powinna wyglądać tak:
    dec bin
    00 00000000
    14 00001110
    17 00010001
    31 00011111
    16 00010000
    14 00001110
    04 00000100
    00 00000000
    Ostatnia linia jest niewidoczna
  • REKLAMA
  • #5 1824442
    rezonator
    Poziom 10  
    Posty: 53
    Pomógł: 1
    Ocena: 1
    może to się wydawać takie proste ale np. nie można w tych definicjach użyć zera. Jeśli chce się uzyskać pustą linię to trzeba wpisać np 64, zauważył to ktoś poza mną? Rozumiem że jak się ma gotowe definicje czcionek to nikt się nie pofatyguje robić jakieś własne :P

    Mam pytanie czy te definicje czcionek można redefiniować w programie?
    chciałbym zbudować menu z dodatkami graficznymi i potrzebuję znacznie więcej własnych znaków niż 8.
  • #6 1824717
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    rezonator napisał:
    może to się wydawać takie proste ale np. nie można w tych definicjach użyć zera. Jeśli chce się uzyskać pustą linię to trzeba wpisać np 64, zauważył to ktoś poza mną?


    Ja zauważyłem. Pewnie używasz jakiegoś kawałka kodu znalezionego na necie?? Jest tam błąd, a wystarczy zmienić jeden znaczek... W funkcji definiującej tablicę jest zapisane:
     while (*ptr != 0)         
       {
          pisz_znak(*ptr);         
          ptr++;
       }

    co niby ma oznaczać czytanie kolejnych elementów tablicy ze znakami aż do napotkania końca. Tylko że jak jednym z elementów będzie 0 to pętla while się nie wykona. Ja po prostu robię zawsze o jedną komórkę więcej w tablicy ze znakami, wstawiam tam 0xff - taki znacznik końca tablicy, i modyfikuję warunek na
    while (*ptr != 0xff)
    . Tu krótki przykład takiej tablicy:
    char CGRam[9] = {0x08,0x0c,0x0e,0x0f,0x0e,0x0c,0x08,0x00,				//znak strzałki w prawo
    																			 0xff };		//znak końca tabeli
    I tyle.
  • REKLAMA
  • #7 1824789
    soft.sc
    Poziom 17  
    Posty: 142
    Pomógł: 15
    Ocena: 4
    Gdybyście użyli pętli for() wogóle nie byłoby problemu. Jak to niektórzy potrafią komplikować proste sprawy. Pozdrawiam.
  • #8 7071893
    luki05
    Poziom 11  
    Posty: 88
    Ocena: 4
    Witam. Odkopuję stary temat ponieważ przeczytałem już kilka i dalej nie mogę sobie poradzić ze zdefiniowaniem dowolnego znaku. Program piszę w C, oto jego freagment:

    void wyslij_do_lcd(char dolcd)							//funkcja wysyłania bajtu do wyświetlacza (zmienna dolcd znakowa)
    {
    SET_E;															// ustaw E na 1
    LCD = ((LCD & 0xF0) | (dolcd>>4 & 0x0F));          // przygotuj starszą cześć bajtu
    CLR_E;                                             // ustaw E na 0
    SET_E;                                             // ustaw E na 1
    LCD = ((LCD & 0xF0) | (dolcd & 0x0F));             // przygotuj młodszą cześć bajtu  ((LCD i 11110000) lub (dolcd i 00001111))
    CLR_E;                                             // ustaw E na 0
    waitms(2);                                         // czekaj 2 milisekundy
    }
    
    void wyslij_instrukcje(char dolcd)
    {
    CLR_RS;
    wyslij_do_lcd(dolcd);
    }
    
    void dolcd(char dolcd)
    {
    SET_RS;
    wyslij_do_lcd(dolcd);
    }
    
    void lcd(char *s)
    {
    while(*s) // do napotkania 0
      {
       dolcd(*s); // zapisz znak wskazywany przez s na LCD
      s++; // zwiększ s (przygotuj nastepny znak)
      }
    }
    
    void czysclcd(void)								//funkcja czyszczenia LCD
    {
    wyslij_instrukcje(0x01);
    }
    
    void lcdxy(unsigned char w, unsigned char k)
    {
    wyslij_instrukcje((w*0x40+k)|0x80);
    }
    
    void inicjacja_lcd(void)
    {
    waitms(15);
    CLR_E;
    CLR_RS;
    SET_E;
    wyslij_do_lcd(0x30);
    CLR_E;
    waitms(2);
    SET_E;
    CLR_E;
    waitms(2);
    SET_E;
    CLR_E;
    waitms(2);
    SET_E;
    wyslij_do_lcd(0x20);
    CLR_E;
    waitms(2);
    wyslij_instrukcje(0x28);
    waitms(2);
    wyslij_instrukcje(0x08);
    waitms(2);
    wyslij_instrukcje(0x01);
    waitms(2);
    wyslij_instrukcje(0x06);
    waitms(2);
    wyslij_instrukcje(0x0C);
    waitms(2);
    }
    
    
    void defznak()
    {
    wyslij_instrukcje(0x81);
    wyslij_instrukcje(0x40);
    dolcd(6);
    dolcd(9);
    dolcd(9);
    dolcd(6);
    dolcd(32);
    dolcd(32);
    dolcd(32);
    dolcd(32);
    wyslij_instrukcje(0x80);
    }
    
    ..................
    
    inicjacja_lcd();							// inicjalizacja LCD
    defznak();
    czysclcd();
    lcdxy(0,0);
    dolcd(0x81);
    lcd("cos");
    waitms(600);
    
    

    Niestety nie wyświetla mi zdefiniowanego znaku. W czym może być problem???
  • #9 7072149
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    luki05 napisał:
    Niestety nie wyświetla mi zdefiniowanego znaku...

    Kod ASCII Twojego świeżo zdefiniowanego znaku to 0x00, a nie 0x81.
    Przejrzyj dokumentację HD44780.
  • #10 7073012
    luki05
    Poziom 11  
    Posty: 88
    Ocena: 4
    Niestety przy 0x00 też nic nie wyświetla??? Zastanawia mnie czy procedura definiowania jest poprawna???
  • #11 7073082
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    luki05 napisał:
    Niestety przy 0x00 też nic nie wyświetla???

    Programowanie uC to niezwykle precyzyjne zajęcie, więc należy też precyzyjnie opisywać zachowanie programu.
    Co rozumiesz przez "Nic nie wyświetla" :?:
    W/g kodu, powinieneś zobaczyć na LCD chociaż jakieś "krzaki" na pierwszej pozycji LCD i napis "cos" od pozycji nr.2
    luki05 napisał:
    Zastanawia mnie czy procedura definiowania jest poprawna???

    Pierwsza i ostatnia linia - zbędne.

Podsumowanie tematu

✨ Dyskusja dotyczy definiowania własnych znaków na wyświetlaczu LCD sterowanym kontrolerem HD44780, który obsługuje znaki o rozmiarze matrycy 5x7 pikseli. Przedstawione kody znaków (DB) odpowiadają poszczególnym wierszom macierzy pikseli, gdzie do wyświetlenia używane są 5 najmłodszych bitów każdego bajtu. Wskazano, że definicje znaków muszą zawierać 8 bajtów, z zerowymi liniami na początku i końcu, które są niewidoczne na wyświetlaczu. Podkreślono, że w definicjach nie można używać wartości 0 jako zakończenia tablicy, co może powodować błędy w programie, dlatego sugerowano stosowanie innego znacznika końca, np. 0xFF, lub użycie pętli for zamiast while do iteracji po tablicy znaków. Poruszono także ograniczenie do 8 własnych znaków w pamięci CGRAM HD44780 oraz pytanie o możliwość rozszerzenia tej liczby. W przykładach kodu w języku C pokazano funkcje wysyłania danych i instrukcji do LCD, a także zwrócono uwagę na konieczność precyzyjnego definiowania i wywoływania znaków, aby poprawnie wyświetlały się na ekranie. Wskazano, że kod ASCII definiowanego znaku to 0x00, a nie inne wartości, co jest zgodne z dokumentacją HD44780.
Wygenerowane przez model językowy.
REKLAMA