LCD-Routine.c


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
}