-
Notifications
You must be signed in to change notification settings - Fork 0
/
hd44780.c
152 lines (110 loc) · 3.65 KB
/
hd44780.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#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óżniania instrukcja/dane).
void _LCD_Write(unsigned char dataToWrite)
{
_LCD_OutNibble(dataToWrite >> 4);
LCD_E_PORT |= LCD_E;
LCD_E_PORT &= ~LCD_E;
_LCD_OutNibble(dataToWrite);
LCD_E_PORT |= LCD_E;
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świetlania napisu na wyświetlaczu.
void LCD_WriteText(char * text)
{
int i = 0;
while( text[i] ){
LCD_WriteData( text[i++] );
}
}
// Funkcja ustawienia współrzędnych ekranowych
void LCD_Pos(unsigned char x, unsigned char y)
{
LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
}
// Funkcja wyświetlania napisu na wyświetlaczu.
void LCD_WriteTextPos(char * text, unsigned char x, unsigned char y)
{
LCD_Pos(x, y);
int i = 0;
while( text[i] ){
LCD_WriteData( text[i++] );
}
}
// 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; //
_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_OutNibble(0x03); // tryb 8-bitowy
LCD_E_PORT |= LCD_E; // E = 1
LCD_E_PORT &= ~LCD_E; // E = 0
_delay_ms(5); // czekaj 5ms
}
_LCD_OutNibble(0x02); // tryb 4-bitowy
LCD_E_PORT |= LCD_E; // E = 1
LCD_E_PORT &= ~LCD_E; // E = 0
_delay_ms(2); // 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
_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