1 | /*
|
2 |
|
3 | LCD-Routinen für Pollin Addonboard 1.0
|
4 | --------------------------------------
|
5 |
|
6 | Code kann ohne Einschränkungen verwendet werden.
|
7 | Es müssen alle 11 Jumper auf dem Board gesetz sein, damit es funktioniert.
|
8 | Wurde mit Evaluation board 2.01 und einem ATMega32 erfolgreich getestet
|
9 | Es können im Moment nur Zeichen, Zeichenketten, hexadezimale Zahlen und natürliche Zahlen bis 255 geschrieben werden.
|
10 | Die Zahlentypen sind alle 1 byte groß.
|
11 | Die Routinen sind auch keinesfalls perfekt. Für Anregungen wäre ich dankbar.
|
12 | Viel Spaß damit
|
13 |
|
14 |
|
15 |
|
16 | -----------------------------------------------------------------------------------------------------*/
|
17 |
|
18 |
|
19 | // Einbinden der Headerdateien
|
20 | #include <avr/io.h> // Für Kommunikation über Ports benötigt
|
21 | #include <util/delay.h> // Für Wartezeiten benötigt
|
22 | #include <stdlib.h>
|
23 | #include <math.h>
|
24 |
|
25 | // Deklarationen
|
26 |
|
27 | void defineports(void); // wird von lcdinit aufgerufen und definert ports (siehe Routine)
|
28 |
|
29 | void lcdinit(void); // initialisiert LCD
|
30 |
|
31 | void lcdcall(char a,char b); // wird von routinen benutzt um Befehle zum Display zu senden
|
32 |
|
33 | void lcdwrites(char* c); // Schreibt Zeichenkette
|
34 |
|
35 | void lcdwritec(char); // Schreibt einzelnes Zeichen
|
36 |
|
37 | void lcdwritehex(char c); // Schreibt Hexadezimalwert eines char
|
38 |
|
39 | void lcdgotoxy(char x,char y); // Setzt cursor an Position (von (1,1)-(16,2))
|
40 |
|
41 | void lcdsetcursor(char c); // Stellt cursoranzeige ein genaueres unten in Code
|
42 |
|
43 | void lcdclear(void); // Löscht LCD
|
44 |
|
45 | void lcdwritedec(char c); // schreibt Dezimalwert eines char auf Display
|
46 |
|
47 | void lcdwritexy(char x,char y, char* c);// schreibt String an position
|
48 |
|
49 | // Hauptprogramm
|
50 |
|
51 |
|
52 | int main(void)
|
53 | {
|
54 | char i[]="Hallo \0"; // Definiere Nullterminierten String "\0" unbedingt mit angeben
|
55 | char f=0x0; // Definiere byte mit dem wert 255
|
56 | lcdinit(); // Initialisiere LCD
|
57 | lcdwrites(i); // Schreibe Zeichenkette i auf Display
|
58 | lcdwrites("Welt\0"); // Schreibe angegebene Zeichenkette
|
59 | lcdgotoxy(1,2); // Springe zur 2. Zeile Position 1
|
60 | //lcdwritehex(f); // Schreibe den Hexcode von f auf display
|
61 |
|
62 |
|
63 | while (1) // Schleife um den Controller zu fangen
|
64 | {
|
65 | lcdwritexy(1,2," \0"); // Lösche Zahl
|
66 | lcdgotoxy(1,2); // Gehe in die 2.Zeile position 1
|
67 | lcdwritedec(f); // Schreiebe f als Dezimalzahl
|
68 | ++f; // erhöhe f um 1
|
69 | _delay_ms(1000); // eine sekunde pause
|
70 | }
|
71 | return 0;
|
72 | }
|
73 |
|
74 |
|
75 |
|
76 |
|
77 |
|
78 | // Unterprogramme
|
79 | // --------------
|
80 |
|
81 |
|
82 | void defineports(void)
|
83 | {
|
84 | DDRB = 0xff; // PORT B als Ausgang definieren
|
85 | DDRA = 0xff; // PORT A als Ausgang definieren
|
86 | PORTA=0; // Mit 0b00000000 initialisieren
|
87 | PORTB=0; // Mit 0b00000000 initialisieren
|
88 | }
|
89 |
|
90 |
|
91 |
|
92 | void lcdinit(void) // Initialisierung des LCD
|
93 | {
|
94 | defineports();
|
95 | lcdcall(56,1); // Systemeinstellungen
|
96 | _delay_ms(15);
|
97 | lcdcall(12,1); // Display an
|
98 | _delay_ms(15);
|
99 | lcdcall(1,1);
|
100 | _delay_ms(15); // Clear display
|
101 | }
|
102 |
|
103 |
|
104 |
|
105 | void lcdwrites(char* c) // Schreibe null-terminierten String an aktuelle Cursor-Position
|
106 | {
|
107 | while(*c!=0) // Solange nicht Stringende (Durch \0 bestimmt)
|
108 | {
|
109 | lcdcall(*c,5); // Schicke Zeichen von Adresse c an lcd
|
110 | ++c; // gehe ein byte weiter / nächstes Zeichen
|
111 | }
|
112 | }
|
113 |
|
114 |
|
115 |
|
116 | void lcdcall(char a,char b) // LCD mit Steuerworten ansprechen (Siehe Tabelle)
|
117 | {
|
118 | PORTB=b; // Steuerbus
|
119 | PORTA=a; // Datenbus
|
120 | _delay_ms(1); // warte 15ms (Verzögerungsschleife aus delay.h)
|
121 | PORTB=b-1; // Enable wieder null setzen
|
122 | }
|
123 |
|
124 |
|
125 |
|
126 | void lcdwritec(char c) // Schreibe Zeichen auf Cursor-Position
|
127 | {
|
128 | lcdcall(c,5);
|
129 | }
|
130 |
|
131 |
|
132 |
|
133 | void lcdwritehex(char c) // Schreibe byte hexademzimal
|
134 | {
|
135 | char u=c/16;
|
136 | char l=(c*16);
|
137 | l=l/16;
|
138 | if (u>=10) u=u+0x41-0x0A; else u=u+0x30;
|
139 | if (l>=10) l=l+0x41-0x0A; else l=l+0x30;
|
140 | lcdwritec(u);
|
141 | lcdwritec(l);
|
142 | }
|
143 |
|
144 |
|
145 |
|
146 | void lcdgotoxy(char x,char y) // Gehe zu LCD position (X,Y)
|
147 | {
|
148 | char pos=0x80; // Definiere pos Anfangsposition im DD-RAM
|
149 | if (y==1) pos=x+0x80-1; // Position zuweisen für 1. Zeile
|
150 | if (y==2) pos=x+0xC0-1; // Position zuweisen für 2. Zeile
|
151 | lcdcall(pos,1); // Sende Steuerwort (Position) an LCD
|
152 | }
|
153 |
|
154 |
|
155 |
|
156 | void lcdsetcursor(char c) // Cursor einstellen
|
157 | {
|
158 | if (c==0) lcdcall(0b1100,1); // 0...Aus
|
159 | if (c==1) lcdcall(0b1110,1); // 1...Normaler Cursor
|
160 | if (c==2) lcdcall(0b1101,1); // 2...Blinkender Cursor
|
161 | }
|
162 |
|
163 |
|
164 |
|
165 | void lcdclear(void)
|
166 | {
|
167 | lcdcall(1,1); // Lösche LCD
|
168 | lcdcall(2,1); // Setze Cursor auf Anfangsposition
|
169 | }
|
170 |
|
171 |
|
172 | void lcdwritedec(char c) // Schreibe char als Dezimalzahl
|
173 | {
|
174 | char dez[3],rh,chk=0;
|
175 | dez[0]=c/100; // Schreibe dezimalstellen in Feld
|
176 | rh=c%100;
|
177 | dez[1]=rh/10;
|
178 | dez[2]=rh%10;
|
179 | for (int i=0;i<3;++i) // Wandle in char um und schneide Nullen am Anfang weg und schreibe
|
180 | {
|
181 | if (dez[i]!=0)
|
182 | {
|
183 | chk=1;
|
184 | lcdwritec(dez[i]+0x30);
|
185 | }
|
186 | if (dez[i]==0 && chk==1)
|
187 | {
|
188 | lcdwritec('0');
|
189 | }
|
190 | }
|
191 | if (c==0) lcdwritec('0');
|
192 | }
|
193 |
|
194 | void lcdwritexy(char x,char y, char* c) // schreibt String an Position (x,y)
|
195 | {
|
196 | lcdgotoxy(x,y); // Gehe zu Cursor-Position (x,y)
|
197 | lcdwrites(c); // Schreibe String
|
198 | }
|