00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <stdio.h>
00018 #include <conio.h>
00019 #include <string.h>
00020 #include "sc12/hwapi.h"
00021 #include "sc12/rtos.h"
00022 #include "gfxdriver.h"
00023 #include "misc.h"
00024
00025
00029 #define LCD_CLOCK 2000
00030
00049 #define LCD_MINPWMON 50
00050 #define LCD_MINPWMOFF 10
00051
00052
00058 #define LCD_UPSIDEDOWN
00059
00060 #ifdef LCD_UPSIDEDOWN
00061 static const unsigned char mirror[256] = {
00062 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,
00063 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,
00064 0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,
00065 0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC,
00066 0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2,
00067 0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA,
00068 0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6,
00069 0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE,
00070 0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1,
00071 0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9,
00072 0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5,
00073 0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD,
00074 0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3,
00075 0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB,
00076 0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7,
00077 0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF
00078 };
00079 #endif
00080
00084 static unsigned char lcd_screen[4][128];
00085
00086
00090 char *LCD_GetScreenBuffer()
00091 {
00092 return (char*)(&lcd_screen[0][0]);
00093 }
00094
00095
00099 int LCD_GetWidth()
00100 {
00101 return 122;
00102 }
00103
00104
00108 int LCD_GetHeight()
00109 {
00110 return 32;
00111 }
00112
00113
00117 void LCD_Clear()
00118 {
00119 memset(lcd_screen, 0x00, sizeof(lcd_screen));
00120 }
00121
00122
00130 void LCD_Update()
00131 {
00132 #ifndef LCD_UPSIDEDOWN
00133 for (int y=0; y<4; y++) {
00134 outp(0x600, 0x00);
00135 outp(0x600, 0xB8 + y);
00136 outp(0x500, 0x00);
00137 outp(0x500, 0xB8 + y);
00138 for (int x=0; x<61; x++) {
00139 outp(0x602, lcd_screen[y][x ]);
00140 outp(0x502, lcd_screen[y][x+61]);
00141 }
00142 }
00143 #else
00144 for (int y=0; y<4; y++) {
00145 outp(0x600, 0x00);
00146 outp(0x600, 0xB8 + (3-y));
00147 outp(0x500, 0x00);
00148 outp(0x500, 0xB8 + (3-y));
00149 for (int x=60; x>=0; x--) {
00150 outp(0x502, mirror[lcd_screen[y][x ]]);
00151 outp(0x602, mirror[lcd_screen[y][x+61]]);
00152 }
00153 }
00154 #endif
00155
00156 }
00157
00158
00168 void LCD_SetBrightness(int level)
00169 {
00170 long period;
00171 unsigned pwmOn, pwmOff;
00172
00173 if (level < 0) level = 0;
00174 if (level > 255) level = 255;
00175 period = hal_get_frequency(FREQ_TIMER)/LCD_CLOCK;
00176 pwmOn = (unsigned)(period*level/255);
00177 pwmOff = (unsigned)period - pwmOn;
00178 if (pwmOn < LCD_MINPWMON ) pwmOn = LCD_MINPWMON;
00179 if (pwmOff < LCD_MINPWMOFF) pwmOff = LCD_MINPWMOFF;
00180
00181 hal_init_timer(0, TIMER_CONT | TIMER_INT, pwmOn);
00182 hal_set_timer_duty(0, true, pwmOff);
00183 hal_start_timer(0);
00184 }
00185
00186
00191 void LCD_Init()
00192 {
00193 printf("initializing SED1520 LCD..\n");
00194 pfe_enable_bus(0xff, true);
00195 pfe_enable_pcs(5);
00196 pfe_enable_pcs(6);
00197
00198
00199
00200 pfe_enable_timer(TIMER_OUT0);
00201 LCD_SetBrightness(255);
00202
00203 outp(0x500, 0xe2);
00204 outp(0x600, 0xe2);
00205 outp(0x500, 0xa0);
00206 outp(0x600, 0xa0);
00207 outp(0x500, 0xa4);
00208 outp(0x600, 0xa4);
00209 outp(0x500, 0xaf);
00210 outp(0x600, 0xaf);
00211
00212 LCD_Clear();
00213 LCD_Update();
00214 }
00215
00216
00220 void LCD_Done()
00221 {
00222
00223
00224 outp(0x500, 0xa5);
00225 outp(0x600, 0xa5);
00226 outp(0x500, 0xae);
00227 outp(0x600, 0xae);
00228
00229
00230
00231 hal_stop_timer(0);
00232
00233
00234
00235 pfe_enable_pio(13, PIO_IPD);
00236 pfe_enable_pio( 2, PIO_IPU);
00237 pfe_enable_pio( 3, PIO_IPU);
00238 }