Skip to content

Instantly share code, notes, and snippets.

@gammels
Last active October 16, 2023 17:04
Show Gist options
  • Save gammels/c6f59814764deaf32a1ef459ff258781 to your computer and use it in GitHub Desktop.
Save gammels/c6f59814764deaf32a1ef459ff258781 to your computer and use it in GitHub Desktop.
/*
* 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