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 <Header_LCD.h>
|
7 | #include <avr/io.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_COM_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_COM_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen
|
39 |
|
40 | // temp1 = temp1 >> 4; // oberes Nibble holen
|
41 | // temp1 = temp1 & 0x0F; // maskieren
|
42 | LCD_PORT &= 0x00;
|
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_ms(1);//??????????????????????
|
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_COM_PORT |= (1<<LCD_EN);
|
60 | _delay_ms(1); // kurze Pause
|
61 | // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern
|
62 | // http://www.mikrocontroller.net/topic/80900
|
63 | LCD_COM_PORT &= ~(1<<LCD_EN);
|
64 | }
|
65 |
|
66 | // Initialisierung:
|
67 | // Muss ganz am Anfang des Programms aufgerufen werden.
|
68 |
|
69 |
|
70 |
|
71 | void lcd_init(void)
|
72 | {
|
73 | LCD_DDR = LCD_DDR | 0xFF; // Port auf Ausgang schalten
|
74 | LCD_COM_DDR = (1<<LCD_RS) | (1<<LCD_EN);
|
75 |
|
76 | // muss 3mal hintereinander gesendet werden zur Initialisierung
|
77 |
|
78 | _delay_ms(15);
|
79 | LCD_PORT &= 0x00;
|
80 | LCD_PORT |= 0x30;
|
81 | LCD_COM_PORT &= ~(1<<LCD_RS); // RS auf 0
|
82 | lcd_enable();
|
83 |
|
84 | _delay_ms(5);
|
85 | lcd_enable();
|
86 |
|
87 | _delay_ms(5);
|
88 | lcd_enable();
|
89 | _delay_ms(5);
|
90 |
|
91 | // 4 Bit Modus aktivieren
|
92 | LCD_PORT &= 0x00;
|
93 | LCD_PORT |= 0x30;
|
94 | lcd_enable();
|
95 | _delay_ms(5);
|
96 |
|
97 | // 8Bit / 2 Zeilen / 5x7
|
98 | lcd_command(0x38);
|
99 |
|
100 | // Display ein / Cursor aus / kein Blinken
|
101 | lcd_command(0x0C);
|
102 |
|
103 | // inkrement / kein Scrollen
|
104 | lcd_command(0x06);
|
105 |
|
106 | lcd_clear();
|
107 | }
|
108 |
|
109 | // Sendet den Befehl zur Löschung des Displays
|
110 |
|
111 | void lcd_clear(void)
|
112 | {
|
113 | lcd_command(CLEAR_DISPLAY);
|
114 | _delay_ms(5);
|
115 | }
|
116 |
|
117 | // Sendet den Befehl: Cursor Home
|
118 |
|
119 | void lcd_home(void)
|
120 | {
|
121 | lcd_command(CURSOR_HOME);
|
122 | _delay_ms(5);
|
123 | }
|
124 |
|
125 | // setzt den Cursor in Zeile y (1..4) Spalte x (0..15)
|
126 |
|
127 | void set_cursor(uint8_t x, uint8_t y)
|
128 | {
|
129 | uint8_t tmp;
|
130 |
|
131 | switch (y) {
|
132 | case 1: tmp=0x80+0x00+x; break; // 1. Zeile
|
133 | case 2: tmp=0x80+0x40+x; break; // 2. Zeile
|
134 | case 3: tmp=0x80+0x10+x; break; // 3. Zeile
|
135 | case 4: tmp=0x80+0x50+x; break; // 4. Zeile
|
136 | }
|
137 | lcd_command(tmp);
|
138 | }
|
139 |
|
140 | // Schreibt einen String auf das LCD
|
141 |
|
142 | void lcd_string(char *data)
|
143 | {
|
144 | while(*data) {
|
145 | lcd_data(*data);
|
146 | data++;
|
147 | }
|
148 | }
|