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

[mega8][C] - Biblioteka do hd44780 (piny nie pokolei)

demeus 26 Kwi 2009 01:08 4840 5
REKLAMA
  • #1 6457276
    demeus
    Poziom 18  
    Witam

    Szukam biblioteki do obsługi wyświetlacza lcd 2x16 opartego na hd44780, tak by można było każdy pin wyświetlacza zdefiniować na dowolnym pinie/porcie procka. Oczywiście z obsługą sterowania 4bit.

    Moja konfiguracja wygląda następująco:
    LCD_PIN_RS PORTB, 0
    LCD_PIN_EN PORTB, 1
    LCD_PIN_D4 PORTB, 2
    LCD_PIN_D5 PORTB, 3
    LCD_PIN_D6 PORTB, 4
    LCD_PIN_D7 PORTB, 5

    Niestety podłączenia wyświetlacza nie mogę zmienić. Większość bibliotek, które znalazłem wymagają kolejnych pinów 2-7 z jednego portu.

    Z góry dziękuję za pomoc.

    --
    pozdrawiam,
    demeus
  • REKLAMA
  • Pomocny post
    #2 6457378
    M. S.
    Poziom 34  
    
    //USTAWIENIE PORTU WYŚWIETLACZA P-port, K-końcówka,
    #define P7 PORTB
    #define K7 5
    #define P6 PORTB
    #define K6 4
    #define P5 PORTB
    #define K5 3
    #define P4 PORTB
    #define K4 2
    #define PEN PORTB
    #define KEN 1
    #define PRS PORTB
    #define KRS 0
    
    #define SET_E   PEN s(KEN) 
    #define CLR_E   PEN r(KEN) 
    #define SET_RS  PRS s(KRS) 
    #define CLR_RS  PRS r(KRS) 
    
    #define cls write_command(0x01); write_command(0x02) 		// cls
    #define lowerline write_command(0xA8)										// lowerline
    
    
    #define s(bit) |= (1 << (bit))//Ustaw Bit
    #define r(bit) &= ~(1 << (bit))//Kasuj Bit
    #define t(bit) ^= (1 << (bit))//Zmień Bit
    #define spr(bit) &(1 << (bit))//Sprawdź Bit czy 1
    
    void ustaw (unsigned char a)
    {
    unsigned char D7, D6, D5, D4;
    D7=D6=D5=D4=0;
    
    		D7=(a spr(7));
    		D6=(a spr(6));
    		D5=(a spr(5));
    		D4=(a spr(4));
    		if(D7) P7 s(K7); else P7 r(K7); 
    		if(D6) P6 s(K6); else P6 r(K6); 
    		if(D5) P5 s(K5); else P5 r(K5); 
    		if(D4) P4 s(K4); else P4 r(K4);
    }
    
    void write_to_lcd(char x)						// procededura zapisu bajtu do wyświetlacza LCD
    {
    	SET_E; 										// ustaw na E stan wysoki
    	ustaw(x);		
    	CLR_E; 										// opadające zbocze na E -> zapis do wyświetlacza
    	SET_E; 										// ustaw na E stan wysoki
    	ustaw(x<<4);
    	CLR_E; 										// opadające zbocze na E -> zapis do wyświetlacza
    	delayms(1); 									// czekaj 1ms
    }
    
    void write_command(char x)						// procedura zapisu instrukcji do wyświetlacza LCD
    {
    	CLR_RS; 									// niski stan na RS -> zapis instrukcji
    	write_to_lcd(x); 							// zapis do LCD
    }
    void write_char(char x)						// procedura zapisu danej do wyświetlacza LCD
    {
    	SET_RS; 									// wysoki stan na RS -> zapis danej
    	write_to_lcd(x); 							// zapis do LCD
    }
    void lcd(char *s)								// procedura zapisu tekstu do wyświetlacza LCD
    {
    	while(*s) 									// do napotkania 0
    	{
    		write_char(*s); 						// zapisz znak wskazywany przez s na LCD
    		s++; 									// zwiększ s (przygotuj nastepny znak)
    	}
    }
    /*void lcd_init(void)							// procedura inicjalizacji wyświetlacza LCD
    {
    	waitms(15); 								// czekaj 15ms na ustabilizowanie się napięcia zasilającego
    	write_command(0x28); 						// interfejs 4-bity, 2-linie, znak 5x7
    	write_command(0x08); 						// wyłącz LCD, kursor i miganie
    	cls; 										// czyść LCD
    	write_command(0x06); 						// bez przesuwania w prawo
    	write_command(0x0C); 						// włącz LCD, bez kursora i mrugania
    }*/
    
    void lcd_init(void)							// procedura inicjalizacji wyświetlacza LCD
    {unsigned char LCD = 255
    	delayms(100); 								// czekaj 15ms na ustabilizowanie się napięcia zasilającego
    	CLR_E; 										// E = 0
    	CLR_RS; 									// RS = 0
    	char i; 									// zmianna licznikowa
    	for(i = 0; i < 3; i++) 					// trzykrotne powtórzenie bloku instrukcji
    	{
    		LCD &= 0x3F;
    		SET_E; 									// E = 1
    		ustaw(LCD);							//
    		CLR_E; 									// E = 0
    		waitms(5); 								// czekaj 5ms
    	}
    	LCD &= 0x2E;
    	SET_E; 										// E = 1
    	ustaw(LCD);
    	CLR_E; 										// E = 0
    	waitms(1); 									// czekaj 1ms
    	write_command(0x28); 						// interfejs 4-bity, 2-linie, znak 5x7
    	write_command(0x08); 						// wyłącz LCD, kursor i miganie
    	cls; 										// czyść LCD
    	write_command(0x06); 						// bez przesuwania w prawo
    	write_command(0x0C); 						// włącz LCD, bez kursora i mrugania
    }
    void locate(char y, char x)
    {
    	switch (y) // obliczenie o ile nalezy zwiekszyc x w zaleznosci od wartosci y
    	{
    		case 1:
    		x += 0x7F; // x = x + 0x80 - 1
    		break;
    		case 2:
    		x += 0xBF; // x = x + 0xC0 - 1
    		break;
    		case 3:
    		x += 0x9F; // x = x + 0xA0 - 1
    		break;
    		case 4:
    		x += 0xDF; // x = x + 0xE0 - 1
    		break;
    	}
    write_command(x);
    }


    Zanalizuj i ewentualnie przerób. Stworzyłem to kilka lat temu kiedy bawiłem się w "C". Być może czegoś brakuje. Funkcja Ustaw "przekierowuje" porty.
  • REKLAMA
  • REKLAMA
  • #4 6457877
    demeus
    Poziom 18  
    _Robak_ napisał:
    A ja polecam ta biblioteke http://homepage.hispeed.ch/peterfleury/avr-lcd44780.html . Nawt jak kazdy pin masz na innym porcie to tez mozesz skonfigurowac to aby dzialalo :)


    Tak, tylko powyższa biblioteka wymaga by pin R/W był podpięty do procka, niestety u mnie jest on podpięty do masy.

    --
    pozdrawiam,
    demeus
  • REKLAMA
  • #6 6458128
    demeus
    Poziom 18  
    snow napisał:
    http://radzio.dxp.pl/hd44780/


    Dokładnie o to mi chodziło :).
    Temat zamykam, dziękuję wszystkim za pomoc i zainteresowanie.

    --
    pozdrawiam,
    demeus
REKLAMA