1 | // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
|
2 | // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
|
3 | //
|
4 | // Die Pinbelegung ist über defines in lcd-routines.h einstellbar
|
5 |
|
6 | #include <avr/io.h>
|
7 | #include "lcd-routines.h"
|
8 | #include <util/delay.h>
|
9 |
|
10 | // sendet ein Datenbyte an das LCD
|
11 |
|
12 | void lcd_data(unsigned char temp1)
|
13 | {
|
14 | unsigned char temp2 = temp1;
|
15 |
|
16 | LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen
|
17 |
|
18 | temp1 = temp1 >> 4;
|
19 | temp1 = temp1 & 0x0F;
|
20 | LCD_PORT &= 0xF0;
|
21 | LCD_PORT |= temp1; // setzen
|
22 | lcd_enable();
|
23 |
|
24 | temp2 = temp2 & 0x0F;
|
25 | LCD_PORT &= 0xF0;
|
26 | LCD_PORT |= temp2; // setzen
|
27 | lcd_enable();
|
28 |
|
29 | _delay_us(42);
|
30 | }
|
31 |
|
32 | // sendet einen Befehl an das LCD
|
33 |
|
34 | void lcd_command(unsigned char temp1)
|
35 | {
|
36 | unsigned char temp2 = temp1;
|
37 |
|
38 | LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen
|
39 |
|
40 | temp1 = temp1 >> 4; // oberes Nibble holen
|
41 | temp1 = temp1 & 0x0F; // maskieren
|
42 | LCD_PORT &= 0xF0;
|
43 | LCD_PORT |= temp1; // setzen
|
44 | lcd_enable();
|
45 |
|
46 | temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren
|
47 | LCD_PORT &= 0xF0;
|
48 | LCD_PORT |= temp2; // setzen
|
49 | lcd_enable();
|
50 |
|
51 | _delay_us(42);
|
52 | }
|
53 |
|
54 | // erzeugt den Enable-Puls
|
55 | void lcd_enable(void)
|
56 | {
|
57 | // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers einfügen
|
58 | // http://www.mikrocontroller.net/topic/81974#685882
|
59 | LCD_PORT |= 1<<LCD_EN;
|
60 | _delay_us(1); // kurze Pause
|
61 | // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern
|
62 | // http://www.mikrocontroller.net/topic/80900
|
63 | LCD_PORT &= ~1<<LCD_EN;
|
64 | }
|
65 |
|
66 | // Initialisierung:
|
67 | // Muss ganz am Anfang des Programms aufgerufen werden.
|
68 |
|
69 | void lcd_init(void)
|
70 | {
|
71 | LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | 1<<LCD_EN ; // Port auf Ausgang schalten
|
72 |
|
73 | // muss 3mal hintereinander gesendet werden zur Initialisierung
|
74 |
|
75 | _delay_ms(15);
|
76 | LCD_PORT &= 0xF0;
|
77 | LCD_PORT |= 0x03;
|
78 | LCD_PORT &= ~(1<<LCD_RS); // RS auf 0
|
79 | lcd_enable();
|
80 |
|
81 | _delay_ms(5);
|
82 | lcd_enable();
|
83 |
|
84 | _delay_ms(1);
|
85 | lcd_enable();
|
86 | _delay_ms(1);
|
87 |
|
88 | // 4 Bit Modus aktivieren
|
89 | LCD_PORT &= 0xF0;
|
90 | LCD_PORT |= 0x02;
|
91 | lcd_enable();
|
92 | _delay_ms(1);
|
93 |
|
94 | // 4Bit / 2 Zeilen / 5x7
|
95 | lcd_command(0x28);
|
96 |
|
97 | // Display ein / Cursor aus / kein Blinken
|
98 | lcd_command(0x0C);
|
99 |
|
100 | // inkrement / kein Scrollen
|
101 | lcd_command(0x06);
|
102 |
|
103 | lcd_clear();
|
104 | }
|
105 |
|
106 | // Sendet den Befehl zur Löschung des Displays
|
107 |
|
108 | void lcd_clear(void)
|
109 | {
|
110 | lcd_command(CLEAR_DISPLAY);
|
111 | _delay_ms(5);
|
112 | }
|
113 |
|
114 | // Sendet den Befehl: Cursor Home
|
115 |
|
116 | void lcd_home(void)
|
117 | {
|
118 | lcd_command(CURSOR_HOME);
|
119 | _delay_ms(5);
|
120 | }
|
121 |
|
122 | // setzt den Cursor in Zeile y (1..4) Spalte x (0..15)
|
123 |
|
124 | void set_cursor(uint8_t x, uint8_t y)
|
125 | {
|
126 | uint8_t tmp;
|
127 |
|
128 | switch (y) {
|
129 | case 1: tmp=0x80+0x00+x; break; // 1. Zeile
|
130 | case 2: tmp=0x80+0x40+x; break; // 2. Zeile
|
131 | case 3: tmp=0x80+0x10+x; break; // 3. Zeile
|
132 | case 4: tmp=0x80+0x50+x; break; // 4. Zeile
|
133 | }
|
134 | lcd_command(tmp);
|
135 | }
|
136 |
|
137 | // Schreibt einen String auf das LCD
|
138 |
|
139 | void lcd_string(char *data)
|
140 | {
|
141 | while(*data) {
|
142 | lcd_data(*data);
|
143 | data++;
|
144 | }
|
145 | }
|
146 |
|
147 |
|
148 |
|
149 | int main(void)
|
150 | {
|
151 | lcd_init();
|
152 |
|
153 | lcd_data('T');
|
154 | lcd_data('e');
|
155 | lcd_data('s');
|
156 | lcd_data('t');
|
157 |
|
158 | set_cursor(0,2);
|
159 |
|
160 | lcd_string("Hello World!");
|
161 |
|
162 | while(1)
|
163 | {
|
164 | }
|
165 |
|
166 | return 0;
|
167 | }
|