Proyectos Microcontroladores

Menu Principal

Joomla Slide Menu by DART Creations

DEMOQE Y GLCD 128x64

Valoración de los usuarios: / 1
PobreEl mejor 

En este articulo, veremos como utilizar la libreria universal para manejar el GLCD KS0108 que está en el sitio web RADZIO el cual tiene varias versiones para diferentes microcontroladores, no siendo el caso para Freescale, en esta libreria lo unico que cambie, fue el archivo de bajo nivel, que sirve para portar cualquier microcontrolador a estas librerias.

 

El archivo que sirve para definir puertos de entrada y salida, se llama KS0108-CFQE128.c, tuve un pequeño problema, ya que la tarjeta DEMOQE no tiene disponible un puerto completo, asi que tuve que usar una union, para no consumir mucha ram (en teoria), lo más probable es que haya una solución más eficiente y elegante a la mía, por lo pronto, funciona con esta.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
#include "derivative.h"
#include "KS0108.h"
 
 
#define KS0108_DATA_DIR_0 PTFDD_PTFDD2
#define KS0108_DATA_DIR_1 PTFDD_PTFDD3
#define KS0108_DATA_DIR_2 PTFDD_PTFDD4
#define KS0108_DATA_DIR_3 PTFDD_PTFDD5
#define KS0108_DATA_DIR_4 PTFDD_PTFDD6
#define KS0108_DATA_DIR_5 PTFDD_PTFDD7
#define KS0108_DATA_DIR_6 PTGDD_PTGDD2
#define KS0108_DATA_DIR_7 PTGDD_PTGDD3
 
 
#define KS0108_DATA_0 PTFD_PTFD2
#define KS0108_DATA_1 PTFD_PTFD3
#define KS0108_DATA_2 PTFD_PTFD4
#define KS0108_DATA_3 PTFD_PTFD5
#define KS0108_DATA_4 PTFD_PTFD6
#define KS0108_DATA_5 PTFD_PTFD7
#define KS0108_DATA_6 PTGD_PTGD2
#define KS0108_DATA_7 PTGD_PTGD3
 
 
#define KS0108_RS_DIR PTCDD_PTCDD5
#define KS0108_RW_DIR PTCDD_PTCDD4
#define KS0108_EN_DIR PTCDD_PTCDD3
 
#define KS0108_CS1_DIR PTBDD_PTBDD0
#define KS0108_CS2_DIR PTBDD_PTBDD1
#define KS0108_CS3_DIR PTBDD_PTBDD1
 
#define KS0108_RS PTCD_PTCD5
#define KS0108_RW PTCD_PTCD4
#define KS0108_EN PTCD_PTCD3
 
#define KS0108_CS1 PTBD_PTBD0
#define KS0108_CS2 PTBD_PTBD1
#define KS0108_CS3 PTBD_PTBD1
 
#define DISPLAY_STATUS_BUSY 0x80
 
extern unsigned char screen_x, screen_y;
 
 
union ubyte
{
char _byte;
struct
{
char b0 : 1;
char b1 : 1;
char b2 : 1;
char b3 : 1;
char b4 : 1;
char b5 : 1;
char b6 : 1;
char b7 : 1;
} bit;
};
 
 
 
//-------------------------------------------------------------------------------------------------
// Delay function
//-------------------------------------------------------------------------------------------------
void GLCD_Delay(void)
{
 
char i=0;
for (i=0;i<5;i++);
 
}
//-------------------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------
void GLCD_InitializePorts(void)
{
 
KS0108_CS1=1;
KS0108_CS2=1;
KS0108_CS1_DIR=1;
KS0108_CS2_DIR=1;
KS0108_RS_DIR=1;
KS0108_RW_DIR=1;
KS0108_EN_DIR=1;
 
 
 
}
//-------------------------------------------------------------------------------------------------
// Enable Controller (0-2)
//-------------------------------------------------------------------------------------------------
void GLCD_EnableController(unsigned char controller)
{
switch(controller){
 
case 0 : KS0108_CS1=1; KS0108_CS2=0; break;
case 1 : KS0108_CS1=0; KS0108_CS2=1; break;
case 2 : KS0108_CS1=0; KS0108_CS2=1; break;
 
}
}
//-------------------------------------------------------------------------------------------------
// Disable Controller (0-2)
//-------------------------------------------------------------------------------------------------
void GLCD_DisableController(unsigned char controller)
{
switch(controller){
case 0 : KS0108_CS1=1;
case 1 : KS0108_CS2=1;
case 2 : KS0108_CS3=1;
 
}
}
//-------------------------------------------------------------------------------------------------
// Read Status from specified controller (0-2)
//-------------------------------------------------------------------------------------------------
unsigned char GLCD_ReadStatus(unsigned char controller)
{
unsigned char status;
union ubyte my_union;
 
 
KS0108_DATA_DIR_0=0;
KS0108_DATA_DIR_1=0;
KS0108_DATA_DIR_2=0;
KS0108_DATA_DIR_3=0;
KS0108_DATA_DIR_4=0;
KS0108_DATA_DIR_5=0;
KS0108_DATA_DIR_6=0;
KS0108_DATA_DIR_7=0;
 
KS0108_RW=1;
KS0108_RS=0;
GLCD_EnableController(controller);
KS0108_EN=1;
GLCD_Delay();
 
my_union.bit.b0 = KS0108_DATA_0;
my_union.bit.b1 = KS0108_DATA_1;
my_union.bit.b2 = KS0108_DATA_2;
my_union.bit.b3 = KS0108_DATA_3;
my_union.bit.b4 = KS0108_DATA_4;
my_union.bit.b5 = KS0108_DATA_5;
my_union.bit.b6 = KS0108_DATA_6;
my_union.bit.b7 = KS0108_DATA_7;
 
KS0108_EN=0;
 
status= my_union._byte;
 
return status;
 
}
//-------------------------------------------------------------------------------------------------
// Write command to specified controller
//-------------------------------------------------------------------------------------------------
void GLCD_WriteCommand(unsigned char commandToWrite, unsigned char controller)
{
 
union ubyte my_data;
 
while(GLCD_ReadStatus(controller)&DISPLAY_STATUS_BUSY);
KS0108_DATA_DIR_0=1;
KS0108_DATA_DIR_1=1;
KS0108_DATA_DIR_2=1;
KS0108_DATA_DIR_3=1;
KS0108_DATA_DIR_4=1;
KS0108_DATA_DIR_5=1;
KS0108_DATA_DIR_6=1;
KS0108_DATA_DIR_7=1;
KS0108_RW=0;
KS0108_RS=0;
GLCD_EnableController(controller);
my_data._byte=commandToWrite;
KS0108_DATA_0=my_data.bit.b0;
KS0108_DATA_1=my_data.bit.b1;
KS0108_DATA_2=my_data.bit.b2;
KS0108_DATA_3=my_data.bit.b3;
KS0108_DATA_4=my_data.bit.b4;
KS0108_DATA_5=my_data.bit.b5;
KS0108_DATA_6=my_data.bit.b6;
KS0108_DATA_7=my_data.bit.b7;
 
 
KS0108_EN=1;
GLCD_Delay();
KS0108_EN=0;
GLCD_DisableController(controller);
 
}
//-------------------------------------------------------------------------------------------------
// Read data from current position
//-------------------------------------------------------------------------------------------------
unsigned char GLCD_ReadData(void)
{
unsigned char data;
union ubyte my_union;
 
while(GLCD_ReadStatus(screen_x / 64)&DISPLAY_STATUS_BUSY);
 
KS0108_DATA_DIR_0=0;
KS0108_DATA_DIR_1=0;
KS0108_DATA_DIR_2=0;
KS0108_DATA_DIR_3=0;
KS0108_DATA_DIR_4=0;
KS0108_DATA_DIR_5=0;
KS0108_DATA_DIR_6=0;
KS0108_DATA_DIR_7=0;
 
 
KS0108_RW=1;
KS0108_RS=1;
 
 
GLCD_EnableController(screen_x / 64);
 
 
 
KS0108_EN=1;
GLCD_Delay();
 
my_union.bit.b0=KS0108_DATA_0;
my_union.bit.b1=KS0108_DATA_1;
my_union.bit.b2=KS0108_DATA_2;
my_union.bit.b3=KS0108_DATA_3;
my_union.bit.b4=KS0108_DATA_4;
my_union.bit.b5=KS0108_DATA_5;
my_union.bit.b6=KS0108_DATA_6;
my_union.bit.b7=KS0108_DATA_7;
data= my_union._byte;
 
 
 
KS0108_EN=0;
GLCD_DisableController(screen_x / 64);
screen_x++;
return data;
}
//-------------------------------------------------------------------------------------------------
// Write data to current position
//-------------------------------------------------------------------------------------------------
void GLCD_WriteData(unsigned char dataToWrite)
{
 
union ubyte my_data;
 
while(GLCD_ReadStatus(screen_x / 64)&DISPLAY_STATUS_BUSY);
 
KS0108_DATA_DIR_0=1;
KS0108_DATA_DIR_1=1;
KS0108_DATA_DIR_2=1;
KS0108_DATA_DIR_3=1;
KS0108_DATA_DIR_4=1;
KS0108_DATA_DIR_5=1;
KS0108_DATA_DIR_6=1;
KS0108_DATA_DIR_7=1;
 
 
KS0108_RW=0;
KS0108_RS=1;
my_data._byte=dataToWrite;
KS0108_DATA_0=my_data.bit.b0;
KS0108_DATA_1=my_data.bit.b1;
KS0108_DATA_2=my_data.bit.b2;
KS0108_DATA_3=my_data.bit.b3;
KS0108_DATA_4=my_data.bit.b4;
KS0108_DATA_5=my_data.bit.b5;
KS0108_DATA_6=my_data.bit.b6;
KS0108_DATA_7=my_data.bit.b7;
 
GLCD_EnableController(screen_x / 64);
 
KS0108_EN=1;
GLCD_Delay();
 
KS0108_EN=0;
GLCD_DisableController(screen_x / 64);
screen_x++;
}
//-------------------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------
unsigned char GLCD_ReadByteFromROMMemory(unsigned char * ptr)
{
return *(ptr);
}
//-------------------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------
 

Tambien podemos ver diferentes funciones, como se puede ver en este ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "mcu_init.h"
 
//Library for GLCD 128x64
#include "KS0108.h"
#include "graphic.h"
#include "bitmaps.h"
 
unsigned char count=0;
 
 
void interrupt VectorNumber_Vrtc rtc_isr(void){
 
RTCSC_RTIF=1;
 
count++;
if(count>60)count=0;
}
 
 
void main(void) {
 
EnableInterrupts; /* enable interrupts */
/* include your code here */
mcu_init_clock();
 
 
GLCD_Initialize();
GLCD_ClearScreen();
 
 
GLCD_Bitmap(picture,0,0,128,64);
GLCD_GoTo(0,7);
GLCD_WriteString(" www.thinkchip.com.mx");
count=0;
while(count<3);
GLCD_ClearScreen();
GLCD_GoTo(0,3);
GLCD_WriteString("+-------------------+");
GLCD_GoTo(0,4);
GLCD_WriteString("| Ejemplo |");
GLCD_GoTo(0,5);
GLCD_WriteString("| GLCD 128x64 |");
GLCD_GoTo(0,6);
GLCD_WriteString("+-------------------+");
count =0;
while(count<4);
GLCD_ClearScreen();
GLCD_Rectangle(0,0,40,40);
GLCD_Line(0,32,123,32);
GLCD_Circle(64,32,10);
 
 
for(;;) {
 
 
 
 
__RESET_WATCHDOG(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
 

Para hacer su conexión y utilizar este ejemplo para su programa, solo tienen que definir sus pines y estará listo para trabajar, este ejemplo esta hecho para un MCF51QE128 y un bus clock de 8.34 MHz.

Aqui podemos ver varias fotos de su funcionamiento, asi como un video

    

Sin más que decir, me despido, el proyecto completo lo dejo para la descarga, esta compilado en codewarrior 6.3 special

 

 

Escribir un comentario

No agredir a los demás compañeros
Evitar comentarios racistas o insultantes


Código de seguridad
Refescar

Buscador ThinkChip

Ingresar

¿Deseas apoyarme?

Enter Amount:

Distribuidores

Banner

Más allá de la ciencia

23:1 Jehová es mi pastor; nada me faltará.23:2 En lugares de delicados pastos me hará descansar;Junto a aguas de reposo me pastoreará.
23:3 Confortará mi alma;Me guiará por sendas de justicia por amor de su nombre.23:4 Aunque ande en valle de sombra de muerte,No temeré mal alguno, porque tú estarás conmigo;Tu vara y tu cayado me infundirán aliento.23:5 Aderezas mesa delante de mí en presencia de mis angustiadores;Unges mi cabeza con aceite; mi copa está rebosando.23:6 Ciertamente el bien y la misericordia me seguirán todos los días de mi vida,Y en la casa de Jehová moraré por largos días.
mod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_counter
mod_vvisit_counterToday39
mod_vvisit_counterYesterday161
mod_vvisit_counterThis week376
mod_vvisit_counterLast week579
mod_vvisit_counterThis month716
mod_vvisit_counterLast month1863
mod_vvisit_counterAll days2579

We have: 1 guests, 1 bots online
Your IP: 38.107.191.101
 , 
Today: Sep 08, 2010