lcd.h


1
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
2
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
3
//
4
 
5
#ifndef LCD_ROUTINES_H
6
#define LCD_ROUTINES_H
7
 
8
#include <avr/pgmspace.h>
9
 
10
////////////////////////////////////////////////////////////////////////////////
11
// Pinbelegung für das LCD, an verwendete Pins anpassen
12
// alle Pins müssen in einem Port liegen
13
// die 4 Bit für die Daten müssen zusammenliegen, können aber an einer
14
// beliebigen Postion anfangen  
15
 
16
#ifndef LCD_PORTS
17
#define LCD_PORTS
18
 
19
#define LCD_PORT      PORTB
20
#define LCD_DDR       DDRB
21
 
22
// 4 Bit LCD Datenbus DB4-DB7, das unterste Bit DB4 kann auf den Portbits 0..4 liegen
23
 
24
//  LCD DB4-DB7 <-->  PORTC Bit PC0-PC3
25
#define LCD_DB        PB0
26
 
27
// LCD Steuersignale RS und EN
28
 
29
//  LCD RS      <-->  PORTC Bit PC4     (RS: 0=Data, 1=Command)
30
#define LCD_RS        PB4
31
 
32
//  LCD EN      <-->  PORTC Bit PC5     (EN: 1-Impuls für Daten)
33
#define LCD_EN        PB5
34
 
35
#endif // LCD_PORTS
36
 
37
////////////////////////////////////////////////////////////////////////////////
38
// LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)
39
 
40
#ifndef LCD_TIMINGS
41
#define LCD_TIMINGS
42
 
43
#define LCD_BOOTUP_MS           15
44
#define LCD_ENABLE_US           1
45
#define LCD_WRITEDATA_US        46
46
#define LCD_COMMAND_US          42
47
 
48
#define LCD_SOFT_RESET_MS1      5
49
#define LCD_SOFT_RESET_MS2      1
50
#define LCD_SOFT_RESET_MS3      1
51
#define LCD_SET_4BITMODE_MS     5
52
 
53
#define LCD_CLEAR_DISPLAY_MS    2
54
#define LCD_CURSOR_HOME_MS      2
55
 
56
#endif // LCD_TIMINGS
57
 
58
////////////////////////////////////////////////////////////////////////////////
59
// Zeilendefinitionen des verwendeten LCD
60
// die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen passen
61
// bei anderen Zeilenlängen müssen diese Einträge angepasst werden
62
 
63
#define LCD_DDADR_LINE1         0x00
64
#define LCD_DDADR_LINE2         0x40
65
#define LCD_DDADR_LINE3         0x10
66
#define LCD_DDADR_LINE4         0x50
67
 
68
////////////////////////////////////////////////////////////////////////////////
69
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
70
void lcd_init( void );
71
 
72
////////////////////////////////////////////////////////////////////////////////
73
// LCD löschen
74
void lcd_clear( void );
75
 
76
////////////////////////////////////////////////////////////////////////////////
77
// Cursor in die erste Zeile, erste Spalte (Position 0,0)
78
void lcd_home( void );
79
 
80
////////////////////////////////////////////////////////////////////////////////
81
// Cursor an eine beliebige Position 
82
void lcd_setcursor( uint8_t x, uint8_t y );
83
 
84
////////////////////////////////////////////////////////////////////////////////
85
// Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition 
86
void lcd_data( uint8_t data );
87
 
88
////////////////////////////////////////////////////////////////////////////////
89
// Ausgabe eines Strings an der aktuellen Cursorposition 
90
// String liegt im RAM
91
void lcd_string( const char *data );
92
 
93
////////////////////////////////////////////////////////////////////////////////
94
// Ausgabe eines Strings an einer bestimmten Cursorposition 
95
// String liegt im RAM
96
void lcd_string_xy( uint8_t x, uint8_t y, const char *data );
97
 
98
////////////////////////////////////////////////////////////////////////////////
99
// Ausgabe einer Zahl an der aktuellen Cursorposition 
100
// Zahl liegt im RAM
101
void lcd_number( uint8_t number, uint8_t len, uint8_t fill );
102
 
103
////////////////////////////////////////////////////////////////////////////////
104
// Ausgabe einer Zahl an einer bestimmten Cursorposition 
105
// Zahl liegt im RAM
106
void lcd_number_xy( uint8_t x, uint8_t y, uint8_t number, uint8_t len, uint8_t fill );
107
 
108
////////////////////////////////////////////////////////////////////////////////
109
// Ausgabe eines Strings an der aktuellen Cursorposition
110
// String liegt im Flash 
111
void lcd_string_P( PGM_P data );
112
 
113
////////////////////////////////////////////////////////////////////////////////
114
// Definition eines benutzerdefinierten Sonderzeichens.
115
// data muss auf ein Array mit den Zeilencodes des zu definierenden Zeichens
116
// zeigen, Daten liegen im RAM
117
void lcd_generatechar( uint8_t code, const uint8_t *data, uint8_t lines );
118
 
119
////////////////////////////////////////////////////////////////////////////////
120
// Definition eines benutzerdefinierten Sonderzeichens.
121
// data muss auf ein Array mit den Zeilencodes des zu definierenden Zeichens
122
// zeigen, Daten liegen im FLASH
123
void lcd_generatechar_P( uint8_t code, PGM_P data, uint8_t lines );
124
 
125
////////////////////////////////////////////////////////////////////////////////
126
// Ausgabe eines Kommandos an das LCD.
127
void lcd_command( uint8_t data );
128
 
129
////////////////////////////////////////////////////////////////////////////////
130
// LCD Befehle und Argumente.
131
// zur Verwendung in lcd_command
132
 
133
// Clear Display -------------- 0b00000001
134
#define LCD_CLEAR_DISPLAY       0x01
135
 
136
// Cursor Home ---------------- 0b0000001x
137
#define LCD_CURSOR_HOME         0x02
138
 
139
// Set Entry Mode ------------- 0b000001xx
140
#define LCD_SET_ENTRY           0x04
141
 
142
#define LCD_ENTRY_DECREASE      0x00
143
#define LCD_ENTRY_INCREASE      0x02
144
#define LCD_ENTRY_NOSHIFT       0x00
145
#define LCD_ENTRY_SHIFT         0x01
146
 
147
// Set Display ---------------- 0b00001xxx
148
#define LCD_SET_DISPLAY         0x08
149
 
150
#define LCD_DISPLAY_OFF         0x00
151
#define LCD_DISPLAY_ON          0x04
152
#define LCD_CURSOR_OFF          0x00
153
#define LCD_CURSOR_ON           0x02
154
#define LCD_BLINKING_OFF        0x00
155
#define LCD_BLINKING_ON         0x01
156
 
157
// Set Shift ------------------ 0b0001xxxx
158
#define LCD_SET_SHIFT           0x10
159
 
160
#define LCD_CURSOR_MOVE         0x00
161
#define LCD_DISPLAY_SHIFT       0x08
162
#define LCD_SHIFT_LEFT          0x00
163
#define LCD_SHIFT_RIGHT         0x01
164
 
165
// Set Function --------------- 0b001xxxxx
166
#define LCD_SET_FUNCTION        0x20
167
 
168
#define LCD_FUNCTION_4BIT       0x00
169
#define LCD_FUNCTION_8BIT       0x10
170
#define LCD_FUNCTION_1LINE      0x00
171
#define LCD_FUNCTION_2LINE      0x08
172
#define LCD_FUNCTION_5X7        0x00
173
#define LCD_FUNCTION_5X10       0x04
174
 
175
#define LCD_SOFT_RESET          0x30
176
 
177
// Set CG RAM Address --------- 0b01xxxxxx  (Character Generator RAM)
178
#define LCD_SET_CGADR           0x40
179
 
180
#define LCD_GC_CHAR0            0
181
#define LCD_GC_CHAR1            1
182
#define LCD_GC_CHAR2            2
183
#define LCD_GC_CHAR3            3
184
#define LCD_GC_CHAR4            4
185
#define LCD_GC_CHAR5            5
186
#define LCD_GC_CHAR6            6
187
#define LCD_GC_CHAR7            7
188
 
189
// Set DD RAM Address --------- 0b1xxxxxxx  (Display Data RAM)
190
#define LCD_SET_DDADR           0x80
191
 
192
 
193
#endif // LCD_ROUTINES_H