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
|