Last active
October 16, 2023 17:04
-
-
Save gammels/c6f59814764deaf32a1ef459ff258781 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* ATmega32_lcd447800_main.h | |
* | |
* Created: 2015-06-06 00:00:00 | |
* Author: Gammels | |
* | |
*/ | |
#ifndef lcd44780 | |
#define lcd44780 | |
#include <avr/io.h> | |
#include <util/delay.h> | |
#include <stdlib.h> | |
#define CLR_Scr 0x01 // Clear Screen | |
#define R_Home 0x02 // Return Home | |
#define Read_DDRAM 0x04 // Read data Display RAM | |
#define Write_DDRAM_Left 0x07 // Write Data Display RAM and shift to left | |
#define Write_DDRAM_Right 0x05 // Write Data Display RAM and shift to right | |
#define Shift_C_Left 0x10 // Shift one to left | |
#define Shift_C_Right 0x14 // Shift one to right | |
#define Shift_All_Left 0x18 // Shift all to left | |
#define Shift_All_Right 0x1C // Shift all to right | |
#define Display_On 0x0C // Display On | |
#define Display_On1 0x0E // Display On whith cursor on and blink off | |
#define Display_On2 0x0F // Display On whith cursor on and blink on | |
#define Display_Off 0x08 // Display Off | |
#define Bus8 0x30 // Szyna 8-bit | |
#define Bus4 0x20 // Szyna 4-bit | |
#define Line1_Bus8 0x30 // Linia 1 Szyna 8-bit | |
#define Line2_Bus8 0x38 // Linia 2 Szyna 8-bit | |
#define Line1_Bus4 0x20 // Linia 1 Szyna 4-bit | |
#define Line2_Bus4 0x28 // Linia 2 Szyna 4-bit | |
#define Dot8_L1B8 0x30 // Dot 5x8 Linia 1 Szyna 8-bit | |
#define Dot8_L1B4 0x20 // Dot 5x8 Linia 1 Szyna 4-bit | |
#define Dot8_L2B8 0x38 // Dot 5x8 Linia 2 Szyna 8-bit | |
#define Dot8_L2B4 0x28 // Dot 5x8 Linia 2 Szyna 4-bit | |
#define Dot10_L1B8 0x34 // Dot 5x10 Linia 1 Szyna 8-bit | |
#define Dot10_L1B4 0x24 // Dot 5x10 Linia 1 Szyna 4-bit | |
#define Dot10_L2B8 0x3C // Dot 5x10 Linia 2 Szyna 8-bit | |
#define Dot10_L2B4 0x2C // Dot 5x10 Linia 2 Szyna 4-bit | |
#define LCDDBase PORTB // zdefiniowanie pinów DB (DataBase 0..7 on LCD) >> lokalizacja PORTB | |
#define DataDir_LCDDBase DDRB // zdefiniowanie rejestru pinów DataBase >> lokalizacja DDRB | |
#define LCDControl PORTD // zdefiniowanie pinów odpowiedzialnych za kontrole LCD >> lokalizacjia PORTD | |
#define DataDir_LCDControl DDRD // zdefiniowanie rejestru pinów kontrolnych LCD >> lokalizacja DDRD | |
#define LightSwitch 7 // zdefiniowanie numeru pinu odpiwedzialnego za operacje Read/Write (pin E wyświetlacza) >> pin 2 portu D | |
#define ReadWrite 6 // zdefiniowanie numeru pinu odpowiedzialnego za R/W kontroli wyświetlacza (pin R/W read/writhe) >> pin 1 portu D | |
#define BiPolar 5 // zdefiniowanie numeru pinu odpowiedzialnego za zmianę polaryzacji LCD R/S >> pin 0 portu D | |
void Check_LCD_Busy(void); // procedura sprawdzenia czy wyświetlacz jest zajety | |
void LCD_Switch_On(void); // procedura włączenia | |
void LCD_Switch_Off(void); // NOT FUNCTION | |
void Clear_LCD_Scr(void); | |
void Send_A_Command(unsigned char command); // procedura wysyłania komend (zmienna "command") | |
void Send_A_Character(unsigned char character); // procedura wysyłania znaków (zmienna "character") | |
void Send_A_String(char *StringOfCharacter); // procedura wysyłania słów | |
void Send_String_Located(uint8_t x,uint8_t y,char *StringOfCharacter); // procedura wysyłania słów | |
void GotoLocation(uint8_t x,uint8_t y); // procedura wysyłania kursora do x,y int8_t >>8bitow intiger number | |
void booting_lcd(void); | |
void sleep_lcd(void); | |
void wake_up_lcd(void); | |
void welcome_lcd(void); | |
void InitializeLCD_On(void); // procedura włączająca wyświetlacz | |
void InitializeLCD_On1(void); // procedura włączająca wyświetlacz1 (kursor włączony) | |
void InitializeLCD_On2(void); // procedura włączająca wyświetlacz2 (Kursor mruga) | |
void InitializeLCD_Off(void); // procedura wyłączenia wyświetlacza | |
void InitializeLCD_On_Test(); | |
void Shift_LA(void); // procedura przesunięcie całości w lewo | |
void Shift_RA(void); // procedura przesunięcie całości w prawo | |
void Shift_LC(void); // procedura przesuniecie o jeden w lewo | |
void Shift_RC(void); // procedura przesunięcie o jeden w prawo | |
void Show_xy_Position(void); // procedura wyświetlania pozycji kursora (pętla) | |
void Show_word_MovePosition(char see_word); // procedura wyświetlania poryszającego się słowa w prawo (2linie) | |
void Show_word_MovePosition1(char see_word); // procedura wyłwietlania poryszającego siê słowa w prawo (1 pierwszawsza linia) | |
void Show_word_MovePosition2(char see_word); // procedura wyłwietlania poryszającego siê słowa w prawo (1 pierwszawsza linia) | |
char FCPosition[2] = {0, 64}; // zdefiniowanie First Column Position 16 pol; 2 w [] oznacza dwie pozycje (2linie((4 poz 4 linie))) 64- początek 2 linii | |
char positionString[4]; // numer pozycji kursora 2 oznacza długość słowa (numeru) wyświetralego | |
char see_word[16]; // zdefiniowanie wyświetlanego słowa w funkcji przewijania | |
void Check_LCD_Busy() // podprogram odpowiedzialny za sprawdzenie dostepu do wyświetlacza | |
{ | |
DataDir_LCDDBase = 0; | |
LCDControl |= 1<<ReadWrite; | |
LCDControl &= ~1<<BiPolar; | |
while (LCDDBase >= 0x80) // 0x80 0b1000000 | |
{ | |
LCD_Switch_On(); | |
} | |
DataDir_LCDDBase = 0xFF; // OxFF czyli 0b11111111 portu B | |
} | |
void LCD_Switch_On() // podprogram odpowiedzialny za włączenie wyświetlacza | |
{ | |
LCDControl |= 1<<LightSwitch; | |
asm volatile ("nop"); | |
asm volatile ("nop"); | |
LCDControl &= ~ 1<<LightSwitch; | |
} | |
void LCD_Switch_Off() // podprogram odpowiedzialny za wyłączenie wyświetlacza | |
{ | |
LCDControl &= ~ 1<<LightSwitch; | |
asm volatile ("nop"); | |
asm volatile ("nop"); | |
LCDControl |= 1<<LightSwitch; | |
//asm volatile ("nop"); | |
//LCDControl &= 0<<LightSwitch; | |
} | |
void Send_A_Command(unsigned char command) // podprogram odpowiedzialny za wysyłanie komend | |
{ | |
Check_LCD_Busy(); | |
LCDDBase = command; | |
LCDControl &= ~ (1<<ReadWrite | 1<<BiPolar); | |
LCD_Switch_On(); | |
LCDDBase = 0; | |
} | |
void Send_A_Character(unsigned char character) // podprogram odpowiedzialny za wysyłanie znaków | |
{ | |
Check_LCD_Busy(); | |
LCDDBase = character; | |
LCDControl &= ~ (1<<ReadWrite); | |
LCDControl |= 1<<BiPolar; | |
LCD_Switch_On(); | |
LCDDBase = 0; | |
} | |
void Send_A_String(char *StringOfCharacter) // podprogram odpowiedzialny za wysyłanie wyrazów | |
{ | |
while(*StringOfCharacter > 0) // jeżli *StringOfCharacters jest większe od zera | |
{ | |
Send_A_Character(*StringOfCharacter++); //++ tp to samo co:*StringOfCharacters = *StringOfCharacters +1 // ++ przed oznacza że zaczyna od i // ++ za oznacza że dąrzy do i | |
} | |
} | |
void Send_String_Located(uint8_t x,uint8_t y,char *StringOfCharacter) | |
{ | |
GotoLocation(x,y); | |
while(*StringOfCharacter > 0) // jeżli *StringOfCharacters jest większe od zera | |
{ | |
Send_A_Character(*StringOfCharacter++); //++ tp to samo co:*StringOfCharacters = *StringOfCharacters +1 // ++ przed oznacza że zaczyna od i // ++ za oznacza że dżrzy do i | |
} | |
} | |
void Clear_LCD_Scr() | |
{ | |
Send_A_Command(CLR_Scr); // clear screen | |
_delay_ms(2); | |
} | |
void InitializeLCD_On() // podprogram odpowiedzialny za inicjalizację (START) wyswietlacza | |
{ | |
DataDir_LCDControl |= 1<<LightSwitch | 1<<ReadWrite | 1<<BiPolar; | |
_delay_ms(15); | |
Send_A_Command(CLR_Scr); // clear screen | |
_delay_ms(2); | |
Send_A_Command(Dot8_L2B8); // set CGRAM address | |
_delay_us(50); | |
Send_A_Command(Display_On); // function set | |
_delay_us(50); | |
//asm volatile ("nop"); // opóźnienie włączenia o 200ms | |
//_delay_us(5); | |
} | |
void InitializeLCD_On1() // podprogram odpowiedzialny za inicjalizację (START) wyświetlacza | |
{ | |
DataDir_LCDControl |= 1<<LightSwitch | 1<<ReadWrite | 1<<BiPolar; | |
_delay_ms(15); | |
Send_A_Command(CLR_Scr); // clear screen | |
_delay_ms(2); | |
Send_A_Command(Dot8_L2B8); // set CGRAM address | |
_delay_us(50); | |
Send_A_Command(Display_On1); // function set | |
_delay_us(50); | |
//asm volatile ("nop"); // opóźnienie włączenia o 200ms | |
//_delay_us(5); | |
} | |
void InitializeLCD_On2() // podprogram odpowiedzialny za inicjalizację (START) wyswietlacza | |
{ | |
DataDir_LCDControl |= 1<<LightSwitch | 1<<ReadWrite | 1<<BiPolar; | |
_delay_ms(15); | |
Send_A_Command(CLR_Scr); // clear screen | |
_delay_ms(2); | |
Send_A_Command(Dot8_L2B8); // set CGRAM address | |
_delay_us(50); | |
Send_A_Command(Display_On2); // function set | |
_delay_us(50); | |
//asm volatile ("nop"); // opóźnienie włączenia o 200ms | |
//_delay_us(5); | |
} | |
void InitializeLCD_Off() // podprogram odpowiedzialny za inicjalizację (START) wyświetlacza | |
{ | |
asm volatile ("nop"); // opóżnienie włączenia o 200ms | |
_delay_ms(5); | |
Send_A_Command(CLR_Scr); // clear screen | |
_delay_ms(2); | |
Send_A_Command(Display_Off); // function set | |
_delay_us(50); | |
LCD_Switch_Off(); | |
_delay_ms(2); | |
} | |
void InitializeLCD_On_Test() // podprogram odpowiedzialny za inicjalizację (START) wyświetlacza | |
{ | |
DataDir_LCDControl |= 1<<ReadWrite | 1<<BiPolar; | |
_delay_ms(15); | |
Send_A_Command(CLR_Scr); // clear screen | |
_delay_ms(2); | |
Send_A_Command(Dot8_L2B8); // set CGRAM address | |
_delay_us(50); | |
Send_A_Command(Display_On); // function set | |
_delay_us(50); | |
//asm volatile ("nop"); // opóźnienie włączenia o 200ms | |
//_delay_us(5); | |
} | |
void Shift_LA() // podprogram przesunięcie całości w lewo | |
{ | |
Send_A_Command(Shift_All_Left); | |
_delay_ms(10); | |
} | |
void Shift_RA() // podprogram przesunięcie całości w prawo | |
{ | |
Send_A_Command(Shift_All_Right); // function set | |
_delay_ms(10); | |
} | |
void Shift_LC() // podprogram przesunięcie o jeden w lewo | |
{ | |
Send_A_Command(Shift_C_Left); // function set | |
_delay_ms(10); | |
} | |
void Shift_RC() // podprogram przesunięcie o jeden w prawo | |
{ | |
Send_A_Command(Shift_C_Right); // function set | |
_delay_ms(10); | |
} | |
void GotoLocation(uint8_t x,uint8_t y) // podprogram odpowiedzialny za przejście kursora do rządanego położenia | |
{ | |
Send_A_Command(0x80 + FCPosition[y-1] + (x-1)); | |
} | |
void Show_xy_Position() // procedura wyświetlania pozycji kursora (pętla) | |
{ | |
while(1) | |
{ | |
for(int y=1; y<=2 ; y++) | |
{ | |
for(int x=1; x<=16; x++) // for(init;condition;increment) | |
// init-zmniena intiger x; | |
// condition- długość poruszania się zmiennej x; // increment(decrement)- kierunek czyli x++ | |
{ | |
itoa(x,positionString, 10); | |
GotoLocation(5, 1); | |
Send_A_String("X = "); | |
Send_A_String(positionString); | |
itoa(y,positionString, 10); | |
GotoLocation(5, 2); | |
Send_A_String("Y = "); | |
Send_A_String(positionString); | |
GotoLocation(x, y); | |
Send_A_String("x"); | |
_delay_ms(20); | |
GotoLocation(x, y); | |
Send_A_String(" "); | |
itoa(x,positionString, 10); | |
GotoLocation(5, 1); | |
Send_A_String(" "); | |
itoa(y,positionString, 10); | |
GotoLocation(5, 2); | |
Send_A_String(" "); // ilość pustego miejsca zależy od znaków wyświetlanych ((6) pol) | |
} | |
} | |
} | |
} | |
void Show_word_MovePosition(char see_word) | |
{ | |
while(1) | |
{ | |
for(int y=1; y<=2 ; y++) | |
{ | |
for(int x=1; x<=16; x++) // for(init;condition;increment) | |
// init-zmniena intiger x; | |
// condition- dŁugoŚĆ poruszania się miennej x; | |
// increment(decrement)- kierunek czyli x++ | |
{ | |
GotoLocation(x, y); | |
Send_A_String(see_word); | |
_delay_ms(20); | |
GotoLocation(x, y); | |
Send_A_String(" "); | |
} | |
} | |
} | |
} | |
void Show_word_MovePosition1(char see_word) | |
{ | |
while(1) | |
{ | |
for(int y=1; y<=2 ; y) | |
{ | |
for(int x=1; x<=16; x++) // for(init;condition;increment) | |
// init-zmniena intiger x; | |
// condition- długość poruszania się zmiennej x; | |
// increment(decrement)- kierunek czyli x++ | |
{ | |
GotoLocation(x, y); | |
Send_A_String(see_word); | |
_delay_ms(20); | |
GotoLocation(x, y); | |
Send_A_String(" "); | |
} | |
} | |
} | |
} | |
void Show_word_MovePosition2(char see_word) | |
{ | |
while(1) | |
{ | |
for(int y=2; y<=2 ; y) | |
{ | |
for(int x=1; x<=16; x++) // for(init;condition;increment) | |
// init-zmniena intiger x; | |
// condition- długość poruszania się zmiennej x; | |
// increment(decrement)- kierunek czyli x++ | |
{ | |
GotoLocation(x, y); | |
Send_A_String(see_word); | |
_delay_ms(20); | |
GotoLocation(x, y); | |
Send_A_String(" "); | |
} | |
} | |
} | |
} | |
void booting_lcd() // Podprogram boot | |
{ | |
GotoLocation(7,1); | |
Send_A_String("BOOT"); | |
_delay_ms(40); | |
GotoLocation(1,2); | |
Send_A_String(">>"); | |
GotoLocation(15,2); | |
Send_A_String("<<"); | |
GotoLocation(3,2); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(10); | |
Send_A_String("."); | |
_delay_ms(15); | |
GotoLocation(1,1); | |
_delay_ms(3); | |
Clear_LCD_Scr(); | |
} | |
void sleep_lcd() // podprogram sleep | |
{ | |
_delay_ms(5); | |
GotoLocation(1,1); | |
Send_A_String(" "); | |
GotoLocation(1,2); | |
Send_A_String(" "); | |
GotoLocation(6,1); | |
Send_A_String("SLEEPS"); | |
_delay_ms(15); | |
GotoLocation(1,2); | |
Send_A_String(">>"); | |
GotoLocation(15,2); | |
Send_A_String("<<"); | |
GotoLocation(14,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(13,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(12,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(11,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(10,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(9,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(8,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(7,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(6,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(5,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(4,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(3,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(1,1); | |
_delay_ms(3); | |
Clear_LCD_Scr(); | |
InitializeLCD_Off(); | |
} | |
void wake_up_lcd() // podprogram wakeup | |
{ | |
_delay_ms(5); | |
InitializeLCD_On(); | |
GotoLocation(6,1); | |
Send_A_String("WAKE UP"); | |
_delay_ms(15); | |
GotoLocation(1,2); | |
Send_A_String(">>"); | |
GotoLocation(15,2); | |
Send_A_String("<<"); | |
GotoLocation(3,2); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
Send_A_String("."); | |
_delay_ms(5); | |
GotoLocation(1,1); | |
_delay_ms(3); | |
Clear_LCD_Scr(); | |
} | |
void welcome_lcd() // podprogram welcome | |
{ | |
_delay_ms(40); | |
InitializeLCD_On(); | |
GotoLocation(5,1); | |
Send_A_String("Welcome"); | |
Send_A_String(" "); | |
_delay_ms(100); | |
Clear_LCD_Scr(); | |
booting_lcd(); | |
Clear_LCD_Scr(); | |
} | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment