4 static const uint8 FONT_X = 5;
5 static const uint8 FONT_Y = 7;
6 static const uint16 FONT_MIN_CODE = 0x20;
7 static const uint16 FONT_MAX_CODE = 0x7F;
9 #define swap(a,b) {int c=a;a=b;b=c;}
10 #define abs(n) (((int)(n) < 0) ? ((int)(n) * (-1)) : (n))
12 #define H8_3069F_P4DDR ((volatile uint8 *)0xFEE003)
13 #define H8_3069F_P4DR ((volatile uint8 *)0xFFFFD3)
14 #define H8_3069F_CSCR ((volatile uint8 *)0xFEE01F)
16 #define LCD_ADDR_LEFT ((volatile uint8 *)0x800000)
17 #define LCD_ADDR_RIGHT ((volatile uint8 *)0xA00000)
18 #define LCD_AOFS_CMD (0)
19 #define LCD_AOFS_DAT (1 << 3)
21 #define BIT_LCD_RES (1 << 7)
22 #define BIT_SDC_CS (1 << 0)
23 #define BIT_VSCCS (1 << 2)
24 #define BIT_VSDCS (1 << 3)
25 #define BIT_VSRST (1 << 5)
27 #define LCD1_CMD(VAL) \
29 *(LCD_ADDR_LEFT + LCD_AOFS_CMD) = (VAL); \
32 #define LCD1_DAT_WRITE(VAL) \
34 *(LCD_ADDR_LEFT + LCD_AOFS_DAT) = (VAL); \
37 #define LCD1_DAT_READ() (*(LCD_ADDR_LEFT + LCD_AOFS_DAT))
39 #define LCD2_CMD(VAL) \
41 *(LCD_ADDR_RIGHT + LCD_AOFS_CMD) = (VAL); \
44 #define LCD2_DAT_WRITE(VAL) \
46 *(LCD_ADDR_RIGHT + LCD_AOFS_DAT) = (VAL); \
49 #define LCD2_DAT_READ() (*(LCD_ADDR_RIGHT + LCD_AOFS_DAT))
51 static const uint8 font5x7_data[] = {
52 0x00, 0x00, 0x00, 0x00, 0x00, // (white space)
53 0x00, 0x00, 0x5F, 0x00, 0x00, // !
54 0x00, 0x07, 0x00, 0x07, 0x00, // "
55 0x14, 0x7F, 0x14, 0x7F, 0x14, // #
56 0x24, 0x2A, 0x7F, 0x2A, 0x12, // $
57 0x23, 0x13, 0x08, 0x64, 0x62, // %
58 0x36, 0x49, 0x55, 0x22, 0x50, // &
59 0x00, 0x05, 0x03, 0x00, 0x00, // '
60 0x00, 0x1C, 0x22, 0x41, 0x00, // (
61 0x00, 0x41, 0x22, 0x1C, 0x00, // )
62 0x08, 0x2A, 0x1C, 0x2A, 0x08, // *
63 0x08, 0x08, 0x3E, 0x08, 0x08, // +
64 0x00, 0x50, 0x30, 0x00, 0x00, // ,
65 0x08, 0x08, 0x08, 0x08, 0x08, // -
66 0x00, 0x60, 0x60, 0x00, 0x00, // .
67 0x20, 0x10, 0x08, 0x04, 0x02, // /
68 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
69 0x00, 0x42, 0x7F, 0x40, 0x00, // 1
70 0x42, 0x61, 0x51, 0x49, 0x46, // 2
71 0x21, 0x41, 0x45, 0x4B, 0x31, // 3
72 0x18, 0x14, 0x12, 0x7F, 0x10, // 4
73 0x27, 0x45, 0x45, 0x45, 0x39, // 5
74 0x3C, 0x4A, 0x49, 0x49, 0x30, // 6
75 0x01, 0x71, 0x09, 0x05, 0x03, // 7
76 0x36, 0x49, 0x49, 0x49, 0x36, // 8
77 0x06, 0x49, 0x49, 0x29, 0x1E, // 9
78 0x00, 0x36, 0x36, 0x00, 0x00, // :
79 0x00, 0x56, 0x36, 0x00, 0x00, // ;
80 0x00, 0x08, 0x14, 0x22, 0x41, // <
81 0x14, 0x14, 0x14, 0x14, 0x14, // =
82 0x41, 0x22, 0x14, 0x08, 0x00, // >
83 0x02, 0x01, 0x51, 0x09, 0x06, // ?
84 0x32, 0x49, 0x79, 0x41, 0x3E, // @
85 0x7E, 0x11, 0x11, 0x11, 0x7E, // A
86 0x7F, 0x49, 0x49, 0x49, 0x36, // B
87 0x3E, 0x41, 0x41, 0x41, 0x22, // C
88 0x7F, 0x41, 0x41, 0x22, 0x1C, // D
89 0x7F, 0x49, 0x49, 0x49, 0x41, // E
90 0x7F, 0x09, 0x09, 0x01, 0x01, // F
91 0x3E, 0x41, 0x41, 0x51, 0x32, // G
92 0x7F, 0x08, 0x08, 0x08, 0x7F, // H
93 0x00, 0x41, 0x7F, 0x41, 0x00, // I
94 0x20, 0x40, 0x41, 0x3F, 0x01, // J
95 0x7F, 0x08, 0x14, 0x22, 0x41, // K
96 0x7F, 0x40, 0x40, 0x40, 0x40, // L
97 0x7F, 0x02, 0x04, 0x02, 0x7F, // M
98 0x7F, 0x04, 0x08, 0x10, 0x7F, // N
99 0x3E, 0x41, 0x41, 0x41, 0x3E, // O
100 0x7F, 0x09, 0x09, 0x09, 0x06, // P
101 0x3E, 0x41, 0x51, 0x21, 0x5E, // Q
102 0x7F, 0x09, 0x19, 0x29, 0x46, // R
103 0x46, 0x49, 0x49, 0x49, 0x31, // S
104 0x01, 0x01, 0x7F, 0x01, 0x01, // T
105 0x3F, 0x40, 0x40, 0x40, 0x3F, // U
106 0x1F, 0x20, 0x40, 0x20, 0x1F, // V
107 0x7F, 0x20, 0x18, 0x20, 0x7F, // W
108 0x63, 0x14, 0x08, 0x14, 0x63, // X
109 0x03, 0x04, 0x78, 0x04, 0x03, // Y
110 0x61, 0x51, 0x49, 0x45, 0x43, // Z
111 0x00, 0x00, 0x7F, 0x41, 0x41, // [
112 0x02, 0x04, 0x08, 0x10, 0x20, // /
113 0x41, 0x41, 0x7F, 0x00, 0x00, // ]
114 0x04, 0x02, 0x01, 0x02, 0x04, // ^
115 0x40, 0x40, 0x40, 0x40, 0x40, // _
116 0x00, 0x01, 0x02, 0x04, 0x00, // `
117 0x20, 0x54, 0x54, 0x54, 0x78, // a
118 0x7F, 0x48, 0x44, 0x44, 0x38, // b
119 0x38, 0x44, 0x44, 0x44, 0x20, // c
120 0x38, 0x44, 0x44, 0x48, 0x7F, // d
121 0x38, 0x54, 0x54, 0x54, 0x18, // e
122 0x08, 0x7E, 0x09, 0x01, 0x02, // f
123 0x08, 0x14, 0x54, 0x54, 0x3C, // g
124 0x7F, 0x08, 0x04, 0x04, 0x78, // h
125 0x00, 0x44, 0x7D, 0x40, 0x00, // i
126 0x20, 0x40, 0x44, 0x3D, 0x00, // j
127 0x00, 0x7F, 0x10, 0x28, 0x44, // k
128 0x00, 0x41, 0x7F, 0x40, 0x00, // l
129 0x7C, 0x04, 0x18, 0x04, 0x78, // m
130 0x7C, 0x08, 0x04, 0x04, 0x78, // n
131 0x38, 0x44, 0x44, 0x44, 0x38, // o
132 0x7C, 0x14, 0x14, 0x14, 0x08, // p
133 0x08, 0x14, 0x14, 0x18, 0x7C, // q
134 0x7C, 0x08, 0x04, 0x04, 0x08, // r
135 0x48, 0x54, 0x54, 0x54, 0x20, // s
136 0x04, 0x3F, 0x44, 0x40, 0x20, // t
137 0x3C, 0x40, 0x40, 0x20, 0x7C, // u
138 0x1C, 0x20, 0x40, 0x20, 0x1C, // v
139 0x3C, 0x40, 0x30, 0x40, 0x3C, // w
140 0x44, 0x28, 0x10, 0x28, 0x44, // x
141 0x0C, 0x50, 0x50, 0x50, 0x3C, // y
142 0x44, 0x64, 0x54, 0x4C, 0x44, // z
143 0x00, 0x08, 0x36, 0x41, 0x00, // {
144 0x00, 0x00, 0x7F, 0x00, 0x00, // |
145 0x00, 0x41, 0x36, 0x08, 0x00, // }
146 0x08, 0x08, 0x2A, 0x1C, 0x08, // ->
147 0x08, 0x1C, 0x2A, 0x08, 0x08 // <-
150 void sg12232c_init(void)
152 *H8_3069F_P4DDR = BIT_LCD_RES | BIT_SDC_CS | BIT_VSCCS | BIT_VSDCS | BIT_VSRST;
157 *H8_3069F_P4DR &= ~BIT_LCD_RES;
158 asm volatile ("nop");
159 asm volatile ("nop");
160 asm volatile ("nop");
161 asm volatile ("nop");
162 *H8_3069F_P4DR |= BIT_LCD_RES;
164 *H8_3069F_CSCR = 0x3F;
166 LCD1_CMD(0xE2); // Reset
167 LCD1_CMD(0xA4); // Static Drive Off
168 LCD1_CMD(0xC0); // Display Start Line
169 LCD1_CMD(0xAF); // Display On
170 LCD1_CMD(0xB8); // Page Address Setup
171 LCD1_CMD(0x00); // Column Address
173 LCD2_CMD(0xE2); // Reset
174 LCD2_CMD(0xA4); // Static Drive Off
175 LCD2_CMD(0xC0); // Display Start Line
176 LCD2_CMD(0xAF); // Display On
177 LCD2_CMD(0xB8); // Page Address Setup
178 LCD2_CMD(0x00); // Column Address
181 void sg12232c_clear(void)
185 for (p = 0; p <= 3; p++) {
186 LCD1_CMD(0xB8 | (p & 0x03)); // Page Address Setup
187 LCD1_CMD(0x00 | (0 & 0x7F)); // Column Address
188 for (c = 0; c < 62; c++) {
192 LCD2_CMD(0xB8 | (p & 0x03)); // Page Address Setup
193 LCD2_CMD(0x00 | (0 & 0x7F)); // Column Address
194 for (c = 0; c < 62; c++) {
200 void sg12232c_set_pixel(int x, int y, int reverse)
208 LCD1_CMD(0xB8 | (p & 0x03)); // Page Address Setup
209 LCD1_CMD(0x00 | (c & 0x7F)); // Column Address
211 dat = LCD1_DAT_READ(); // Dummy Read
212 dat = LCD1_DAT_READ(); // Real Read
214 dat |= (1 << (y % 8));
216 dat &= ~(1 << (y % 8));
223 LCD2_CMD(0xB8 | (p & 0x03)); // Page Address Setup
224 LCD2_CMD(0x00 | (c & 0x7F)); // Column Address
226 dat = LCD2_DAT_READ(); // Dummy Read
227 dat = LCD2_DAT_READ(); // Real Read
229 dat |= (1 << (y % 8));
231 dat &= ~(1 << (y % 8));
238 void sg12232c_draw_line(uint16 x1, uint16 y1, uint16 x2, uint16 y2, uint8 reverse)
242 * Bresenham's line algorithm
244 uint8 steep = abs(y2 - y1) > abs(x2 - x1);
253 int deltax = x2 - x1;
254 int deltay = abs(y2 - y1);
255 int error = deltax / 2;
263 for (x = x1; x <= x2; x++) {
266 sg12232c_set_pixel(y, x, 0);
268 sg12232c_set_pixel(y, x, 1);
272 sg12232c_set_pixel(x, y, 0);
274 sg12232c_set_pixel(x, y, 1);
277 error = error - deltay;
280 error = error + deltax;
285 void sg12232c_draw_box(uint16 x1, uint16 y1, uint16 x2, uint16 y2, uint8 reverse)
288 for (x = x1; x <= x2; x++) {
290 sg12232c_set_pixel(x, y1, 0);
291 sg12232c_set_pixel(x, y2, 0);
293 sg12232c_set_pixel(x, y1, 1);
294 sg12232c_set_pixel(x, y2, 1);
297 for (y = y1; y <= y2; y++) {
299 sg12232c_set_pixel(x1, y, 0);
300 sg12232c_set_pixel(x2, y, 0);
302 sg12232c_set_pixel(x1, y, 1);
303 sg12232c_set_pixel(x2, y, 1);
308 void sg12232c_fill_box(uint16 x1, uint16 y1, uint16 x2, uint16 y2, uint8 reverse)
311 for (x = x1; x <= x2; x++) {
312 for (y = y1; y <= y2; y++) {
314 sg12232c_set_pixel(x, y, 0);
316 sg12232c_set_pixel(x, y, 1);
322 void sg12232c_draw_string(uint8 x, uint8 y, char *str, uint8 reverse)
327 sg12232c_draw_char(x + (FONT_X * cnt), y, *p, reverse);
333 void sg12232c_draw_char(uint8 x, uint8 y, char c, uint8 reverse)
336 if ((FONT_MIN_CODE <= c) &&(c <= FONT_MAX_CODE)) {
337 int aofs = (c - FONT_MIN_CODE) * FONT_X;
338 for (i = 0; i < FONT_X; i++) {
339 uint8 pat = font5x7_data[aofs + i];
340 for (j = 0; j < FONT_Y; j++) {
341 if (pat & (1 << j)) {
343 sg12232c_set_pixel(x + i, y + j, 0);
345 sg12232c_set_pixel(x + i, y + j, 1);
349 sg12232c_set_pixel(x + i, y + j, 1);
351 sg12232c_set_pixel(x + i, y + j, 0);
357 for (i = 0; i < FONT_X; i++) {
358 uint8 pat = (i % 2) ? 0x55 : 0xAA;
359 for (j = 0; j < FONT_Y; j++) {
360 if (pat & (1 << j)) {
362 sg12232c_set_pixel(x + i, y + j, 0);
364 sg12232c_set_pixel(x + i, y + j, 1);
368 sg12232c_set_pixel(x + i, y + j, 1);
370 sg12232c_set_pixel(x + i, y + j, 0);
378 void sg12232c_draw_checkbox(
379 uint16 x1, uint16 y1, uint16 x2, uint16 y2, uint8 state, uint8 reverse)
381 sg12232c_draw_box(x1, y1, x2, y2, reverse);
383 sg12232c_draw_line(x1, y1, x2, y2, reverse);
384 sg12232c_draw_line(x1, y2, x2, y1, reverse);
388 void sg12232c_draw_progressbar(
389 uint16 x1, uint16 y1, uint16 x2, uint16 y2,
390 int min, int max, int value, uint8 reverse)
392 sg12232c_draw_box(x1, y1, x2, y2, reverse);
393 if ((value < min) || (max < value)) {
396 int tmp_max = max - min;
397 int tmp_val = value - min;
398 int pix = ((x2 - x1) * tmp_val) / tmp_max;
399 sg12232c_fill_box(x1 + 1, y1 + 1, x1 + pix - 1, y2 - 1, reverse);
401 sg12232c_fill_box(x1 + pix, y1 + 1, x2 - 1, y2 - 1, !reverse);