#define LED 2
#define V0 A0
#define RS 12
#define RW 11
#define E 10
#define D7 3
#define D6 4
#define D5 5
#define D4 6
#define home 0b00000010 // Table 6 DDRAM adres ustawony na 0, pozycja 0, znaki pozostają nienaruszone.
#define clear 0b00000001 // Table 6 czyści wyświetlacz i ustawia DDRAM na 0, pozycja 0.
void data_4bit(uint8_t val_begin, uint8_t val_lim, uint8_t data_pack);
void command(bool rs_State, bool rw_State, uint8_t data);
void lcd_init();
void lcd_display(bool D, bool C, bool B);
void cursor_pos(uint8_t ROW, uint8_t COL);
void lcd_print(String HelloWorld);
void create_char(uint8_t slot, uint8_t* character);
void custom_print(uint8_t custom_char);
void lcd_home();
void lcd_clear();
void lcd_LED(bool backlight);
uint8_t piny[8] = {LED, RS, RW, E, D7, D6, D5, D4};
uint8_t piny_data[4] ={D7, D6, D5, D4};
byte Heart[] = { B00000, B01010, B11111, B11111, B11111, B01110, B00100, B00000 };
byte Smily[] = { B00000, B01010, B01010, B00000, B11111, B11111, B01110, B00000 };
void setup()
{
delay(40); // czekamy na zasilanie
for(uint8_t i=0; i<8; i++) // ustawiamy piny jako OUTPUT
{
pinMode(piny[i], OUTPUT);
}
lcd_init();
lcd_display(1,1,0);
lcd_home();
lcd_clear();
lcd_LED(1);
cursor_pos(1,3);
lcd_print("Hello World!");
create_char(1, Heart);
create_char(2, Smily);
cursor_pos(1,2);
custom_print(1);
cursor_pos(1,15);
custom_print(2);
}
void loop()
{
}
////////////////////////////////////////////////////////////
void lcd_init()
{
for(uint8_t i=0; i<3; i++)
{
data_4bit(0,4,0b00100000); // zapis dla trybu 4bitowego wyświetlacza. (4bity function set).
}
command(0,0,0b00101000); // pełny function set, tryb 4bitowy, 2 linie wyświetlania, standardowa czcionka.
}
///////////////////////////////////////////////////////////
void command(bool rs_State, bool rw_State, uint8_t data)
{
digitalWrite(RS, rs_State);
digitalWrite(RW, rw_State);
data_4bit(0,4,data); // oddzielnie przesyłamy pierwsze 4 i ostanie 4 bity danych-
data_4bit(4,8,data); // -w 2 wywołaniach funkcji data_4bit
}
///////////////////////////////////////////////////////////
void data_4bit(uint8_t val_begin, uint8_t val_lim, uint8_t data_pack)
{
for(uint8_t i = val_begin; i < val_lim; i++)
{
bool state = (data_pack >> (7-i)) & 1; // odczyt danego bitu poprzez przesunięcie bitów w prawo,-
digitalWrite(piny_data[i-val_begin], state); // -zaczynając od MSB i podanie wartości na piny_data
}
digitalWrite(E, HIGH);
digitalWrite(E, LOW);
}
///////////////////////////////////////////////////////////
void lcd_display(bool D, bool C, bool B)
{
uint8_t data = 0b00001000;
data |= (D << 3);
data |= (C << 2);
data |= (B << 1);
command(0,0,data);
}
///////////////////////////////////////////////////////////
void cursor_pos(uint8_t ROW, uint8_t COL) // adres DDRAM
{
ROW -= 1;
COL -= 1;
uint8_t position = (ROW*60) + (ROW*4) + COL;
position |= (1 << 7);
command(0,0,position);
}
///////////////////////////////////////////////////////////
void lcd_print(String HelloWorld)
{
for(uint8_t i=0; i<HelloWorld.length(); i++)
{
command(1,0,HelloWorld[i]);
}
}
///////////////////////////////////////////////////////////
void create_char(uint8_t slot, uint8_t* character)
{
slot -= 1;
for(uint8_t i=0; i<8; i++)
{
uint8_t CGRAM = 0b01000000;
uint8_t CG_ADD = ((8*slot) + i);
CGRAM |= CG_ADD;
command(0,0,CGRAM);
command(1,0,character[i]);
}
}
///////////////////////////////////////////////////////////
void custom_print(uint8_t custom_char)
{
command(1,0,(custom_char-1));
}
///////////////////////////////////////////////////////////
void lcd_home()
{
command(0,0,home);
}
///////////////////////////////////////////////////////////
void lcd_clear()
{
command(0,0,clear);
}
///////////////////////////////////////////////////////////
void lcd_LED(bool backlight)
{
switch(backlight)
{
case 0:
digitalWrite(LED, LOW);
break;
case 1:
digitalWrite(LED, HIGH);
break;
}
}