Forum: Mikrocontroller und Digitale Elektronik GLCD mit T6963 Read-Data Problem


von Anubis (Gast)


Lesenswert?

Hallo,

ich bräuchte mal eure Hilfe bei einem kleinem Problem mit einem 
Grafik-LCD.

Das Problem ist, dass ich Daten, die auf dem Display angezeigt werden, 
wieder zurück lesen möchte.

Es handelt sich hierbei um ein GLCD mit T6963.

Die Darstellung der Grafik ist kein Problem. Nur das Lesen. Ich bekomme 
immer nur den letzten übertragenen Befehl eingelesen.

Vielleicht hat jemand eine Idee???
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
}

von Anubis (Gast)


Lesenswert?

Hallo,

hat keiner eine Idee???

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.