lcd-routines.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
////////////////////////////////////////////////////////////////////////////////
9
// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!
10
 
11
#ifndef F_CPU
12
#define F_CPU 16000000
13
#endif
14
 
15
////////////////////////////////////////////////////////////////////////////////
16
// Pinbelegung für das LCD, an verwendete Pins anpassen
17
// Alle LCD Pins müssen an einem Port angeschlossen sein und die 4
18
// Datenleitungen müssen auf aufeinanderfolgenden Pins liegen
19
 
20
//  LCD DB4-DB7 <-->  PORTD Bit PD0-PD3
21
#define LCD_PORT      PORTD
22
#define LCD_DDR       DDRD
23
#define LCD_DB        PD0
24
25
//  LCD RS      <-->  PORTD Bit PD6     (RS: 1=Data, 0=Command)
26
#define LCD_RS        PD6
27
28
//  LCD EN      <-->  PORTD Bit PD4     (EN: 1-Impuls für Daten)
29
#define LCD_EN        PD4
30
31
32
33
34
35
36
 
37
////////////////////////////////////////////////////////////////////////////////
38
// LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)
39
 
40
#define LCD_BOOTUP_MS           15 //15
41
#define LCD_ENABLE_US           20//20
42
#define LCD_WRITEDATA_US        46//46
43
#define LCD_COMMAND_US          42//42
44
 
45
#define LCD_SOFT_RESET_MS1      5//5
46
#define LCD_SOFT_RESET_MS2      1//1
47
#define LCD_SOFT_RESET_MS3      1//1
48
#define LCD_SET_4BITMODE_MS     5//5
49
 
50
#define LCD_CLEAR_DISPLAY_MS    2//2
51
#define LCD_CURSOR_HOME_MS      2//2
52
 
53
////////////////////////////////////////////////////////////////////////////////
54
// Zeilendefinitionen des verwendeten LCD
55
// Die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen passen
56
// Bei anderen Zeilenlängen müssen diese Einträge angepasst werden
57
 
58
#define LCD_DDADR_LINE1        0x00 //0x00
59
#define LCD_DDADR_LINE2        0x40 //0x40
60
#define LCD_DDADR_LINE3        0x14 //0x10
61
#define LCD_DDADR_LINE4        0x54 //0x50
62
 
63
////////////////////////////////////////////////////////////////////////////////
64
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
65
void lcd_init( void );
66
 
67
////////////////////////////////////////////////////////////////////////////////
68
// LCD löschen
69
void lcd_clear( void );
70
 
71
////////////////////////////////////////////////////////////////////////////////
72
// Cursor in die 1. Zeile, 0-te Spalte
73
void lcd_home( void );
74
 
75
////////////////////////////////////////////////////////////////////////////////
76
// Cursor an eine beliebige Position 
77
void lcd_setcursor( uint8_t spalte, uint8_t zeile );
78
 
79
////////////////////////////////////////////////////////////////////////////////
80
// Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition 
81
void lcd_data( uint8_t data );
82
83
////////////////////////////////////////////////////////////////////////////////
84
85
86
 
87
////////////////////////////////////////////////////////////////////////////////
88
// Ausgabe eines Strings an der aktuellen Cursorposition 
89
void lcd_string( const char *data );
90
 
91
////////////////////////////////////////////////////////////////////////////////
92
// Definition eines benutzerdefinierten Sonderzeichens.
93
// data muss auf ein Array[5] mit den Spaltencodes des zu definierenden Zeichens
94
// zeigen
95
void lcd_generatechar( uint8_t code, const uint8_t *data );
96
 
97
////////////////////////////////////////////////////////////////////////////////
98
// Ausgabe eines Kommandos an das LCD.
99
void lcd_command( uint8_t data );
100
 
101
 
102
////////////////////////////////////////////////////////////////////////////////
103
// LCD Befehle und Argumente.
104
// Zur Verwendung in lcd_command
105
 
106
// Clear Display -------------- 0b00000001
107
#define LCD_CLEAR_DISPLAY       0x01
108
 
109
// Cursor Home ---------------- 0b0000001x
110
#define LCD_CURSOR_HOME         0x02
111
 
112
// Set Entry Mode ------------- 0b000001xx
113
#define LCD_SET_ENTRY           0x04
114
 
115
#define LCD_ENTRY_DECREASE      0x00
116
#define LCD_ENTRY_INCREASE      0x02
117
#define LCD_ENTRY_NOSHIFT       0x00
118
#define LCD_ENTRY_SHIFT         0x01
119
 
120
// Set Display ---------------- 0b00001xxx
121
#define LCD_SET_DISPLAY         0x08
122
 
123
#define LCD_DISPLAY_OFF         0x00
124
#define LCD_DISPLAY_ON          0x04
125
#define LCD_CURSOR_OFF          0x00
126
#define LCD_CURSOR_ON           0x02
127
#define LCD_BLINKING_OFF        0x00
128
#define LCD_BLINKING_ON         0x01
129
 
130
// Set Shift ------------------ 0b0001xxxx
131
#define LCD_SET_SHIFT           0x10
132
 
133
#define LCD_CURSOR_MOVE         0x00
134
#define LCD_DISPLAY_SHIFT       0x08
135
#define LCD_SHIFT_LEFT          0x00
136
#define LCD_SHIFT_RIGHT         0x04
137
 
138
// Set Function --------------- 0b001xxxxx
139
#define LCD_SET_FUNCTION        0x20
140
 
141
#define LCD_FUNCTION_4BIT       0x00
142
#define LCD_FUNCTION_8BIT       0x10
143
#define LCD_FUNCTION_1LINE      0x00
144
#define LCD_FUNCTION_2LINE      0x08
145
#define LCD_FUNCTION_5X7        0x00
146
#define LCD_FUNCTION_5X10       0x04
147
 
148
#define LCD_SOFT_RESET          0x30
149
 
150
// Set CG RAM Address --------- 0b01xxxxxx  (Character Generator RAM)
151
#define LCD_SET_CGADR           0x40
152
 
153
#define LCD_GC_CHAR0            0
154
#define LCD_GC_CHAR1            1
155
#define LCD_GC_CHAR2            2
156
#define LCD_GC_CHAR3            3
157
#define LCD_GC_CHAR4            4
158
#define LCD_GC_CHAR5            5
159
#define LCD_GC_CHAR6            6
160
#define LCD_GC_CHAR7            7
161
 
162
// Set DD RAM Address --------- 0b1xxxxxxx  (Display Data RAM)
163
#define LCD_SET_DDADR           0x80
164
 
165
#endif 
166
167
168
#if DEFAULT_TABLE
169
 // Standard conversion table used by most displays
170
 switch(ps)
171
  {
172
   case 'ä' : ps = 0xE1; break;
173
   case 'ö' : ps = 0xEF; break;
174
   case 'ü' : ps = 0xF5; break;
175
   case 'ß' : ps = 0xE2; break;
176
   case '°' : ps = 0xDF; break;
177
   case 'µ' : ps = 0xE4; break;
178
  }
179
#endif