..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
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
//------------------------------------------------------------