OSDN Git Service

400df901744b0f0750a2ac24380ff1d5c8293e32
[nxt-jsp/lejos_nxj.git] / nxtOSEK / lejos_nxj / src / java / classes / lejos / nxt / LCD.java
1 package lejos.nxt;\r
2 \r
3 /**\r
4  * \r
5  * @author Andre Nijholt\r
6  */\r
7 public class LCD {\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
11         \r
12         public static final int DISPLAY_WIDTH   = 100;\r
13         public static final int DISPLAY_DEPTH   = 8;    // 8 * 8 bits = 64 pixels\r
14         \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
18         \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
21 \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
151         };\r
152 \r
153         private static int [] displayBuf = new int[200];\r
154 \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
157                 int xChar = x / 4;\r
158                 int yChar = y / 8;\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
162         }\r
163 \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
169                 }\r
170         }\r
171 \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
176                         \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
184                         }\r
185                 }\r
186         }\r
187         \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
191         }\r
192 \r
193         public static void clearDisplay() {\r
194                 for (int i = 0; i < displayBuf.length; i++) {\r
195                         displayBuf[i] = 0;\r
196                 }\r
197                 clear();\r
198         }\r
199         \r
200         public static void setDisplay() {\r
201                 setDisplay(displayBuf);\r
202         }\r
203 \r
204         /**\r
205          * Display a string on the LCD at specified x,y co-ordinate.\r
206          */\r
207         public static native void drawString(String str, int x, int y);\r
208 \r
209         /**\r
210          * Display an int on the LCD at specified x,y co-ordinate.\r
211          */\r
212         public static native void drawInt(int i, int x, int y);\r
213 \r
214         /**\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
217          */\r
218         public static native void drawInt(int i, int places, int x, int y);\r
219 \r
220         /**\r
221          * Update the display.\r
222          */\r
223         public static native void refresh();\r
224           \r
225         /**\r
226          * Clear the display.\r
227          */\r
228         public static native void clear();\r
229           \r
230         /**\r
231          * Write graphics from a Java buffer to the display.\r
232          */\r
233         public static native void setDisplay(int[] buff);\r
234 }\r