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 JM204A kto pomoże go poskromić ?

margas4542 22 Sie 2010 15:28 2562 3
REKLAMA
  • #1 8425749
    margas4542
    Poziom 16  
    ..załamać się można....zmieniłem LCD z 2x16 na 4x20 i nie potrafię dojść z nim do ładu...i owszem wyświetla cyfry i litery ale nie tam gdzie powinien...poprzesuwane i nie w tych wierszach...korzystam z biblioteki pana Radosława Kwiecień którą próbowałem nieco zmodyfikować pod ten LCD ale totalna klapa...na Elektrodzie było kilka "sztuczek" ale żadna nie zadziałała....
    to część kodu odpowiadająca z LCD ustawiony na porcie C
    
    // >>>> obsługa LCD 4 x 20
    
       LCD_Initalize();
       LCD_Clear(); 
      while (1){
       initalize();
       LCD_GoTo(0,0);              				 
       LCD_WriteText("Uaku ");                      //napięcie akumulatora
       LCD_WriteText(utoa(u_aku, buffer_n, 10));             			     
       LCD_GoTo(10,0);
       LCD_WriteText("Iaku ");                      //prąd zasilania
       LCD_WriteText(utoa(i_in, buffer_n, 10));             			     
       
       LCD_GoTo(0,1);              				 
       LCD_WriteText("Usol ");                      //napięcie ogniwa solar
       LCD_WriteText(utoa(u_solar, buffer_n, 10));
       LCD_GoTo(10,1);         			            				 
       LCD_WriteText("Isol ");
       LCD_WriteText(utoa(i_out, buffer_n, 10));  //prąd do odbiorników
    
       LCD_GoTo(0,2);              				 
       LCD_WriteText("1 2 3 4 5 6 7 8 9 0");
       LCD_GoTo(0,3);
       LCD_WriteText("* * * * * * * * * *");
      }
      return 0;
    }//main
    // >>>>>>>>>>>>>>>>>>>>>>> END <<<<<<<<<<<<<<<<<<<<<<<<<<<
    


    
    //----------------------------------------------------------------------------
    // Autor : Radosław Kwiecień
    //----------------------------------------------------------------------------
    #include "HD44780.h"
    //----------------------------------------------------------------------------
    // Funkcja wystawiająca półbajt na magistralę danych
    //----------------------------------------------------------------------------
    void _LCD_OutNibble(unsigned char nibbleToWrite)
    {
    if(nibbleToWrite & 0x01)
    	LCD_DB4_PORT |= LCD_DB4;
    else
    	LCD_DB4_PORT  &= ~LCD_DB4;
    
    if(nibbleToWrite & 0x02)
    	LCD_DB5_PORT |= LCD_DB5;
    else
    	LCD_DB5_PORT  &= ~LCD_DB5;
    
    if(nibbleToWrite & 0x04)
    	LCD_DB6_PORT |= LCD_DB6;
    else
    	LCD_DB6_PORT  &= ~LCD_DB6;
    
    if(nibbleToWrite & 0x08)
    	LCD_DB7_PORT |= LCD_DB7;
    else
    	LCD_DB7_PORT  &= ~LCD_DB7;
    }
    //----------------------------------------------------------------------------
    // Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
    //----------------------------------------------------------------------------
    void _LCD_Write(unsigned char dataToWrite)
    {
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite >> 4);
    LCD_E_PORT &= ~LCD_E;
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite);
    LCD_E_PORT &= ~LCD_E;
    _delay_us(50);
    }
    //----------------------------------------------------------------------------
    // Funkcja zapisu rozkazu do wyświetlacza
    //----------------------------------------------------------------------------
    void LCD_WriteCommand(unsigned char commandToWrite)
    {
    LCD_RS_PORT &= ~LCD_RS;
    _LCD_Write(commandToWrite);
    }
    //----------------------------------------------------------------------------
    // Funkcja zapisu danych do pamięci wyświetlacza
    //----------------------------------------------------------------------------
    void LCD_WriteData(unsigned char dataToWrite)
    {
    LCD_RS_PORT |= LCD_RS;
    _LCD_Write(dataToWrite);
    }
    //----------------------------------------------------------------------------
    // Funkcja wyświetlenia napisu na wyswietlaczu.
    //----------------------------------------------------------------------------
    void LCD_WriteText(char * text)
    {
    while(*text)
      LCD_WriteData(*text++);
    }
    //----------------------------------------------------------------------------
    // Funkcja ustawienia współrzędnych ekranowych
    //----------------------------------------------------------------------------
    void LCD_GoTo(unsigned char x, unsigned char y)
    {
    LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
    }
    //----------------------------------------------------------------------------
    // Funkcja czyszczenia ekranu wyświetlacza.
    //----------------------------------------------------------------------------
    void LCD_Clear(void)
    {
    LCD_WriteCommand(HD44780_CLEAR);
    _delay_ms(2);
    }
    //---------------------------------------------------------------------------
    // Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
    //----------------------------------------------------------------------------
    void LCD_Home(void)
    {
    LCD_WriteCommand(HD44780_HOME);
    _delay_ms(2);
    }
    //----------------------------------------------------------------------------
    // Procedura inicjalizacji kontrolera HD44780.
    //----------------------------------------------------------------------------
    void LCD_Initalize(void)
    {
    unsigned char i;
    LCD_DB4_DIR |= LCD_DB4; 	// Konfiguracja kierunku pracy wyprowadzeń
    LCD_DB5_DIR |= LCD_DB5; 	// Konfiguracja kierunku pracy wyprowadzeń
    LCD_DB6_DIR |= LCD_DB6; 	// Konfiguracja kierunku pracy wyprowadzeń
    LCD_DB7_DIR |= LCD_DB7; 	// Konfiguracja kierunku pracy wyprowadzeń
    LCD_E_DIR |= LCD_E;   		// Konfiguracja kierunku pracy wyprowadzeń
    LCD_RS_DIR |= LCD_RS;  		// Konfiguracja kierunku pracy wyprowadzeń
    _delay_ms(15); 			// oczekiwanie na ustalibizowanie się napiecia zasilajacego
    LCD_RS_PORT &= ~LCD_RS; 	// wyzerowanie linii RS
    LCD_E_PORT &= ~LCD_E;  		// wyzerowanie linii E
    
    for(i = 0; i < 3; i++) 		// trzykrotne powtórzenie bloku instrukcji
      {
      LCD_E_PORT |= LCD_E; 		// E = 1
      _LCD_OutNibble(0x03); 	// tryb 8-bitowy
      LCD_E_PORT &= ~LCD_E; 	// E = 0
      _delay_ms(5); 		// czekaj 5ms
      }
    
    LCD_E_PORT |= LCD_E; 		// E = 1
    _LCD_OutNibble(0x02); 		// tryb 4-bitowy
    LCD_E_PORT &= ~LCD_E; 		// E = 0
    
    _delay_ms(1); 			// czekaj 1ms 
    LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); 
    // znak 5x7 , 2-linie , interfejs 4-bity
    
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); 
    // wyłączenie wyswietlacza
    
    LCD_WriteCommand(HD44780_CLEAR); 
    // czyszczenie zawartosći pamieci DDRAM
    
    _delay_ms(2);
    LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);
    // inkrementaja adresu i przesuwanie kursora
    
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); 
    // włącz LCD, bez kursora i mrugania
    }
    
    //----------------------------------------------------------------------------
    // Koniec pliku HD44780.c
    //----------------------------------------------------------------------------
    
    

    
    //-------------------------------------------------------------
    // Wyświetlacz alfanumeryczny ze sterownikiem HD44780
    // Plik : HD44780.h	
    // Autor : Radosław Kwiecień
    //-------------------------------------------------------------
    #include <avr/io.h>
    #include <util/delay.h>
    //-------------------------------------------------------------
    // Konfiguracja sygnałów sterujących wyświetlaczem.
    // Można zmienić stosownie do potrzeb.
    //-------------------------------------------------------------
    #define LCD_RS_DIR		DDRC
    #define LCD_RS_PORT 	PORTC
    #define LCD_RS			(1 << PA2)
    
    #define LCD_E_DIR		DDRC
    #define LCD_E_PORT	PORTC
    #define LCD_E			(1 << PA3)
    
    #define LCD_DB4_DIR		DDRC
    #define LCD_DB4_PORT	PORTC
    #define LCD_DB4			(1 << PA4)
    
    #define LCD_DB5_DIR		DDRC
    #define LCD_DB5_PORT	PORTC
    #define LCD_DB5			(1 << PA5)
    
    #define LCD_DB6_DIR		DDRC
    #define LCD_DB6_PORT	PORTC
    #define LCD_DB6			(1 << PA6)
    
    #define LCD_DB7_DIR		DDRC
    #define LCD_DB7_PORT	PORTC
    #define LCD_DB7			(1 << PA7)
    //-------------------------------------------------------------
    // Instrukcje kontrolera Hitachi HD44780
    //-------------------------------------------------------------
    #define HD44780_CLEAR					0x01
    #define HD44780_HOME					0x02
    
    #define HD44780_ENTRY_MODE				0x04
    	#define HD44780_EM_SHIFT_CURSOR		0
    	#define HD44780_EM_SHIFT_DISPLAY	1
    	#define HD44780_EM_DECREMENT		0
    	#define HD44780_EM_INCREMENT		2
    
    #define HD44780_DISPLAY_ONOFF			0x08
    	#define HD44780_DISPLAY_OFF			0
    	#define HD44780_DISPLAY_ON			4
    	#define HD44780_CURSOR_OFF			0
    	#define HD44780_CURSOR_ON			2
    	#define HD44780_CURSOR_NOBLINK		0
    	#define HD44780_CURSOR_BLINK		1
    
    #define HD44780_DISPLAY_CURSOR_SHIFT	0x10
    	#define HD44780_SHIFT_CURSOR		0
    	#define HD44780_SHIFT_DISPLAY		8
    	#define HD44780_SHIFT_LEFT			0
    	#define HD44780_SHIFT_RIGHT			4
    
    #define HD44780_FUNCTION_SET			0x20
    	#define HD44780_FONT5x7				0
    	#define HD44780_FONT5x10			4
    	#define HD44780_ONE_LINE			0
    	#define HD44780_TWO_LINE			8
    	#define HD44780_4_BIT				0
    	#define HD44780_8_BIT				16
    
    #define HD44780_CGRAM_SET				0x40
    #define HD44780_DDRAM_SET				0x80
    //------------------------------------------------------------
    // Deklaracje funkcji
    //------------------------------------------------------------
    void LCD_WriteCommand(unsigned char);
    void LCD_WriteData(unsigned char);
    void LCD_WriteText(char *);
    void LCD_GoTo(unsigned char, unsigned char);
    void LCD_Clear(void);
    void LCD_Home(void);
    void LCD_Initalize(void);
    //------------------------------------------------------------
    // Koniec pliku HD44780.h
    //------------------------------------------------------------
    
  • REKLAMA
  • #2 8425858
    tymon_x
    Poziom 30  
    Ta funkcja jest zła:
    LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));

    Według noty LCD JM204A, strona 9. Adresacja od pierwszej linii skacze na trzecią linię, potem na drugą i następnie na czwartą (; Dlatego znaki pojawiają się tam, gdzie nie trzeba. Czyli dla odpowiednika HD44780 dla pierwszej linii, odpowiada linia pierwsza i trzecia u Ciebie, a druga linia, druga i czwarta w wyświetlaczu JM204A.

    Chcesz coś zapisać na drugiej linii, w tedy:

    Adres ma 0x40, co odpowiada początkowi drugiej linii.
    A na trzecią:
    LCD_GoTo(20,0);

    Adres ma 0x14 co odpowiada początkowi trzeciej linii.

    Chyba, to mi się pierwsze w oczy rzuciło (;

    Według noty:
    1 - 0x00 - pierwsza linia, LCD_GoTo(0,0);
    2 - 0x14 - trzecia linia, LCD_GoTo(20,0);
    3 - 0x40 - druga linia, LCD_GoTo(0,1);
    4 - 0x54 - czwarta linia, LCD_GoTo(20,1);
  • REKLAMA
  • #4 8426110
    margas4542
    Poziom 16  
    .....i oto właśnie chodził o a ja kombinowałem jak koń pod górkę czytając pdf-a i porady na forum......wielkie dzięki panowie wszystko teraz jest na swoim miejscu..
REKLAMA