hi i want to connect character lcd to my atmega128rfa1 board in wsndemo...
i use this file for HD44780.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 "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 wystawiaj¹ca pó³bajt na magistralê danych // //------------------------------------------------------------------------------------------------- unsigned char _LCD_InNibble(void) { unsigned char tmp = 0; if(LCD_DB4_PIN & LCD_DB4) tmp |= (1 << 0); if(LCD_DB5_PIN & LCD_DB5) tmp |= (1 << 1); if(LCD_DB6_PIN & LCD_DB6) tmp |= (1 << 2); if(LCD_DB7_PIN & LCD_DB7) tmp |= (1 << 3); return tmp; } //------------------------------------------------------------------------------------------------- // // Funkcja zapisu bajtu do wyÅ“wietacza (bez rozró¿nienia instrukcja/dane). // //------------------------------------------------------------------------------------------------- void _LCD_Write(unsigned char dataToWrite) { LCD_DB4_DIR |= LCD_DB4; LCD_DB5_DIR |= LCD_DB5; LCD_DB6_DIR |= LCD_DB6; LCD_DB7_DIR |= LCD_DB7; LCD_RW_PORT &= ~LCD_RW; 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; while(LCD_ReadStatus()&0x80); } //------------------------------------------------------------------------------------------------- // // Funkcja odczytu bajtu z wyÅ“wietacza (bez rozró¿nienia instrukcja/dane). // //------------------------------------------------------------------------------------------------- unsigned char _LCD_Read(void) { unsigned char tmp = 0; LCD_DB4_DIR &= ~LCD_DB4; LCD_DB5_DIR &= ~LCD_DB5; LCD_DB6_DIR &= ~LCD_DB6; LCD_DB7_DIR &= ~LCD_DB7; LCD_RW_PORT |= LCD_RW; LCD_E_PORT |= LCD_E; tmp |= (_LCD_InNibble() << 4); LCD_E_PORT &= ~LCD_E; LCD_E_PORT |= LCD_E; tmp |= _LCD_InNibble(); LCD_E_PORT &= ~LCD_E; return tmp; } //------------------------------------------------------------------------------------------------- // // Funkcja zapisu rozkazu do wyÅ“wietlacza // //------------------------------------------------------------------------------------------------- void LCD_WriteCommand(unsigned char commandToWrite) { LCD_RS_PORT &= ~LCD_RS; _LCD_Write(commandToWrite); } //------------------------------------------------------------------------------------------------- // // Funkcja odczytu bajtu statusowego // //------------------------------------------------------------------------------------------------- unsigned char LCD_ReadStatus(void) { LCD_RS_PORT &= ~LCD_RS; return _LCD_Read(); } //------------------------------------------------------------------------------------------------- // // Funkcja zapisu danych do pamiêci wyÅ“wietlacza // //------------------------------------------------------------------------------------------------- void LCD_WriteData(unsigned char dataToWrite) { LCD_RS_PORT |= LCD_RS; _LCD_Write(dataToWrite); } //------------------------------------------------------------------------------------------------- // // Funkcja odczytu danych z pamiêci wyÅ“wietlacza // //------------------------------------------------------------------------------------------------- unsigned char LCD_ReadData(void) { LCD_RS_PORT |= LCD_RS; return _LCD_Read(); } //------------------------------------------------------------------------------------------------- // // 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; // LCD_RW_DIR |= LCD_RW; // _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 LCD_RW_PORT &= ~LCD_RW; 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 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 } // funkcja s³u¿¹ca do wpisywania w³asnych znaków // nr - zmienna okreÅ“laj¹ca numer znaku (dostêpnych jest 8) od 0 - 7. // znak[] - okreÅ“la kszta³t znaku.. przyk³adowo uint8_t serduszko[] = {4, 10, 17, 23, 23, 17, 31, 0}; definiuje wygl¹d serca. void LCD_ProgrammChar(unsigned char nr, unsigned char znak[]) { unsigned char i; LCD_WriteCommand(HD44780_CGRAM_SET|(nr*8)); for (i=0; i<=7; i++) { LCD_WriteData(znak[i]); } LCD_WriteCommand(HD44780_DDRAM_SET); } //------------------------------------------------------------------------------------------------- // // Koniec pliku HD44780.c // //------------------------------------------------------------------------------------------------- and use HD44780.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#include //------------------------------------------------------------------------------------------------- // // Konfiguracja sygna³َw steruj¹cych wyÅ“wietlaczem. // MoØŸna zmieniÙˆ stosownie do potrzeb. // //------------------------------------------------------------------------------------------------- #define LCD_RS_DIR DDRF #define LCD_RS_PORT PORTF #define LCD_RS_PIN PINF #define LCD_RS (1 << PF4) #define LCD_RW_DIR DDRF #define LCD_RW_PORT PORTF #define LCD_RW_PIN PINF #define LCD_RW (1 << PF5) #define LCD_E_DIR DDRF #define LCD_E_PORT PORTF #define LCD_E_PIN PINF #define LCD_E (1 << PF6) #define LCD_DB4_DIR DDRF #define LCD_DB4_PORT PORTF #define LCD_DB4_PIN PINF #define LCD_DB4 (1 << PF0) #define LCD_DB5_DIR DDRF #define LCD_DB5_PORT PORTF #define LCD_DB5_PIN PINF #define LCD_DB5 (1 << PF1) #define LCD_DB6_DIR DDRF #define LCD_DB6_PORT PORTF #define LCD_DB6_PIN PINF #define LCD_DB6 (1 << PF2) #define LCD_DB7_DIR DDRF #define LCD_DB7_PORT PORTF #define LCD_DB7_PIN PINF #define LCD_DB7 (1 << PF3) //------------------------------------------------------------------------------------------------- // // 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); unsigned char LCD_ReadStatus(void); void LCD_WriteData(unsigned char); unsigned char LCD_ReadData(void); void LCD_WriteText(char *); void LCD_GoTo(unsigned char, unsigned char); void LCD_Clear(void); void LCD_Home(void); void LCD_Initalize(void); void LCD_ProgrammChar(unsigned char nr, unsigned char znak[]); //------------------------------------------------------------------------------------------------- // // Koniec pliku HD44780.h // //-------------------------------------------------------------------------------------------------
i want to connect it to portF but when i program board with those files but program hold on while(LCD_ReadStatus()&0x80); please help me:(