1 | //Header-Datei für PIC 16F876 einbinden
|
2 | #include <16f877.h>
|
3 |
|
4 | #include <Pfeil01.inc> //Grafik-Datei
|
5 |
|
6 |
|
7 | #define NotWR PORTD.0
|
8 | #define NotRD PORTD.1
|
9 | #define NotCE PORTD.2
|
10 | #define NotCD PORTD.3
|
11 | #define NotRST PORTD.4
|
12 | #define FontSel PORTD.5
|
13 |
|
14 | void Delay_ms(uns16);
|
15 | void Delay_us(uns16);
|
16 | void InitLCD(void);
|
17 | void CheckBusy(void);
|
18 | void WriteCommand(uns8);
|
19 | void WriteData(uns8);
|
20 | void ClearGraphicArea(void);
|
21 | void Graphic(void);
|
22 | void Verschieben(void);
|
23 | uns8 ReadData(void);
|
24 |
|
25 | /*******************************************************************/
|
26 |
|
27 | void main()
|
28 | {
|
29 | uns8 Wechsel = 1;
|
30 | uns8 Pos = 0;
|
31 |
|
32 | TRISD = 0; //Port D als Ausgang
|
33 | PORTD = 255;
|
34 | T1CON = 0; //Timer 1 Vorteiler 1:1
|
35 | NotRST = 0;
|
36 | Delay_ms(2);
|
37 | NotRST = 1;
|
38 | FontSel = 0;
|
39 | InitLCD(); //Display initialisieren
|
40 |
|
41 | Graphic();
|
42 |
|
43 | while(1)
|
44 | {
|
45 | Verschieben();
|
46 | }
|
47 | }
|
48 |
|
49 | /************************************************************************/
|
50 |
|
51 | void InitLCD(void)
|
52 | {
|
53 | TRISC = 0xFF; //Port C als Eingang (D0 bis D7)
|
54 |
|
55 | /*Grafik Home Adresse*/
|
56 | WriteData(0x81);
|
57 | WriteData(0x00); //Adresse = 0x0081h
|
58 | WriteCommand(0x42);
|
59 |
|
60 | /*Grafik Area Set*/
|
61 | WriteData(0x10);
|
62 | WriteData(0x00);
|
63 | WriteCommand(0x43);
|
64 |
|
65 | /*Display im OR-Mode*/
|
66 | WriteCommand(0x80);
|
67 |
|
68 | /*Grafik an, Text aus, Cursor aus*/
|
69 | WriteCommand(0x98);
|
70 |
|
71 | /*Display löschen*/
|
72 | ClearGraphicArea();
|
73 |
|
74 | }
|
75 |
|
76 | /***********************************************************************/
|
77 |
|
78 | void ClearGraphicArea(void)
|
79 | {
|
80 | uns16 Counter2;
|
81 |
|
82 | /*Auto-Write deaktivieren*/
|
83 | WriteCommand(0xB2);
|
84 |
|
85 |
|
86 | /*Grafik-Bereich löschen(von 0x0081h bis 0x0400h*/
|
87 | /*Adress-Pointer auf 0x0081h setzen*/
|
88 | WriteData(0x81);
|
89 | WriteData(0x00);
|
90 | WriteCommand(0x24);
|
91 |
|
92 | /*Auto-Write aktivieren*/
|
93 | WriteCommand(0xB0);
|
94 |
|
95 | /* 16 Byte pro Zeile gelöscht werden (1 Byte = 8 Pixel) 128 Pixel=16 Byte*/
|
96 | /*bei 128x64 Pixel ergeben sich 64 Zeilen zu je 16 Byte = 1024 Byte */
|
97 | for(Counter2 = 0; Counter2 < 1024; Counter2++)
|
98 | {
|
99 | WriteData(0x00); //0x00 == kein Zeichen
|
100 | }
|
101 |
|
102 | /*Auto-Write deaktivieren*/
|
103 | WriteCommand(0xB2);
|
104 | }
|
105 |
|
106 | /************************************************************************/
|
107 |
|
108 | void Delay_ms(uns16 Milli)
|
109 | {
|
110 | uns16 Durchgang;
|
111 |
|
112 | TMR1ON = 0;
|
113 | for(Durchgang = 0; Durchgang < Milli; Durchgang++)
|
114 | {
|
115 | TMR1H = 0xFC;
|
116 | TMR1L = 0x18; //Timer 1 mit 64536 vorladen (1000 Durchgänge)
|
117 | TMR1IF = 0;
|
118 | TMR1ON = 1;
|
119 | while(!TMR1IF);
|
120 | TMR1ON = 0;
|
121 | }
|
122 | }
|
123 |
|
124 |
|
125 | /************************************************************************/
|
126 |
|
127 | void Delay_us(uns16 Mykro)
|
128 | {
|
129 | uns8 Wert1, Wert2, Counter;
|
130 | uns16 Temp, Zeit;
|
131 |
|
132 | TMR1ON = 0;
|
133 | Zeit = 65536 - Mykro;
|
134 | Temp = Zeit & 0xFF00; //oberes Nibble isolieren
|
135 | Wert1 = Temp >> 4; //Rechtsverschiebung um 4 Bit
|
136 | Temp = Zeit & 0x00FF; //unteres Nibble isolieren
|
137 | Wert2 = Temp;
|
138 |
|
139 | for(Counter = 0; Counter < Mykro; Counter++)
|
140 | {
|
141 | TMR1H = Wert1;
|
142 | TMR1L = Wert2;
|
143 | TMR1IF = 0;
|
144 | TMR1ON = 1;
|
145 | while(!TMR1IF);
|
146 | TMR1ON = 0;
|
147 | }
|
148 | }
|
149 |
|
150 |
|
151 | /************************************************************************/
|
152 |
|
153 | void CheckBusy(void)
|
154 | {
|
155 | uns8 Status;
|
156 |
|
157 | TRISC = 255; //Port C als Eingang
|
158 | NotCD = 1;
|
159 | NotCE = 1;
|
160 | NotRD = 1;
|
161 | NotWR = 1;
|
162 | NotCE = 0;
|
163 | NotRD = 0;
|
164 |
|
165 | while((PORTC & 3) != 3);
|
166 |
|
167 | NotRD = 1;
|
168 | NotCE = 1;
|
169 | TRISC = 0;
|
170 | }
|
171 |
|
172 |
|
173 | /************************************************************************/
|
174 |
|
175 | void WriteCommand(uns8 Command)
|
176 | {
|
177 | TRISC = 0;
|
178 | CheckBusy();
|
179 | PORTC = Command;
|
180 | NotCD = 1;
|
181 | NotRD = 1;
|
182 | NotCE = 0;
|
183 | NotWR = 0;
|
184 | #asm
|
185 | NOP //Wartezeit von 1 Maschinenzyklus
|
186 | #endasm
|
187 | NotWR = 1;
|
188 | NotCE = 1;
|
189 | }
|
190 |
|
191 | /*************************************************************************/
|
192 |
|
193 | void WriteData(uns8 Data)
|
194 | {
|
195 | TRISC = 0;
|
196 | CheckBusy();
|
197 | PORTC = Data;
|
198 | NotCD = 0;
|
199 | NotRD = 1;
|
200 | NotCE = 0;
|
201 | NotWR = 0;
|
202 | #asm
|
203 | NOP
|
204 | #endasm
|
205 | NotWR = 1;
|
206 | NotCE = 1;
|
207 | }
|
208 |
|
209 | /************************************************************************/
|
210 |
|
211 | uns8 ReadData(void)
|
212 | {
|
213 | uns8 Daten;
|
214 |
|
215 | TRISC = 255; //Port C als Eingang
|
216 | CheckBusy();
|
217 |
|
218 | NotCD = 1;
|
219 | NotCD = 0;
|
220 | NotCE = 0;
|
221 | NotRD= 1;
|
222 | NotRD = 0;
|
223 | NotWR = 1;
|
224 | #asm
|
225 | NOP
|
226 | NOP
|
227 | NOP
|
228 | #endasm
|
229 | Daten = PORTC;
|
230 | NotRD = 1;
|
231 | NotCE = 1;
|
232 | return(Daten);
|
233 | }
|
234 |
|
235 |
|
236 | /*************************************************************************/
|
237 |
|
238 | void Graphic(void)
|
239 | {
|
240 | uns8 Innen, Aussen, AdrL, AdrH, Zaehler;
|
241 | uns16 Adresse, Hilfs;
|
242 |
|
243 | Adresse = 0x0081;
|
244 | Zaehler = 0;
|
245 |
|
246 | for(Aussen = 1; Aussen < 33; Aussen++)
|
247 | {
|
248 | /*16-Bit Adresse in zwei 8-Bit zerlegen*/
|
249 | Hilfs = Adresse & 0xFF00;
|
250 | AdrH = Hilfs >> 8;
|
251 | Hilfs = Adresse & 0x00FF;
|
252 | AdrL = Hilfs;
|
253 |
|
254 | /*Adress-Pointer setzen*/
|
255 | WriteData(AdrL);
|
256 | WriteData(AdrH);
|
257 | WriteCommand(0x24);
|
258 |
|
259 | for(Innen = 1; Innen < 5; Innen++)
|
260 | {
|
261 | WriteData(Pfeil01[Zaehler]);
|
262 | WriteCommand(0xC0);
|
263 | Zaehler++;
|
264 | }
|
265 | Adresse = Adresse + 16; //Adresse für nächste Zeile
|
266 | }
|
267 | }
|
268 |
|
269 | /************************************************************************/
|
270 | void Verschieben(void)
|
271 | {
|
272 | uns8 DataBytes[7];
|
273 | uns8 Counter, DataTemp;
|
274 |
|
275 | /*Adress-Pointer setzen*/
|
276 | WriteData(0x81);
|
277 | WriteData(0x00);
|
278 | WriteCommand(0x24);
|
279 | ReadData();
|
280 | }
|