00001
00023
00024
#include"iom169.h"
00025
#include"LCD_driver.h"
00026
#include"types.h"
00027
00028
00029
00030 extern unsigned char gButtonTimeout;
00031
00032 extern BOOL gAutoPressJoystick;
00033
00034
00035 char gLCD_Update_Required =
FALSE;
00036
00037
00038 char LCD_Data[
LCD_REGISTER_COUNT];
00039
00040
00041
00042 char gTextBuffer[
TEXTBUFFER_SIZE];
00043
00044
00045
00046
00047 signed char gScroll;
00048 char gScrollMode;
00049
00051 char gLCD_Start_Scroll_Timer = 0;
00052
00053
00054
00055 char gFlashTimer = 0;
00056
00057
00058 char gColon = 0;
00059
00060
00061
00062
00063 __flash
unsigned int LCD_character_table[] =
00064 {
00065 0x0A51,
00066 0x2A80,
00067 0x0000,
00068 0x0A00,
00069 0x0A51,
00070 0x0000,
00071 0x5559,
00072 0x0118,
00073 0x1e11,
00074 0x1b11,
00075 0x0b50,
00076 0x1b41,
00077 0x1f41,
00078 0x0111,
00079 0x1f51,
00080 0x1b51,
00081 0x0000,
00082 0x0000,
00083 0x0000,
00084 0x0000,
00085 0x0000,
00086 0x0000,
00087 0x0000,
00088 0x0f51,
00089 0x3991,
00090 0x1441,
00091 0x3191,
00092 0x1e41,
00093 0x0e41,
00094 0x1d41,
00095 0x0f50,
00096 0x2080,
00097 0x1510,
00098 0x8648,
00099 0x1440,
00100 0x0578,
00101 0x8570,
00102 0x1551,
00103 0x0e51,
00104 0x9551,
00105 0x8e51,
00106 0x9021,
00107 0x2081,
00108 0x1550,
00109 0x4448,
00110 0xc550,
00111 0xc028,
00112 0x2028,
00113 0x5009,
00114 0x0000,
00115 0x0000,
00116 0x0000,
00117 0x0000,
00118 0x0000
00119 };
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 void LCD_Init (
void)
00135 {
00136
LCD_AllSegments(
FALSE);
00137
00138
LCD_CONTRAST_LEVEL(
LCD_INITIAL_CONTRAST);
00139
00140
00141
00142 LCDCRB = (1<<LCDCS) | (3<<LCDMUX0) | (7<<LCDPM0);
00143
00144
00145 LCDFRR = (0<<LCDPS0) | (7<<LCDCD0);
00146
00147 LCDCRA = (1<<LCDEN) | (1<<LCDAB);
00148
00149
00150 LCDCRA |= (1<<LCDIE);
00151
00152
gLCD_Update_Required =
FALSE;
00153
00154
00155 }
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 void LCD_WriteDigit(
char c,
char digit)
00175 {
00176
00177
unsigned int seg = 0x0000;
00178
char mask, nibble;
00179
char *ptr;
00180
char i;
00181
00182
00183
if (digit > 5)
00184
return;
00185
00186
00187
if ((c >=
'*') && (c <=
'z'))
00188 {
00189
00190
if (c >=
'a')
00191 c &= ~0x20;
00192
00193 c -=
'*';
00194
00195 seg =
LCD_character_table[c];
00196 }
00197
00198
00199
if (digit & 0x01)
00200
mask = 0x0F;
00201
else
00202
mask = 0xF0;
00203
00204 ptr =
LCD_Data + (digit >> 1);
00205
00206
for (i = 0; i < 4; i++)
00207 {
00208 nibble = seg & 0x000F;
00209 seg >>= 4;
00210
if (digit & 0x01)
00211 nibble <<= 4;
00212 *ptr = (*ptr &
mask) | nibble;
00213 ptr += 5;
00214 }
00215 }
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 void LCD_AllSegments(
char show)
00231 {
00232
unsigned char i;
00233
00234
if (show)
00235 show = 0xFF;
00236
00237
00238
for (i=0; i <
LCD_REGISTER_COUNT; i++)
00239 *(
LCD_Data + i) = show;
00240 }
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
#pragma vector = LCD_SOF_vect
00255 __interrupt void LCD_SOF_interrupt(
void)
00256 {
00257
static char LCD_timer =
LCD_TIMER_SEED;
00258
char c;
00259
char c_flash;
00260
char flash;
00261
00262
char EOL;
00263
unsigned char i;
00264
00265
00266
static char timeout_count;
00267
00268
00269
00270
if(!
gButtonTimeout)
00271 {
00272 timeout_count++;
00273
00274
if(timeout_count > 3)
00275 {
00276
gButtonTimeout =
TRUE;
00277 timeout_count = 0;
00278 }
00279 }
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298 LCD_timer--;
00299
00300
if (
gScrollMode)
00301 {
00302
00303
00304
if (LCD_timer == 0)
00305 {
00306
if (
gLCD_Start_Scroll_Timer == 0)
00307 {
00308
gLCD_Update_Required =
TRUE;
00309 }
00310
else
00311
gLCD_Start_Scroll_Timer--;
00312 }
00313 }
00314
else
00315 {
00316
00317
00318
gScroll = 0;
00319 }
00320
00321
00322 EOL =
FALSE;
00323
if (
gLCD_Update_Required ==
TRUE)
00324 {
00325
00326
if (gFlashTimer < (LCD_FLASH_SEED >> 1))
00327 flash = 0;
00328
else
00329 flash = 1;
00330
00331
00332
for (i = 0; i < 6; i++)
00333 {
00334
if ((
gScroll+i) >= 0 && (!EOL))
00335 {
00336
00337 c =
gTextBuffer[i +
gScroll];
00338 c_flash = c & 0x80 ? 1 : 0;
00339 c = c & 0x7F;
00340
00341
if (c ==
'\0')
00342 EOL = i+1;
00343 }
00344
else
00345 c =
' ';
00346
00347
00348
00349
if (c_flash && flash)
00350
LCD_WriteDigit(
' ', i);
00351
else
00352
LCD_WriteDigit(c, i);
00353 }
00354
00355
00356
for (i = 0; i <
LCD_REGISTER_COUNT; i++)
00357 *(
pLCDREG + i) = *(
LCD_Data+i);
00358
00359
00360
if (
gColon)
00361 *(
pLCDREG + 8) = 0x01;
00362
else
00363 *(
pLCDREG + 8) = 0x00;
00364
00365
00366
00367
if (EOL == 1)
00368
gScroll = -6;
00369
else
00370
gScroll++;
00371
00372
00373
gLCD_Update_Required =
FALSE;
00374 }
00375
00376
00377
00378
if (LCD_timer == 0)
00379 {
00380
00381
00382
00383 LCD_timer =
LCD_TIMER_SEED;
00384 }
00385
00386
00387
if (
gFlashTimer ==
LCD_FLASH_SEED)
00388
gFlashTimer= 0;
00389
else
00390
gFlashTimer++;
00391
00392 }