5 * @author Andre Nijholt
\r
8 public static final int SCREEN_SCALE = 4;
\r
9 public static final int SCREEN_WIDTH = 100;
\r
10 public static final int SCREEN_HEIGHT = 64;
\r
12 public static final int DISPLAY_WIDTH = 100;
\r
13 public static final int DISPLAY_DEPTH = 8; // 8 * 8 bits = 64 pixels
\r
15 public static final int NOOF_CHARS = 128;
\r
16 public static final int FONT_WIDTH = 5;
\r
17 public static final int CELL_WIDTH = FONT_WIDTH + 1;
\r
19 public static final int DISPLAY_CHAR_WIDTH = DISPLAY_WIDTH / CELL_WIDTH;
\r
20 public static final int DISPLAY_CHAR_DEPTH = DISPLAY_DEPTH;
\r
22 private static final byte font[][] = {
\r
23 /* 0x00 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
24 /* 0x01 */ {0x3E, 0x55, 0x61, 0x55, 0x3E},
\r
25 /* 0x02 */ {0x3E, 0x6B, 0x5F, 0x6B, 0x3E},
\r
26 /* 0x03 */ {0x0C, 0x1E, 0x3C, 0x1E, 0x0C},
\r
27 /* 0x04 */ {0x08, 0x1C, 0x3E, 0x1C, 0x08},
\r
28 /* 0x05 */ {0x08, 0x7c, 0x0e, 0x7c, 0x08}, /* SHIFT char */
\r
29 /* 0x06 */ {0x18, 0x5C, 0x7E, 0x5C, 0x18},
\r
30 /* 0x07 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
31 /* 0x08 */ {0x08, 0x1c, 0x3e, 0x08, 0x08}, /* BACKSPACE char */
\r
32 /* 0x09 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
33 /* 0x0A */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
34 /* 0x0B */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
35 /* 0x0C */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
36 /* 0x0D */ {0x10, 0x38, 0x7c, 0x10, 0x1e}, /* ENTER char */
\r
37 /* 0x0E */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
38 /* 0x0F */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
39 /* 0x10 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
40 /* 0x11 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
41 /* 0x12 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
42 /* 0x13 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
43 /* 0x14 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
44 /* 0x15 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
45 /* 0x16 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
46 /* 0x17 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
47 /* 0x18 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
48 /* 0x19 */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
49 /* 0x1A */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
50 /* 0x1B */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
51 /* 0x1C */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
52 /* 0x1D */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
53 /* 0x1E */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
54 /* 0x1F */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
55 /* 0x20 */ {0x00, 0x00, 0x00, 0x00, 0x00},
\r
56 /* 0x21 */ {0x00, 0x00, 0x5F, 0x00, 0x00},
\r
57 /* 0x22 */ {0x00, 0x07, 0x00, 0x07, 0x00},
\r
58 /* 0x23 */ {0x14, 0x3E, 0x14, 0x3E, 0x14},
\r
59 /* 0x24 */ {0x04, 0x2A, 0x7F, 0x2A, 0x10},
\r
60 /* 0x25 */ {0x26, 0x16, 0x08, 0x34, 0x32},
\r
61 /* 0x26 */ {0x36, 0x49, 0x59, 0x26, 0x50},
\r
62 /* 0x27 */ {0x00, 0x00, 0x07, 0x00, 0x00},
\r
63 /* 0x28 */ {0x00, 0x1C, 0x22, 0x41, 0x00},
\r
64 /* 0x29 */ {0x00, 0x41, 0x22, 0x1C, 0x00},
\r
65 /* 0x2A */ {0x2A, 0x1C, 0x7F, 0x1C, 0x2A},
\r
66 /* 0x2B */ {0x08, 0x08, 0x3E, 0x08, 0x08},
\r
67 /* 0x2C */ {0x00, 0x50, 0x30, 0x00, 0x00},
\r
68 /* 0x2D */ {0x08, 0x08, 0x08, 0x08, 0x08},
\r
69 /* 0x2E */ {0x00, 0x60, 0x60, 0x00, 0x00},
\r
70 /* 0x2F */ {0x20, 0x10, 0x08, 0x04, 0x02},
\r
71 /* 0x30 */ {0x3E, 0x51, 0x49, 0x45, 0x3E},
\r
72 /* 0x31 */ {0x00, 0x42, 0x7F, 0x40, 0x00},
\r
73 /* 0x32 */ {0x42, 0x61, 0x51, 0x49, 0x46},
\r
74 /* 0x33 */ {0x21, 0x41, 0x45, 0x4B, 0x31},
\r
75 /* 0x34 */ {0x18, 0x14, 0x12, 0x7F, 0x10},
\r
76 /* 0x35 */ {0x27, 0x45, 0x45, 0x45, 0x39},
\r
77 /* 0x36 */ {0x3C, 0x4A, 0x49, 0x49, 0x30},
\r
78 /* 0x37 */ {0x01, 0x01, 0x79, 0x05, 0x03},
\r
79 /* 0x38 */ {0x36, 0x49, 0x49, 0x49, 0x36},
\r
80 /* 0x39 */ {0x06, 0x49, 0x49, 0x29, 0x1E},
\r
81 /* 0x3A */ {0x00, 0x36, 0x36, 0x00, 0x00},
\r
82 /* 0x3B */ {0x00, 0x56, 0x36, 0x00, 0x00},
\r
83 /* 0x3C */ {0x08, 0x14, 0x22, 0x41, 0x00},
\r
84 /* 0x3D */ {0x14, 0x14, 0x14, 0x14, 0x14},
\r
85 /* 0x3E */ {0x41, 0x22, 0x14, 0x08, 0x00},
\r
86 /* 0x3F */ {0x02, 0x01, 0x59, 0x05, 0x02},
\r
87 /* 0x40 */ {0x1C, 0x2A, 0x36, 0x3E, 0x0C},
\r
88 /* 0x41 */ {0x7E, 0x09, 0x09, 0x09, 0x7E},
\r
89 /* 0x42 */ {0x7F, 0x49, 0x49, 0x49, 0x3E},
\r
90 /* 0x43 */ {0x3E, 0x41, 0x41, 0x41, 0x22},
\r
91 /* 0x44 */ {0x7F, 0x41, 0x41, 0x22, 0x1C},
\r
92 /* 0x45 */ {0x7F, 0x49, 0x49, 0x49, 0x41},
\r
93 /* 0x46 */ {0x7F, 0x09, 0x09, 0x09, 0x01},
\r
94 /* 0x47 */ {0x3E, 0x41, 0x41, 0x49, 0x3A},
\r
95 /* 0x48 */ {0x7F, 0x08, 0x08, 0x08, 0x7F},
\r
96 /* 0x49 */ {0x00, 0x41, 0x7F, 0x41, 0x00},
\r
97 /* 0x4A */ {0x20, 0x40, 0x41, 0x3F, 0x01},
\r
98 /* 0x4B */ {0x7F, 0x08, 0x14, 0x22, 0x41},
\r
99 /* 0x4C */ {0x7F, 0x40, 0x40, 0x40, 0x40},
\r
100 /* 0x4D */ {0x7F, 0x02, 0x04, 0x02, 0x7F},
\r
101 /* 0x4E */ {0x7F, 0x04, 0x08, 0x10, 0x7F},
\r
102 /* 0x4F */ {0x3E, 0x41, 0x41, 0x41, 0x3E},
\r
103 /* 0x50 */ {0x7F, 0x09, 0x09, 0x09, 0x06},
\r
104 /* 0x51 */ {0x3E, 0x41, 0x51, 0x21, 0x5E},
\r
105 /* 0x52 */ {0x7F, 0x09, 0x19, 0x29, 0x46},
\r
106 /* 0x53 */ {0x26, 0x49, 0x49, 0x49, 0x32},
\r
107 /* 0x54 */ {0x01, 0x01, 0x7F, 0x01, 0x01},
\r
108 /* 0x55 */ {0x3F, 0x40, 0x40, 0x40, 0x3F},
\r
109 /* 0x56 */ {0x1F, 0x20, 0x40, 0x20, 0x1F},
\r
110 /* 0x57 */ {0x7F, 0x20, 0x18, 0x20, 0x7F},
\r
111 /* 0x58 */ {0x63, 0x14, 0x08, 0x14, 0x63},
\r
112 /* 0x59 */ {0x03, 0x04, 0x78, 0x04, 0x03},
\r
113 /* 0x5A */ {0x61, 0x51, 0x49, 0x45, 0x43},
\r
114 /* 0x5B */ {0x00, 0x7F, 0x41, 0x41, 0x00},
\r
115 /* 0x5C */ {0x02, 0x04, 0x08, 0x10, 0x20},
\r
116 /* 0x5D */ {0x00, 0x41, 0x41, 0x7F, 0x00},
\r
117 /* 0x5E */ {0x04, 0x02, 0x01, 0x02, 0x04},
\r
118 /* 0x5F */ {0x40, 0x40, 0x40, 0x40, 0x40},
\r
119 /* 0x60 */ {0x00, 0x00, 0x07, 0x00, 0x00},
\r
120 /* 0x61 */ {0x20, 0x54, 0x54, 0x54, 0x78},
\r
121 /* 0x62 */ {0x7f, 0x48, 0x44, 0x44, 0x38},
\r
122 /* 0x63 */ {0x30, 0x48, 0x48, 0x48, 0x20},
\r
123 /* 0x64 */ {0x38, 0x44, 0x44, 0x48, 0x7f},
\r
124 /* 0x65 */ {0x38, 0x54, 0x54, 0x54, 0x18},
\r
125 /* 0x66 */ {0x08, 0x7e, 0x09, 0x09, 0x02},
\r
126 /* 0x67 */ {0x0c, 0x52, 0x52, 0x52, 0x3e},
\r
127 /* 0x68 */ {0x7f, 0x08, 0x04, 0x04, 0x78},
\r
128 /* 0x69 */ {0x00, 0x44, 0x7d, 0x40, 0x00},
\r
129 /* 0x6A */ {0x20, 0x40, 0x40, 0x3d, 0x00},
\r
130 /* 0x6B */ {0x7f, 0x10, 0x28, 0x44, 0x00},
\r
131 /* 0x6C */ {0x00, 0x41, 0x7f, 0x40, 0x00},
\r
132 /* 0x6D */ {0x7c, 0x04, 0x18, 0x04, 0x78},
\r
133 /* 0x6E */ {0x7c, 0x08, 0x04, 0x04, 0x78},
\r
134 /* 0x6F */ {0x38, 0x44, 0x44, 0x44, 0x38},
\r
135 /* 0x70 */ {(byte) 0xfc, 0x14, 0x14, 0x14, 0x08},
\r
136 /* 0x71 */ {0x08, 0x14, 0x14, 0x18, 0x7c},
\r
137 /* 0x72 */ {0x7c, 0x08, 0x04, 0x04, 0x08},
\r
138 /* 0x73 */ {0x48, 0x54, 0x54, 0x54, 0x20},
\r
139 /* 0x74 */ {0x04, 0x3f, 0x44, 0x40, 0x20},
\r
140 /* 0x75 */ {0x3c, 0x40, 0x40, 0x20, 0x7c},
\r
141 /* 0x76 */ {0x1c, 0x20, 0x40, 0x20, 0x1c},
\r
142 /* 0x77 */ {0x3c, 0x40, 0x38, 0x40, 0x3c},
\r
143 /* 0x78 */ {0x44, 0x28, 0x10, 0x28, 0x44},
\r
144 /* 0x79 */ {0x0c, 0x50, 0x50, 0x50, 0x3c},
\r
145 /* 0x7A */ {0x44, 0x64, 0x54, 0x4c, 0x44},
\r
146 /* 0x7B */ {0x00, 0x08, 0x36, 0x41, 0x00},
\r
147 /* 0x7C */ {0x00, 0x00, 0x7F, 0x00, 0x00},
\r
148 /* 0x7D */ {0x00, 0x41, 0x36, 0x08, 0x00},
\r
149 /* 0x7E */ {0x00, 0x07, 0x00, 0x07, 0x00},
\r
150 /* 0x7F */ {0x3E, 0x36, 0x2A, 0x36, 0x3E},
\r
153 private static int [] displayBuf = new int[200];
\r
155 public static void setPixel(int rgbColor, int x, int y) {
\r
156 if (x < 0 || x >= SCREEN_WIDTH || y < 0 || y >= SCREEN_HEIGHT) return; // Test-Modify for speed
\r
159 int index = yChar * 25 + xChar;
\r
160 int specificBit = (y % 8) + ((x % 4) * 8);
\r
161 displayBuf[index] = displayBuf[index] | (rgbColor << specificBit);
\r
164 public static void drawString(String str, int x, int y, boolean invert) {
\r
165 char [] strData = str.toCharArray();
\r
166 for (int i = 0; (i < strData.length) && (x < DISPLAY_CHAR_WIDTH)
\r
167 && (y < DISPLAY_CHAR_DEPTH); i++) {
\r
168 drawChar(strData[i], (x + i) * CELL_WIDTH, y, invert);
\r
172 public static void drawChar(char c, int x, int y, boolean invert) {
\r
173 for (int i = 0; i <= FONT_WIDTH; i++) {
\r
174 int xChar = (x + i) / 4;
\r
175 int index = y * 25 + xChar;
\r
177 if (i < FONT_WIDTH) {
\r
178 // Clear buffer before writing chars
\r
179 displayBuf[index] &= ~(0xFF << (((x + i) % 4) * 8));
\r
180 displayBuf[index] |= ((invert ? (font[c][i] ^0xFF) : font[c][i]) << (((x + i) % 4) * 8));
\r
181 } else if (invert) {
\r
182 displayBuf[index] &= ~(0xFF << (((x + i) % 4) * 8));
\r
183 displayBuf[index] |= (0xFF << (((x + i) % 4) * 8));
\r
188 public static void drawPixels(byte b, int x, int y, boolean invert) {
\r
189 int index = ((y / 8) * 25) + (x / 4);
\r
190 displayBuf[index] |= (((invert ? (b ^ 0xFF) : b) & 0xFF) << ((x % 4) * 8));
\r
193 public static void clearDisplay() {
\r
194 for (int i = 0; i < displayBuf.length; i++) {
\r
200 public static void setDisplay() {
\r
201 setDisplay(displayBuf);
\r
205 * Display a string on the LCD at specified x,y co-ordinate.
\r
207 public static native void drawString(String str, int x, int y);
\r
210 * Display an int on the LCD at specified x,y co-ordinate.
\r
212 public static native void drawInt(int i, int x, int y);
\r
215 * Display an in on the LCD at x,y with leading spaces to occupy at least the number
\r
216 * of characters specified by the places parameter.
\r
218 public static native void drawInt(int i, int places, int x, int y);
\r
221 * Update the display.
\r
223 public static native void refresh();
\r
226 * Clear the display.
\r
228 public static native void clear();
\r
231 * Write graphics from a Java buffer to the display.
\r
233 public static native void setDisplay(int[] buff);
\r