1 | //********************************************************************************
|
2 | // sendet ein Datenbyte an das LCD
|
3 |
|
4 | void lcd_data(unsigned char data8){
|
5 |
|
6 | LCD_RSP |= (1<<LCD_RS); // RS auf 1 setzen
|
7 |
|
8 | setPin();
|
9 | if(data8 & 128)LCD_D3P |=(1<<LCD_D3); //hi nibbels
|
10 | if(data8 & 64)LCD_D2P |=(1<<LCD_D2);
|
11 | if(data8 & 32)LCD_D1P |=(1<<LCD_D1);
|
12 | if(data8 & 16)LCD_D0P |=(1<<LCD_D0);
|
13 | lcd_enable();
|
14 |
|
15 | setPin();
|
16 | if(data8 & 8)LCD_D3P |=(1<<LCD_D3); //low nibbels
|
17 | if(data8 & 4)LCD_D2P |=(1<<LCD_D2);
|
18 | if(data8 & 2)LCD_D1P |=(1<<LCD_D1);
|
19 | if(data8 & 1)LCD_D0P |=(1<<LCD_D0);
|
20 | lcd_enable();
|
21 |
|
22 | waitms(1);
|
23 | }
|
24 |
|
25 | //********************************************************************************
|
26 | //rücksetzen der Daten pins
|
27 |
|
28 | void setPin(void){
|
29 |
|
30 | LCD_D3P &= ~(1<<LCD_D3);
|
31 | LCD_D2P &= ~(1<<LCD_D2);
|
32 | LCD_D1P &= ~(1<<LCD_D1);
|
33 | LCD_D0P &= ~(1<<LCD_D0);
|
34 | }
|
35 |
|
36 | //********************************************************************************
|
37 | // sendet einen Befehl an das LCD
|
38 |
|
39 | void lcd_command(unsigned char cmd8){
|
40 |
|
41 | LCD_RSP &= ~(1<<LCD_RS); // RS auf 0 setzen
|
42 |
|
43 | setPin();
|
44 | if(cmd8 & 128)LCD_D3P |=(1<<LCD_D3); //hi nibbels
|
45 | if(cmd8 & 64)LCD_D2P |=(1<<LCD_D2);
|
46 | if(cmd8 & 32)LCD_D1P |=(1<<LCD_D1);
|
47 | if(cmd8 & 16)LCD_D0P |=(1<<LCD_D0);
|
48 | lcd_enable();
|
49 |
|
50 | setPin();
|
51 | if(cmd8 & 8)LCD_D3P |=(1<<LCD_D3); //low nibbels
|
52 | if(cmd8 & 4)LCD_D2P |=(1<<LCD_D2);
|
53 | if(cmd8 & 2)LCD_D1P |=(1<<LCD_D1);
|
54 | if(cmd8 & 1)LCD_D0P |=(1<<LCD_D0);
|
55 | lcd_enable();
|
56 |
|
57 | waitms(1);
|
58 | }
|
59 |
|
60 | //********************************************************************************
|
61 | // erzeugt den Enable-Puls
|
62 |
|
63 | void lcd_enable(void)
|
64 | {
|
65 | LCD_ENP |= (1<<LCD_EN); // kurze Pause (?!?)
|
66 | LCD_ENP &= ~(1<<LCD_EN);
|
67 | }
|
68 |
|
69 | //********************************************************************************
|
70 | // Initialisierung:
|
71 | // Muss ganz am Anfang des Programms aufgerufen werden.
|
72 |
|
73 | void lcd_init(void)
|
74 | {
|
75 | LCD_RSDDR |= (1<<LCD_RS); //initial der ports (ausgänge schalten)
|
76 | LCD_ENDDR |= (1<<LCD_EN);
|
77 | LCD_D3DDR |=(1<<LCD_D3);
|
78 | LCD_D2DDR |=(1<<LCD_D2);
|
79 | LCD_D1DDR |=(1<<LCD_D1);
|
80 | LCD_D0DDR |=(1<<LCD_D0);
|
81 |
|
82 | // muss 3mal hintereinander gesendet werden zur Initialisierung
|
83 |
|
84 | waitms(15); //nach power on warten..
|
85 |
|
86 | setPin();
|
87 | LCD_D1P |=(1<<LCD_D1);
|
88 | LCD_D0P |=(1<<LCD_D0);
|
89 | LCD_RSP &= ~(1<<LCD_RS); // RS auf 0
|
90 | lcd_enable(); //1.
|
91 | waitms(5);
|
92 |
|
93 | lcd_enable(); //2.
|
94 | waitms(1);
|
95 |
|
96 | lcd_enable(); //3.
|
97 | waitms(1);
|
98 |
|
99 |
|
100 | setPin(); // 4 Bit Modus aktivieren
|
101 | LCD_D2P |= (1<<LCD_D2);
|
102 | lcd_enable();
|
103 | waitms(1);
|
104 |
|
105 | lcd_command(0x28); // 4Bit / 2 Zeilen / 5x7 char größe
|
106 |
|
107 | lcd_command(0x0C); // Display ein / Cursor aus / kein Blinken
|
108 |
|
109 | lcd_command(0x06); // inkrement / kein Scrollen
|
110 |
|
111 | lcd_clear();
|
112 | }
|
113 |
|
114 | //********************************************************************************
|
115 | // Sendet den Befehl zur Löschung des Displays
|
116 |
|
117 | void lcd_clear(void)
|
118 | {
|
119 | lcd_command(CLEAR_DISPLAY);
|
120 | waitms(5);
|
121 | }
|
122 |
|
123 | //********************************************************************************
|
124 | // Sendet den Befehl: Cursor Home
|
125 |
|
126 | void lcd_home(void)
|
127 | {
|
128 | lcd_command(CURSOR_HOME);
|
129 | waitms(5);
|
130 | }
|
131 |
|
132 | //********************************************************************************
|
133 | // setzt den Cursor in Zeile y (1..2) Spalte x (0..15)
|
134 |
|
135 | void set_cursor(uint8_t x, uint8_t y)
|
136 | {
|
137 | uint8_t tmp=0;
|
138 |
|
139 | switch (y) {
|
140 | case 1: tmp=0x80+0x00+x; break; // 1. Zeile
|
141 | case 2: tmp=0x80+0x40+x; break; // 2. Zeile
|
142 | }
|
143 | lcd_command(tmp);
|
144 | }
|
145 |
|
146 | //********************************************************************************
|
147 | // Schreibt einen String auf das LCD
|
148 |
|
149 | void lcd_string(char *data)
|
150 | {
|
151 | while(*data) {
|
152 | lcd_data(*data);
|
153 | data++;
|
154 | }
|
155 | }
|