-
Notifications
You must be signed in to change notification settings - Fork 0
/
hd44780.c
234 lines (198 loc) · 5.14 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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/*
Wyświetlacz alfanumeryczny ze sterownikiem HD44780
Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości z dowolnym
przypisaniem sygnałów sterujących
Plik : HD44780.c
Mikrokontroler : Atmel AVR XMEGA
Kompilator : avr-gcc
Autor : Radosław Kwiecień
Źródło : http://radzio.dxp.pl/hd44780/
Data : 24.03.2007
Dostosowanie do procesorów XMEGA
Dominik Leon Bieczyński
Leon Instruments
http://leon-instruments.blogspot.com
Data: 24.01.2018
Dostowanie do płytki eXtrinoXL FULL [Atmel AVR XMEGA128A3U]
Paweł 'felixd' Wojciechowski
Outsourcing IT - Konopnickiej.Com
http://www.konopnickiej.com
*/
#include "hd44780.h"
#include <avr/pgmspace.h>
void _lcd_OutNibble(unsigned char nibbleToWrite)
{
if (nibbleToWrite & 0b00000001)
LCD_PORT.OUTSET = LCD_D4_bm;
else
LCD_PORT.OUTCLR = LCD_D4_bm;
if (nibbleToWrite & 0b00000010)
LCD_PORT.OUTSET = LCD_D5_bm;
else
LCD_PORT.OUTCLR = LCD_D5_bm;
if (nibbleToWrite & 0b00000100)
LCD_PORT.OUTSET = LCD_D6_bm;
else
LCD_PORT.OUTCLR = LCD_D6_bm;
if (nibbleToWrite & 0b00001000)
LCD_PORT.OUTSET = LCD_D7_bm;
else
LCD_PORT.OUTCLR = LCD_D7_bm;
}
void _lcd_Write(unsigned char dataToWrite)
{
LCD_PORT.OUTSET = LCD_E_bm;
_lcd_OutNibble(dataToWrite >> 4);
LCD_PORT.OUTCLR = LCD_E_bm;
asm volatile("nop");
LCD_PORT.OUTSET = LCD_E_bm;
_lcd_OutNibble(dataToWrite);
LCD_PORT.OUTCLR = LCD_E_bm;
_delay_us(50);
}
void LcdCommand(unsigned char commandToWrite)
{
LCD_RS_PORT.OUTCLR = LCD_RS_bm;
_lcd_Write(commandToWrite);
}
void LcdData(unsigned char dataToWrite)
{
LCD_RS_PORT.OUTSET = LCD_RS_bm;
_lcd_Write(dataToWrite);
}
void LcdWrite(char *text)
{
while (*text)
LcdData(*text++);
}
void LcdWriteProgmem(const char *data)
{
char bufor;
while ((bufor = (char)pgm_read_byte(data++)))
LcdData(bufor);
}
void LcdGoto(unsigned char x, unsigned char y)
{
LcdCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
}
void LcdClear(void)
{
LcdCommand(HD44780_CLEAR);
_delay_ms(2);
}
void LcdInit(void)
{
LCD_PORT.DIRSET = LCD_D4_bm |
LCD_D5_bm |
LCD_D6_bm |
LCD_D7_bm |
LCD_E_bm;
LCD_RS_PORT.DIRSET = LCD_RS_bm;
_delay_ms(5); // oczekiwanie na ustalibizowanie się napiecia zasilającego
LCD_RS_PORT.OUTCLR = LCD_RS_bm;
LCD_PORT.OUTCLR = LCD_E_bm;
for (uint8_t i = 0; i < 3; i++)
{ // trzykrotne powtórzenie bloku instrukcji
LCD_PORT.OUTSET = LCD_E_bm;
_lcd_OutNibble(0x03); // tryb 8-bitowy
LCD_PORT.OUTCLR = LCD_E_bm;
_delay_ms(5); // czekaj 5ms
}
LCD_PORT.OUTSET = LCD_E_bm;
_lcd_OutNibble(0x02); // tryb 4-bitowy
LCD_PORT.OUTCLR = LCD_E_bm;
_delay_ms(1); // czekaj 1ms
LcdCommand(
HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
LcdCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
LcdCommand(HD44780_CLEAR); // czyszczenie zawartości pamięci DDRAM
_delay_ms(2);
LcdCommand(
HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT); // inkrementaja adresu i przesuwanie kursora
LcdCommand(
HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
}
void LcdDec(uint32_t liczba)
{
if (liczba == 0)
{
LcdData('0');
return;
}
uint8_t cyfra[10];
int8_t i = 0;
while (liczba)
{
cyfra[i] = (uint8_t)(liczba % 10);
liczba = liczba / 10;
++i;
}
--i;
for (; i >= 0; --i)
{
LcdData(cyfra[i] + 48);
}
}
uint8_t LcdDecComma(int32_t liczba, uint8_t po_przecinku)
{
if (liczba == 0)
{
LcdData('0');
if (po_przecinku != 0)
LcdData(',');
while (po_przecinku)
{
LcdData('0');
po_przecinku--;
}
return 0;
}
uint8_t cyfra[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int8_t i = 0;
if (liczba < 0)
{
LcdData('-');
liczba = -liczba;
}
while (liczba)
{
cyfra[i] = (uint8_t)(liczba % 10);
liczba = liczba / 10;
++i;
}
if (i > po_przecinku)
--i;
else
i = po_przecinku;
for (; i >= 0; --i)
{
if (i == po_przecinku - 1)
LcdData(',');
LcdData(cyfra[i] + 48);
}
return 0;
}
void LcdBin(uint8_t liczba)
{
if (liczba == 0)
{
Lcd("00000000");
return;
}
uint8_t cyfra[8];
int8_t i;
for (i = 7; i >= 0; --i)
{
cyfra[i] = liczba % 2;
liczba = liczba / 2;
}
for (i = 0; i < 8; ++i)
{
LcdData(cyfra[i] + 48);
}
}
//-------------------------------------------------------------------------------------------------
//
// Koniec pliku HD44780.c
//
//-------------------------------------------------------------------------------------------------