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

LCD 2x16 Hitech HMC16225 – tryb 4-bitowy, regulacja kontrastu, opinie o zakupie

macias21 10 Kwi 2005 13:31 4372 19
REKLAMA
  • #1 1392231
    macias21
    Poziom 14  
    Posty: 147
    Pomógł: 10
    Ocena: 2
    Witam serdecznie!



    Mam takie pytanko.Czy watro kupic ten wyswietlacz :
    LCD 2x16 Hitech HMC16225:

    http://www.allegro.pl/show_item.php?item=47327992

    Czy bedzie problem z kontrastem i ewentualnie jak to wykonac?
    Czy moze pracowac w trybie 4bitowym??

    Dziekuje z gory i POZDRAWIAM!
  • REKLAMA
  • #2 1392257
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    Niby chip jest odpowiednikiem HD44780, czyli sterowanie 4 bitowe powinno pójść bez problemu. Kontrast też standardowo się ustawia przy pomocy potencjometru..
  • REKLAMA
  • #3 1392553
    marcinkwa
    Poziom 14  
    Posty: 164
    Pomógł: 5
    Wszystko na nim działa poprawnie.

    Ja miłem problem z fizycznym podłączeniem go uC.
    Bardzo małe odległości między wyprowadzeniami.

    Teraz sprzedawca dodaje złącze, więc jest OK.

    Pozdr.
    -=MarciN=-
  • REKLAMA
  • #4 1392584
    gszyszka
    Poziom 12  
    Posty: 30
    Pomógł: 2
    Mam taki sam, prawie wszystko działa bez problemu(nie działa mi podświetlenie, ale to moja wina bo podłączyłem napięci bez opornika i najprawdopodobniej spaliłem)

    Jeżeli chodzi o inicjalizację to wykonałem ją według tego pdfa
    http://www.pai.net.pl/lcd/chipsets/KS0066U.PDF trochę się różni od standardowej dla HD44780
    ładnie wyświetla w trybie 4-bitowym, żadnych problemów z kontrastem nie ma - regulacja na potencjometrze 5k
  • #5 1392721
    macias21
    Poziom 14  
    Posty: 147
    Pomógł: 10
    Ocena: 2
    Dziekuje za podpowiedzi.Zamowilem taki wyswietlacz:-).Jesli mozecie jeszcze podrzucic jakis schemacik podlaczenia go do uC i jakies przyklady najlepiej w C to byloby wspaniale :-)!


    DZIEKUJE Z GORY i POZDRAWIAM:-)!
  • #6 1392994
    gszyszka
    Poziom 12  
    Posty: 30
    Pomógł: 2
    Schemat wyprowadzen wyswietlacza(tu podpiety pod LPT)
    http://helium.webz.cz/hw/ilustrace/lpt_lcd_schema.gif
    Do wypisywania wystarczy podpiac 6 lini:
    5 - RS
    6 - ENABLE
    11- D4
    12- D5
    13- D6
    14- D7
    U mnie na ATmega32, ze względu na brak miejsca LCD podpięty jest tak:
    RS - PB1
    ENABLE - PB3
    D4 - PC2
    D5 - PC3
    D6 - PC4
    D7 - PC5

    Tu są przykładowe podstawowe procedury obsługi wyświetlacza
    wszytkie czasy sa troszke zawyżone, ale działa

    
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/pgmspace.h>
    
    #define D7_ON sbi(DDRC, PC5);sbi(PORTC, PC5);
    #define D7_OFF sbi(DDRC, PC5);cbi(PORTC, PC5);
    
    #define D6_ON sbi(DDRC, PC4);sbi(PORTC, PC4);
    #define D6_OFF sbi(DDRC, PC4);cbi(PORTC, PC4);
    
    #define D5_ON sbi(DDRC, PC3);sbi(PORTC, PC3);
    #define D5_OFF sbi(DDRC, PC3);cbi(PORTC, PC3);
    
    #define D4_ON sbi(DDRC, PC2);sbi(PORTC, PC2);
    #define D4_OFF sbi(DDRC, PC2);cbi(PORTC, PC2);
    
    #define EN_ON sbi(DDRB, PB3);sbi(PORTB, PB3);
    #define EN_OFF sbi(DDRB, PB3);cbi(PORTB, PB3);
    
    #define RS_ON sbi(DDRB, PB1);sbi(PORTB, PB1);
    #define RS_OFF sbi(DDRB, PB1);cbi(PORTB, PB1);
    
    unsigned char *wiersz=0;
    unsigned char *kolumna=0;
    
    void PiszInstLCD(char instr){
    	int temp = 0x3C;	//piny portu C odpowiadajace linia danych
    	char temporary = instr;
    	//wysylam starsza czesc bajtu
    
    	RS_OFF;
    	PORTC = (temporary >> 2) & temp;
    	EN_ON;
    	delay(10);
    	EN_OFF;
    	delay(100);
    	
    	//wysylam mlodsza czesc bajtu
    	RS_OFF;
    	PORTC = (instr << 2) & temp;
    	EN_ON;
    	delay(10);
    	EN_OFF;
    	delay(100);	
    }
    
    void PiszDanaLCD(char dana){
    	int temp = 0x3C;	//piny portu C odpowiadajace linia danych PC2-PC4
    	char temporary = dana;
    	//wysylam starsza czesc bajtu
    	EN_ON;
    	RS_ON;
    	PORTC = (temporary >> 2) & temp;
    	PORTC = (temporary >> 2) & temp;
    	delay(1);
    	EN_OFF;
    	delay(100);
    	
    	//wysylam mlodsza czesc bajtu
    	EN_ON;
    	RS_ON;
    	PORTC = (dana << 2) & temp;
    	PORTC = (dana << 2) & temp;
    	delay(1);
    	EN_OFF;
    	delay(100);	
    }
    
    void czyscLCD(){
    	PiszInstLCD(0x01);
    	delayms(2);
    }
    
    
    void LCDXY(int x, int y){
     PiszInstLCD((x*0x40+y)|0x80);  //standardowy rozkaz sterownika LCD
                                 //ustawiający kursor w określonych współrzędnych
    
    }
    
    
    void LCD_INIT(){
    	// wylaczam piny JTAGa PC2-PC5 - normalnie niedostepne - dotyczy tylko portu C
    	MCUCSR |= 0x80;
    	MCUCSR |= 0x80; 
    
    	//ustawienie portow jako wyjsciowe
    	DDRB = 0xFF;
    	DDRC = 0xFF;
    
    
    	//czyscimy porty
    	PORTB = 0x00;
    	PORTC = 0x00;
    	
    	//czekamy az ustali sie napiecie - wszystkie czasy sa zawyzone tu ok 100ms
    	delayms(100);
    	
    	//Function Set
    	//1
    	D5_ON;
    	EN_ON;
    	delay(10);// to z pewnoscia moze byc duzo krotsze, tu 10us
    	EN_OFF;
    	delay(5);
    	PORTC = 0x00;
    	
    	//2
    	D5_ON;
    	EN_ON;
    	delay(10);
    	EN_OFF;
    	delay(5);
    	PORTC = 0x00;
    	
    	//3
    	D7_ON;// 2 line
    	D6_ON;// display ON
    	EN_ON;
    	delay(10);
    	EN_OFF;
    	delay(5);
    	PORTC = 0x00;
    
    	delayms(2);// more than 39us
    	
    	//Display ON/OFF Controll
    	PiszInstLCD(0x08); //display off, cursor off, blink off
    	delayms(2);// more than 39us	
    	
    	// Display Clear
    	PiszInstLCD(0x01);
    	delayms(5);// more than 1.53ms
    	
    	//Entry mode set
    	PiszInstLCD(0x06); //increment, shift off,
    	delayms(2);
    }
    
    void PiszTekstLCD(char *tekst)  		//pisz tekst na LCD wskazywany pointerem *tekst
    {
     char zn;
     char nr=0;
    
     while(1){
    	zn=PRG_RDB(&tekst[nr++]);  		//pobranie znaku z pamięci programu
    	if(zn!=0){                  		//czy nie ma końca tekstu?
    		if(zn=="\n"){               	//czy znak nowej linii
    			wiersz==1?wiersz=0:++wiersz;//przejdź do nowej linii
    			kolumna=0;
    			LCDXY((int)wiersz,(int)kolumna);   	//ustaw obowiązujące po zmianie współrzędne na LCD
    		}else{
    			PiszDanaLCD(zn);            //umieść pojedynczy znak tekstu na LCD
    		}
    	}else{
    		break;                    		//zakończ pętlę, jeśli koniec tekstu
    	}
     }
    }
    
    
    
    int main(){
    	char *tekst1=PSTR("HELLO WORLD");
    	char *tekst2=PSTR("www.elektroda.pl");
    	
    	LCD_INIT();
    	delayms(5);
    	PiszInstLCD(0x0C);// display  ON, cursor ON, Blink OFF
    	delayms(2);
    	LCDXY(0, 0);
    	PiszTekstLCD(tekst1);
    	LCDXY(1,0);
    	PiszTekstLCD(tekst2);
    
    
    return 0;
    }
    
  • #7 1404778
    macias21
    Poziom 14  
    Posty: 147
    Pomógł: 10
    Ocena: 2
    Witam SERDECZNIE!

    Dziekuje za dotychczasowa pomoc :-). Wyswietlacze wreszcie dotarly i biore sie powoli za ich zmontowanie. Jeden do AT89S52 a drugi pod LPT. Zaczne od uC.
    Mam kilka watpliwosci ;-)a mianowicie: chcialbym podlaczyc wyswietlacz do portu P0 uC ( TRYB 4-bitowy) i przeczytalem gdzies ze trzeba zastosowac rezystorki podciagajace do Vcc (czy podlacza sie je w ten sposob przedstawiony przeze mnie na rysuneczku??, jakie wartosci tych reskow ja zastosowalbym 620 ohm? ). Czy sam schemat podlaczena uC i LCD jest prawidlowy?? Gszyszka napisal ze kozysta z 4-bitowego intergejsu i wykorzystuje linie danych D4, D5, D6, D7 i linie sterujace RS oraz ENABLE,a CO Z LINIA RW-czy jest konieczna??
    Jeszcze jedno pytanko odnoscnie wartosi potencjometru-ja mam w domu 4,7K oraz 10K-ktory z nich zastosowac do regulacji kontrastu??
    Zapomnialbym ;-) czy dac potencjometr lub rezystorek na zasilanie podswietlenia??

    DZIEKUJE Z GORY ZA WSZYSTKIE PODPOWIEDZI:-)!

    POZDRAWIAM MACIEK!
  • #8 1404838
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    1. Rezystory podciągające <4,7k nie mają zastosowania na krótkich liniach, a wręcz niepotrzebnie obciążą procesor. Wystarczy, jeżeli to konieczne po 10k. Mam w tej chwili LCD 16*4 i ma on wlutowane już rezystorki SMD oznaczone "472" co oznacza 47*10^2Ω, czyli 4,7 kΩ. Skąd się wzięła u Ciebie ta wartość 620Ω ?
    2. Procesorek sam w sobie ma wbudowane podciągnięcie i wynika to z jego konstrukcji.
    Pozdrawiam, Daniel
  • #9 1404929
    macias21
    Poziom 14  
    Posty: 147
    Pomógł: 10
    Ocena: 2
    Sorrki ze komplikuje;-).Muj wyswietlacz tez ma juz wbudowane takie reski...
    Ale mam jeszcze pytanko odnosnie sygnalu R/W...czy jest on niezbedny?
  • #10 1404955
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Jak nie planujesz nic czytac z wyświetlacza (np. flagę zajętości), to możesz podpiąć ją do GND.
    Szerzej o sterowaniu LCD tutaj.
    Light'I
  • #11 1405029
    macias21
    Poziom 14  
    Posty: 147
    Pomógł: 10
    Ocena: 2
    Ok.

    Prosze jeszcze spojrzec czy to ma byc tak. Chce zrobic taka przejscioweczke na plytce.Do wyswietlacza dostalem zlacze ZIF wiec wydaje mi sie ze tak bylo by profesjonalniej;-). Dolozylem potencjometr na zasilaniu podswietlenia bo jeden z kolegow pisal ze podlaczajac bez reska uwalil podswietlenie. Przejscioweczka ma byc "uniwersalan" tzn mozliwosc pracy w trybie 8-bitowym i 4-bitowym.
  • #12 1405079
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    macias21 napisał:
    [..]Dolozylem potencjometr na zasilaniu podswietlenia bo jeden z kolegow pisal ze podlaczajac bez reska uwalil podswietlenie. Przejscioweczka ma byc "uniwersalan" tzn mozliwosc pracy w trybie 8-bitowym i 4-bitowym.

    Ja stosuję do podświetlenia rezystor 10Ω. Potencjometr się tu nie nadaje - ma zbyt niską moc nominalną i za dużą rezystancję. Podświetlenie to nic innego jak równolegle połaczone kilkanaście diod LED, chyba że producent zastosował jakieś szczególne.
    Co do potencjometru regulacji kontrastu, to od strony zasilania proponuję dołożyć rezystor 1kΩ, bedzie mniejsze ryzyko zniszczenia układu (zajrzyj do dokumentacji producenta w tabelkę parametrów, a się dowiesz dlaczego).
    Pozdrawiam, Light'I
  • REKLAMA
  • #13 1405181
    macias21
    Poziom 14  
    Posty: 147
    Pomógł: 10
    Ocena: 2
    Znalazlem notke do tych wyswietlaczy i producent zaleca zastosowanie potencjometru 10k lub 20k.Ja w domu mam 10k ale jeszcze dorzuce rezystorek 5k na zasilanie tak dla bezpieczenstwa. A na podswietlenie ma byc 10 ohm czy 10K ohm.Sorrki za takie lamerskie pytania ale nie chcialbym nic uwalic ;-).
  • #14 1405210
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Staram się pisać zrozumiałym językiem, z zachowaniem zasad interpunkcji i ortografi, często poprawiając przyciskiem "Zmień". Tak więc to co napisałem jest OK. ;) Większą rezystancją nic nie uszkodzisz w podświetleniu, nie bedzie tylko świecić. Tak na marginesie do mojego ostatniego postu, większość tabelek podaje nie wartość napięcia kontrastu tylko jego różnicę z napięciem zasilania (Vdd-Vo), podając wartości maksymalne i minimalne (które niedoświadczeni ludzie przekraczają, kręcąc potencjometrem w te i we w te).
    P.S. Znak "Ω" jest dostepny po lewej stronie pola edycyjnego, gdy naciśniesz "zmień" lub "odpowiedz".
    Ufff... no to był mój post numer 1000, od dziś jestem specjalista, idę to poświętować... ;)
    Pozdrawiam, Daniel.
  • #15 1405813
    gszyszka
    Poziom 12  
    Posty: 30
    Pomógł: 2
    Dla wyczerpania tematu dopisze jeszcze, że lini nieużywane tzn. D0-D3 oraz RW (jeżeli nie używasz) nie powinno się pozostawiać "w powietrzu", najlepiej zewrzeć je do masy
  • #16 1405842
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    gszyszka napisał:
    Dla wyczerpania tematu dopisze jeszcze, że lini nieużywane tzn. D0-D3 oraz RW (jeżeli nie używasz) nie powinno się pozostawiać "w powietrzu", najlepiej zewrzeć je do masy
    Co do $$R/\overline{W}$$ to się zgodzę, bo stan tego wejścia musi być ustalony, aby można było pisać lub czytać... Po czym jednak szanowny kolega wnosi, że dotyczy to nieużywanych bitów danych w trybie 4bit ? Podania ludowe, czy jakaś dokumentacja ? Pytam, bo u mnie działa obojętnie, czy podłączę te D0-D3 do masy, czy też nie... Po co są te linie w LCD wewnętrzne podciągnięte do Vdd ? ;)
    Pozdrawiam, Light'I
  • #17 1405911
    gszyszka
    Poziom 12  
    Posty: 30
    Pomógł: 2
    Nie przecze że działa ale to nie moje wymysły po prostu przeczytałem to gdzieś na elektrodzie, a tak swoją drogą to nie wszystkie wyświetlacze mają tę samą budowę i czasem takie szczegóły decydują o powodzeniu bądź niepowodzeniu :)
    pozdrawiam
  • #18 1428488
    macias21
    Poziom 14  
    Posty: 147
    Pomógł: 10
    Ocena: 2
    Witam!

    Nie chcialem tworzyc nowego tematu wiec pisze w tym. Wyswietlaczy hitech nie udalo mi sie uruchomic(tzn chwilke zadzoialala druga linia ale pozniej wszystko zniklo i juz nic nie da sie zrobic.)Kupilem inny wyswietlacz 2x16 oznaczony SVM1602B. Podpiolem go do AT89S52 w trybie 4bitowym wedlug tej rozpiski :
    /*

    LCD uC

    DB4 = P0.0
    DB5 = P0.1
    DB6 = P0.2
    DB7 = P0.3
    D/~C (RS) = P0.4
    R/~W = P0.5
    E = P0.6
    */

    Wyswietlacz ma zaczerniona druga linie wiec kontrast jest ok.
    Przepisalem taki programik z ksiazki "Programowanie uC rodziny 8x51 w jezyku C". Program kompilowalem KEILEM i nie bylo zadnych errorow i warningow. Zapodalem do uC i nic...tzn caly czas zaczerniona jest druga linia :-( .

    Oto programik:


    /*

    LCD uC


    DB4 = P0.0
    DB5 = P0.1
    DB6 = P0.2
    DB7 = P0.3
    D/~C (RS) = P0.4
    R/~W = P0.5
    E = P0.6

    */


    //********************************************

    #include <REG52.H> // definicja SFR procesora `51

    sbit przycisk=P3^2;

    #define DATA_LCD P0 // wyswietlacz podlaczony do portu P0
    sbit DC_LCD = P0^4; // linia D/~C (Data/Control)
    sbit RW_LCD = P0^5; // linia R/~W (Read/Write)
    sbit E_LCD = P0^6; // linia E (Enable)


    #define HOME 0x80 // ustaw kursor na poczatku pierwszej linii lcd
    #define INITDISP 0x28 // interfejs 4bitowy
    #define HOM2 0xc0 // ustaw kursor na poczatku drugiej linii lcd
    #define LCDON 0x0f // wlacz LCD,wlacz kursor, wlacz migotanie
    #define CLEAR 0x01 // zeruj LCD i ustaw kursor na pocatek pierwszej linii


    /* prototypy funkcji obslugi wyswietlacza */

    void LCD_ctrlWR ( char );
    void LCD_dataWR ( char );
    void put_message ( char*);


    #define LCD_init { LCD_ctrlWR(INITDISP); LCD_ctrlWR(CLEAR); LCD_ctrlWR(LCDON); }

    void main ( void ) {

    char i= 0x20; // pierwszy wyswietlany znak to odstep
    LCD_init;

    put_message ( "LCD DEMO: <<<press P3.2" );

    while(1) {

    while (przycisk);
    while (!przycisk);

    LCD_ctrlWR (HOM2);
    LCD_dataWR (i++); // kolejne znaki ASCII drukowane sa na poczatku drugiej linii wyswietlacz
    }
    }

    /* sprawdzanie flagi zajetosci wyswietlacza LCD */
    BYTE check_busy (void) {
    BYTE bf;
    DATA_LCD |= 0x0f; // dana znajduje sie na mlodszej czworce portu
    DC_LCD = 0; // linia D/~C : odczyt slowa Control (status)
    RW_LCD= 1; // linia R/~W : odczyt Read
    E_LCD= 1;
    bf= DATA_LCD & 0x08; // najstarszy bit informuje o zajetosci LCD
    E_LCD= 0;
    E_LCD= 1; // linia Enable E=1: odczyt z wyswietlacza
    E_LCD= 0;

    return (bf);
    }


    /* zapis 4 bitow do wyswietlacza LCD */
    void write_nibble ( BYTE nibble ) {

    E_LCD= 0; // Enable E=0

    DATA_LCD &= 0x0f; // pozostaw starsza czworke bez zmnian
    RW_LCD= 0; // zapis: R/~W=0
    nibble &= 0x0f; // tylko cztery mlodsze bity beda zapisane
    DATA_LCD |= nibble; // wystawienie danych do zapisu
    E_LCD= 1; // Enable E=1: zapis do wyswietlacza
    E_LCD= 0; // Enable E=0: koniec zapisu


    }


    /* zapis slowa sterujacego CONTROL do wyswietlacza LCD */


    void LCD_ctrlWR ( BYTE cmde) {
    while (check_busy() ); // sprawdzenie zajetosci wyswietlacza
    DC_LCD= 0; // wybierz rejestr Control LCD
    write_nibble(cmde >> 4); // zapis starszej czworki bajtu Control
    write_nibble(cmde); // zapis mlodszej czworki bajtu Control

    }


    /* zapis danych DATA do wyswietlacza LCD */

    void LCD_dataWR ( BYTE byte) {
    while (check_busy() ); // sprawdzenie zajetosci wyswietlacza
    DC_LCD= 1; // wybierz rejestr Data LCD
    write_nibble(byte >> 4); // zapis starszej czworki bajtu Data
    write_nibble(byte); // zapis mlodszej czworki bajtu Data

    }

    /* podprogram drukowania ciagu znakow az do ogranicznika 0x00 */

    void put_message (char*s) {
    while(*s)
    LCD_dataWR (*s++);
    }



    Jesli ktos moglby mi pomoc chociaz zeby pojawil sie najprostrzy tekscik na wyswietlaczu to bylbym bardzo wdzieczny.

    POZDRAWIAM MACIEK!
  • #19 1428721
    marcinkwa
    Poziom 14  
    Posty: 164
    Pomógł: 5
    Nie programuje w C- więc kodu nie sprawdzę.
    Rusz PR-kiem od kontrastu - może kontrast jest za duży
  • #20 1428999
    macias21
    Poziom 14  
    Posty: 147
    Pomógł: 10
    Ocena: 2
    Kontrast jest ok.
    Linie R/W dalem do masy i narazie zrezygnuje ze sprawdzania zajetosci wyswietlacza.Napisalem prostrzy programik i smiga:-). Moze w przyszlosci bede zadawal jeszcze jakies pytanka z tej kwestii wiec badzcie wyrozumiali ;-). Dziekuje za wszystkie cenne uwagi.

    Pozdrawiam!

Podsumowanie tematu

✨ Wyświetlacz LCD 2x16 Hitech HMC16225 jest kompatybilny z popularnym sterownikiem HD44780, co umożliwia pracę w trybie 4-bitowym bez problemów. Kontrast reguluje się standardowo za pomocą potencjometru (zalecane wartości to 10k lub 20k Ω), a podświetlenie wymaga zastosowania rezystora (około 10 Ω) dla ochrony diod LED. Linie danych D0-D3 oraz sygnał R/W, jeśli nie są używane, powinny być zwarte do masy, aby uniknąć nieustalonych stanów. Fizyczne podłączenie może być utrudnione ze względu na małe odstępy między wyprowadzeniami, jednak obecnie sprzedawcy często dołączają złącza ułatwiające montaż. Przykładowe schematy i fragmenty kodu w języku C dla mikrokontrolera ATmega32 pokazują, jak podłączyć i obsługiwać wyświetlacz w trybie 4-bitowym. W przypadku problemów z uruchomieniem HMC16225, użytkownik zakupił alternatywny model SVM1602B, który również wymaga prawidłowej inicjalizacji i ustawienia kontrastu. Podsumowując, HMC16225 jest dobrym wyborem, jeśli zastosuje się odpowiednią regulację kontrastu, zabezpieczenie podświetlenia rezystorem oraz właściwe podłączenie sygnałów sterujących i danych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA