00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef WIN32
00023
00024 #include <avr/io.h>
00025 #include <avr/interrupt.h>
00026 #endif
00027
00028 #include "global.h"
00029 #include "ks0108.h"
00030
00031
00032 GrLcdStateType GrLcdState;
00033
00034
00035
00036
00037
00038 void glcdInitHW(void)
00039 {
00040
00041
00042 #ifdef LCD_PORT_INTERFACE
00043
00044 sbi(LCD_CTRL_DDR, LCD_CTRL_RS);
00045 sbi(LCD_CTRL_DDR, LCD_CTRL_RW);
00046 sbi(LCD_CTRL_DDR, LCD_CTRL_E);
00047 sbi(LCD_CTRL_DDR, LCD_CTRL_CS0);
00048 sbi(LCD_CTRL_DDR, LCD_CTRL_CS1);
00049 sbi(LCD_CTRL_DDR, LCD_CTRL_RESET);
00050
00051 cbi(LCD_CTRL_PORT, LCD_CTRL_RS);
00052 cbi(LCD_CTRL_PORT, LCD_CTRL_RW);
00053 cbi(LCD_CTRL_PORT, LCD_CTRL_E);
00054 sbi(LCD_CTRL_PORT, LCD_CTRL_CS0);
00055 sbi(LCD_CTRL_PORT, LCD_CTRL_CS1);
00056 cbi(LCD_CTRL_PORT, LCD_CTRL_RESET);
00057
00058 outp(0xFF, LCD_DATA_DDR);
00059
00060 outp(0x00, LCD_DATA_PORT);
00061 #endif
00062 }
00063
00064 void glcdControllerSelect(u08 controller)
00065 {
00066
00067 switch(controller)
00068 {
00069 case 0: sbi(LCD_CTRL_PORT, LCD_CTRL_CS0); cbi(LCD_CTRL_PORT, LCD_CTRL_CS1); break;
00070 case 1: cbi(LCD_CTRL_PORT, LCD_CTRL_CS0); sbi(LCD_CTRL_PORT, LCD_CTRL_CS1); break;
00071 default: break;
00072 }
00073 }
00074
00075 void glcdBusyWait(u08 controller)
00076 {
00077 #ifdef LCD_PORT_INTERFACE
00078 cli();
00079
00080
00081 glcdControllerSelect(controller);
00082
00083 outp(0xFF, LCD_DATA_PORT);
00084 cbi(LCD_CTRL_PORT, LCD_CTRL_RS);
00085 outp(0x00, LCD_DATA_DDR);
00086 sbi(LCD_CTRL_PORT, LCD_CTRL_RW);
00087 sbi(LCD_CTRL_PORT, LCD_CTRL_E);
00088 asm volatile ("nop"); asm volatile ("nop");
00089 while(inp(LCD_DATA_PIN) & GLCD_STATUS_BUSY)
00090 {
00091 cbi(LCD_CTRL_PORT, LCD_CTRL_E);
00092 asm volatile ("nop"); asm volatile ("nop");
00093 asm volatile ("nop"); asm volatile ("nop");
00094 sbi(LCD_CTRL_PORT, LCD_CTRL_E);
00095 asm volatile ("nop"); asm volatile ("nop");
00096 asm volatile ("nop"); asm volatile ("nop");
00097 }
00098 cbi(LCD_CTRL_PORT, LCD_CTRL_E);
00099 cbi(LCD_CTRL_PORT, LCD_CTRL_RW);
00100 outp(0xFF, LCD_DATA_DDR);
00101 sei();
00102 #else
00103
00104
00105 while(*(volatile unsigned char *) (LCD_CTRL_ADDR) & 1<<LCD_BUSY);
00106
00107 #endif
00108 }
00109
00110 void glcdControlWrite(u08 controller, u08 data)
00111 {
00112 #ifdef LCD_PORT_INTERFACE
00113 cli();
00114 glcdBusyWait(controller);
00115 cbi(LCD_CTRL_PORT, LCD_CTRL_RS);
00116 cbi(LCD_CTRL_PORT, LCD_CTRL_RW);
00117 sbi(LCD_CTRL_PORT, LCD_CTRL_E);
00118 outp(0xFF, LCD_DATA_DDR);
00119 outp(data, LCD_DATA_PORT);
00120 asm volatile ("nop"); asm volatile ("nop");
00121 asm volatile ("nop"); asm volatile ("nop");
00122 asm volatile ("nop"); asm volatile ("nop");
00123 asm volatile ("nop"); asm volatile ("nop");
00124 cbi(LCD_CTRL_PORT, LCD_CTRL_E);
00125 sei();
00126 #else
00127 sbi(MCUCR, SRW);
00128 glcdBusyWait(controller);
00129 *(volatile unsigned char *) (LCD_CTRL_ADDR) = data;
00130 cbi(MCUCR, SRW);
00131 #endif
00132 }
00133
00134 u08 glcdControlRead(u08 controller)
00135 {
00136 register u08 data;
00137 #ifdef LCD_PORT_INTERFACE
00138 cli();
00139 glcdBusyWait(controller);
00140 cbi(LCD_CTRL_PORT, LCD_CTRL_RS);
00141 outp(0x00, LCD_DATA_DDR);
00142 sbi(LCD_CTRL_PORT, LCD_CTRL_RW);
00143 sbi(LCD_CTRL_PORT, LCD_CTRL_E);
00144 asm volatile ("nop"); asm volatile ("nop");
00145 asm volatile ("nop"); asm volatile ("nop");
00146 asm volatile ("nop"); asm volatile ("nop");
00147 asm volatile ("nop"); asm volatile ("nop");
00148 data = inp(LCD_DATA_PIN);
00149 cbi(LCD_CTRL_PORT, LCD_CTRL_E);
00150 cbi(LCD_CTRL_PORT, LCD_CTRL_RW);
00151 outp(0xFF, LCD_DATA_DDR);
00152 sei();
00153 #else
00154 sbi(MCUCR, SRW);
00155 glcdBusyWait(controller);
00156 data = *(volatile unsigned char *) (LCD_CTRL_ADDR);
00157 cbi(MCUCR, SRW);
00158 #endif
00159 return data;
00160 }
00161
00162 void glcdDataWrite(u08 data)
00163 {
00164 register u08 controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_WIDTH);
00165 #ifdef LCD_PORT_INTERFACE
00166 cli();
00167 glcdBusyWait(controller);
00168 sbi(LCD_CTRL_PORT, LCD_CTRL_RS);
00169 cbi(LCD_CTRL_PORT, LCD_CTRL_RW);
00170 sbi(LCD_CTRL_PORT, LCD_CTRL_E);
00171 outp(0xFF, LCD_DATA_DDR);
00172 outp(data, LCD_DATA_PORT);
00173 asm volatile ("nop"); asm volatile ("nop");
00174 asm volatile ("nop"); asm volatile ("nop");
00175 asm volatile ("nop"); asm volatile ("nop");
00176 asm volatile ("nop"); asm volatile ("nop");
00177 cbi(LCD_CTRL_PORT, LCD_CTRL_E);
00178 sei();
00179 #else
00180 sbi(MCUCR, SRW);
00181 glcdBusyWait(controller);
00182 *(volatile unsigned char *) (LCD_DATA_ADDR) = data;
00183 cbi(MCUCR, SRW);
00184 #endif
00185
00186 GrLcdState.ctrlr[controller].xAddr++;
00187 GrLcdState.lcdXAddr++;
00188 if(GrLcdState.lcdXAddr > GLCD_XPIXELS)
00189 {
00190 GrLcdState.lcdYAddr++;
00191 glcdSetYAddress(GrLcdState.lcdYAddr);
00192 glcdSetXAddress(0);
00193 }
00194 }
00195
00196 u08 glcdDataRead(void)
00197 {
00198 register u08 data;
00199 register u08 controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_WIDTH);
00200 #ifdef LCD_PORT_INTERFACE
00201 cli();
00202 glcdBusyWait(controller);
00203 sbi(LCD_CTRL_PORT, LCD_CTRL_RS);
00204 outp(0x00, LCD_DATA_DDR);
00205 sbi(LCD_CTRL_PORT, LCD_CTRL_RW);
00206 sbi(LCD_CTRL_PORT, LCD_CTRL_E);
00207 asm volatile ("nop"); asm volatile ("nop");
00208 asm volatile ("nop"); asm volatile ("nop");
00209 asm volatile ("nop"); asm volatile ("nop");
00210 asm volatile ("nop"); asm volatile ("nop");
00211 data = inp(LCD_DATA_PIN);
00212 cbi(LCD_CTRL_PORT, LCD_CTRL_E);
00213 cbi(LCD_CTRL_PORT, LCD_CTRL_RW);
00214 outp(0xFF, LCD_DATA_DDR);
00215 sei();
00216 #else
00217 sbi(MCUCR, SRW);
00218 glcdBusyWait(controller);
00219 data = *(volatile unsigned char *) (LCD_DATA_ADDR);
00220 cbi(MCUCR, SRW);
00221 #endif
00222
00223 GrLcdState.ctrlr[controller].xAddr++;
00224 GrLcdState.lcdXAddr++;
00225 if(GrLcdState.lcdXAddr > GLCD_XPIXELS)
00226 {
00227 GrLcdState.lcdYAddr++;
00228 glcdSetYAddress(GrLcdState.lcdYAddr);
00229 glcdSetXAddress(0);
00230 }
00231 return data;
00232 }
00233
00234 void glcdReset(u08 resetState)
00235 {
00236
00237
00238 if(resetState)
00239 cbi(LCD_CTRL_PORT, LCD_CTRL_RESET);
00240 else
00241 sbi(LCD_CTRL_PORT, LCD_CTRL_RESET);
00242 }
00243
00244 void glcdSetXAddress(u08 xAddr)
00245 {
00246
00247 GrLcdState.lcdXAddr = xAddr;
00248
00249 glcdControlWrite(0, GLCD_Y_ADDR | 0x00);
00250 GrLcdState.ctrlr[0].xAddr = 0;
00251 glcdControlWrite(1, GLCD_Y_ADDR | 0x00);
00252 GrLcdState.ctrlr[1].xAddr = 0;
00253
00254 glcdControlWrite((GrLcdState.lcdXAddr/GLCD_CONTROLLER_WIDTH),
00255 GLCD_Y_ADDR | (GrLcdState.lcdXAddr & 0x3F));
00256 }
00257
00258 void glcdSetYAddress(u08 yAddr)
00259 {
00260
00261 GrLcdState.lcdYAddr = yAddr;
00262
00263 glcdControlWrite(0, GLCD_SET_PAGE | yAddr);
00264 glcdControlWrite(1, GLCD_SET_PAGE | yAddr);
00265 }
00266
00267
00268
00269
00270
00271 void glcdInit()
00272 {
00273
00274 glcdInitHW();
00275
00276 glcdReset(FALSE);
00277
00278 glcdControlWrite(0, GLCD_ON_CTRL | GLCD_ON_DISPLAY);
00279 glcdControlWrite(1, GLCD_ON_CTRL | GLCD_ON_DISPLAY);
00280
00281 glcdClearScreen();
00282
00283 glcdHome();
00284 }
00285
00286 void glcdHome(void)
00287 {
00288
00289 glcdStartLine(0);
00290 glcdSetAddress(0,0);
00291
00292 GrLcdState.ctrlr[0].xAddr = 0;
00293 GrLcdState.ctrlr[0].yAddr = 0;
00294 GrLcdState.ctrlr[0].xAddr = 0;
00295 GrLcdState.ctrlr[0].yAddr = 0;
00296 }
00297
00298 void glcdClearScreen(void)
00299 {
00300 u08 pageAddr;
00301 u08 xAddr;
00302
00303
00304
00305 for(pageAddr=0; pageAddr<(GLCD_YPIXELS>>3); pageAddr++)
00306 {
00307
00308 glcdSetAddress(0, pageAddr);
00309
00310 for(xAddr=0; xAddr<GLCD_XPIXELS; xAddr++)
00311 {
00312 glcdDataWrite(0x00);
00313 }
00314 }
00315 }
00316
00317 void glcdStartLine(u08 start)
00318 {
00319 glcdControlWrite(0, GLCD_START_LINE | start);
00320 glcdControlWrite(1, GLCD_START_LINE | start);
00321 }
00322
00323 void glcdSetAddress(u08 x, u08 yLine)
00324 {
00325
00326 glcdSetYAddress(yLine);
00327 glcdSetXAddress(x);
00328 }
00329
00330 void glcdGotoChar(u08 line, u08 col)
00331 {
00332 glcdSetAddress(col*6, line);
00333 }
00334
00335 void glcdDelay(u16 p)
00336 {
00337 unsigned int i;
00338 unsigned char j;
00339
00340
00341
00342 for (i = 0; i < p; i++) for (j = 0; j < 10; j++);
00343 }
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380