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

AVR Xplain Series i LCD. Standard HD44780. Błąd kompilacji.

alimoe 29 Gru 2010 21:44 1711 5
  • #1 8931718
    alimoe
    Poziom 9  
    Mam pewien problem ze skompilowaniem programu mającego wyświetlić jakikolwiek tekst na ekranie lcd 2x16 w standardzie HD44780. Zamieszczam kod programu oraz podstawową treść błędu. Będe wdzięczny za pomoc bo troszeczkę to irytujące.

    Błąd przy kompilacji jaki otrzymuje to
    ../task1.c:54: error: 'PA4' undeclared (first use in this function)

    i tak dalej każdy port nie wiem czy dobze te porty są zdefiniowane albo czy biblioteki nei brakuje prosze o pomoc.

    Program główny:
    //------------------------------------------------------------------------------------------------- 
    // Wyświetlacz alfanumeryczny ze sterownikiem HD44780 
    // Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości 
    // z dowolnym przypisaniem sygnałów sterujących 
    // Plik : HD44780.c    
    // Mikrokontroler : Atmel AVR 
    // Kompilator : avr-gcc 
    // Autor : Radosław Kwiecień 
    // Źródło : http://radzio.dxp.pl/hd44780/ 
    // Data : 24.03.2007 
    //------------------------------------------------------------------------------------------------- 
    #include <util/delay.h> 
    #include <avr\io.h> 
    #include <inttypes.h> 
    //#include "lcd.h"
    #include <avr\pgmspace.h>
    //#include "C:\WinAVR-20100110\avr\include\avr\iom128.h"
    //#include "HD44780.h" 
    #include "C:\szachy\Nowy folder\HD44780.h" 
    
    #define LCD_RS_DIR      DDRA 
    #define LCD_RS_PORT    PORTA 
    #define LCD_RS         (1 << PA2) 
    
    #define LCD_E_DIR      DDRA 
    #define LCD_E_PORT      PORTA 
    #define LCD_E         (1 << PA3) 
    
    #define LCD_DB4_DIR      DDRA 
    #define LCD_DB4_PORT   PORTA 
    #define LCD_DB4         (1 << PA4) 
    
    #define LCD_DB5_DIR      DDRA 
    #define LCD_DB5_PORT   PORTA 
    #define LCD_DB5         (1 << PA5) 
    
    #define LCD_DB6_DIR      DDRA 
    #define LCD_DB6_PORT   PORTA 
    #define LCD_DB6         (1 << PA6) 
    
    #define LCD_DB7_DIR      DDRA 
    #define LCD_DB7_PORT   PORTA 
    #define LCD_DB7         (1 << PA7) 
    
    
    //------------------------------------------------------------------------------------------------- 
    // 
    // 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_Initialize(void) 
    { 
    unsigned char i; 
    LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń 
    LCD_DB5_DIR |= LCD_DB5; // 
    LCD_DB6_DIR |= LCD_DB6; // 
    LCD_DB7_DIR |= LCD_DB7; // 
    LCD_E_DIR    |= LCD_E;   // 
    LCD_RS_DIR    |= LCD_RS;  // 
    _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); // interfejs 4-bity, 2-linie, znak 5x7 
    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 
    } 
    
    
    int main(void) 
    { 
      LCD_Initialize(); 
      LCD_Clear(); 
      LCD_Home(); 
      LCD_GoTo(0,0); 
      // nie używam tej biblioteki, ale wydaje mi się, że LCD_home() i LCD_GoTo 
      //w tym wypadku da to samo czyli ustawienie na (0,0); 
    
         while(1){ 
         LCD_WriteText("test"); 
          } 
      }
    
    Plik z funkcjami:
    
    //-------------------------------------------------------------------------------------------------
    // Wyświetlacz alfanumeryczny ze sterownikiem HD44780
    // Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości
    // z dowolnym przypisaniem sygnałów sterujących
    // Plik : HD44780.c	
    // Mikrokontroler : Atmel AVR
    // Kompilator : avr-gcc
    // Autor : Radosław Kwiecień
    // Źródło : http://radzio.dxp.pl/hd44780/
    // Data : 24.03.2007
    //-------------------------------------------------------------------------------------------------
    #include "C:\szachy\Nowy folder\HD44780.h" 
    //-------------------------------------------------------------------------------------------------
    //
    // Funkcja wystawiająca półbajt na magistralę danych
    //
    //-------------------------------------------------------------------------------------------------
    /*#define LCD_RS_DIR      DDRA 
    #define LCD_RS_PORT    PORTA 
    #define LCD_RS         (1 << PA6) 
    
    #define LCD_E_DIR      DDRA 
    #define LCD_E_PORT      PORTA 
    #define LCD_E         (1 << PA5) 
    
    #define LCD_DB4_DIR      DDRA 
    #define LCD_DB4_PORT   PORTA 
    #define LCD_DB4         (1 << PA3) 
    
    #define LCD_DB5_DIR      DDRA 
    #define LCD_DB5_PORT   PORTA 
    #define LCD_DB5         (1 << PA2) 
    
    #define LCD_DB6_DIR      DDRA 
    #define LCD_DB6_PORT   PORTA 
    #define LCD_DB6         (1 << PA1) 
    
    #define LCD_DB7_DIR      DDRA 
    #define LCD_DB7_PORT   PORTA 
    #define LCD_DB7         (1 << PA0)
    */
    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; // 
    LCD_DB6_DIR |= LCD_DB6; // 
    LCD_DB7_DIR |= LCD_DB7; // 
    LCD_E_DIR    |= LCD_E;   // 
    LCD_RS_DIR    |= LCD_RS;  // 
    _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_ONE_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7 
    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
    
    Plik H:
    //-------------------------------------------------------------------------------------------------
    // Wyświetlacz alfanumeryczny ze sterownikiem HD44780
    // Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości
    // z dowolnym przypisaniem sygnałów sterujących
    // Plik : HD44780.h	
    // Mikrokontroler : Atmel AVR
    // Kompilator : avr-gcc
    // Autor : Radosław Kwiecień
    // Źródło : http://radzio.dxp.pl/hd44780/
    // Data : 24.03.2007
    //-------------------------------------------------------------------------------------------------
    
    #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      DDRA 
    #define LCD_RS_PORT    PORTA 
    #define LCD_RS         (1 << PA6) 
    
    #define LCD_E_DIR      DDRA 
    #define LCD_E_PORT      PORTA 
    #define LCD_E         (1 << PA5) 
    
    #define LCD_DB4_DIR      DDRA 
    #define LCD_DB4_PORT   PORTA 
    #define LCD_DB4         (1 << PA3) 
    
    #define LCD_DB5_DIR      DDRA 
    #define LCD_DB5_PORT   PORTA 
    #define LCD_DB5         (1 << PA2) 
    
    #define LCD_DB6_DIR      DDRA 
    #define LCD_DB6_PORT   PORTA 
    #define LCD_DB6         (1 << PA1) 
    
    #define LCD_DB7_DIR      DDRA 
    #define LCD_DB7_PORT   PORTA 
    #define LCD_DB7         (1 << PA0)
    */
    //-------------------------------------------------------------------------------------------------
    //
    // 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_OutNibble(unsigned char);
    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
    
  • #3 8934148
    alimoe
    Poziom 9  
    w zasadzie to na dole jest wszystko bo góra to poprostu przeklejony hd44780.c próbowałem różnych kombinacji ale dalej ten sam błąd.

    LCD_DB4_PORT |= LCD_DB4; //w tej linijce zaczynają sie błędy że niby PA4 nie jest zdefiniowany tak jak pisałem wyżej. Z tej funkcji korzystają wszystkie następne wiec automatycznie wywala mi wiecej błedów.

    TASK.C
    //------------------------------------------------------------------------------------------------- 
    // Wyświetlacz alfanumeryczny ze sterownikiem HD44780 
    // Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości 
    // z dowolnym przypisaniem sygnałów sterujących 
    // Plik : HD44780.c    
    // Mikrokontroler : Atmel AVR 
    // Kompilator : avr-gcc 
    // Autor : Radosław Kwiecień 
    // Źródło : http://radzio.dxp.pl/hd44780/ 
    // Data : 24.03.2007 
    //------------------------------------------------------------------------------------------------- 
    #include <util/delay.h> 
    #include <avr\io.h> 
    #include <inttypes.h> 
    //#include "lcd.h"
    #include <avr\pgmspace.h>
    //#include "C:\WinAVR-20100110\avr\include\avr\iom128.h"
    //#include "HD44780.h" 
    #include "C:\szachy\Nowy folder\HD44780.h" 
    
    #define LCD_RS_DIR      DDRA 
    #define LCD_RS_PORT    PORTA 
    #define LCD_RS         (1 << PA2) 
    
    #define LCD_E_DIR      DDRA 
    #define LCD_E_PORT      PORTA 
    #define LCD_E         (1 << PA3) 
    
    #define LCD_DB4_DIR      DDRA 
    #define LCD_DB4_PORT   PORTA 
    #define LCD_DB4         (1 << PA4) 
    
    #define LCD_DB5_DIR      DDRA 
    #define LCD_DB5_PORT   PORTA 
    #define LCD_DB5         (1 << PA5) 
    
    #define LCD_DB6_DIR      DDRA 
    #define LCD_DB6_PORT   PORTA 
    #define LCD_DB6         (1 << PA6) 
    
    #define LCD_DB7_DIR      DDRA 
    #define LCD_DB7_PORT   PORTA 
    #define LCD_DB7         (1 << PA7) 
    
    
    //------------------------------------------------------------------------------------------------- 
    // 
    // 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_Initialize(void) 
    { 
    unsigned char i; 
    LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń 
    LCD_DB5_DIR |= LCD_DB5; // 
    LCD_DB6_DIR |= LCD_DB6; // 
    LCD_DB7_DIR |= LCD_DB7; // 
    LCD_E_DIR    |= LCD_E;   // 
    LCD_RS_DIR    |= LCD_RS;  // 
    _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); // interfejs 4-bity, 2-linie, znak 5x7 
    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 
    } 
    
    
    int main(void) 
    { 
      LCD_Initialize(); 
      LCD_Clear(); 
      LCD_Home(); 
      LCD_GoTo(0,0); 
      // nie używam tej biblioteki, ale wydaje mi się, że LCD_home() i LCD_GoTo 
      //w tym wypadku da to samo czyli ustawienie na (0,0); 
    
         while(1){ 
         LCD_WriteText("test"); 
          } 
      }
  • #5 8937581
    szaro
    Poziom 19  
    Z tego co mi wiadomo to Xplain jest oparty na µC AtXmega (dokładnie Atxmega128A1), w sumie jest to architektura AVR, więc piszesz podobnie jak na inne AVR-y np. ATmega, ale nie zupełnie.
    Na przykład do portów możesz dostać się tak:
    - "kierunek" odpowiednik DDRx (data direction register) pinu 0 portu A -> PORTA.DIRSET=PIN_0_bm,
    - "ustawienie" pinu 1 portu A -> PORTA.OUTSET=PIN1_bm,
    - "kasowanie" pinu 2 portu B -> PORTB.OUTCLR=PIN2_bm,
    - zmiana na całym porcie -> PORTx.OUT=0b00001111,
    - zmiana stanu na przeciwny pinu 5 portu F -> PORTF.OUTTGL=PIN5_bm.

    Sugeruje dokonać zamian w kodzie i wszystko ruszy.
    Pozdrawiam
  • #6 8957051
    alimoe
    Poziom 9  
    Dziękuję wszystkim za pomoc problem udało mi się rozwiązać poprzez odpowiednie nazwanie danych pinów. Nazwy znajdowały się w pliku inicjalizacyjnym uzywanym przez bibliotekę avr/io.
REKLAMA