lcd.c


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
}