components/u8g2/csrc/u8x8_d_st75256.c

changeset 0
88d965579617
equal deleted inserted replaced
-1:000000000000 0:88d965579617
1 /*
2
3 u8x8_d_st75256.c
4
5 Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
6
7 Copyright (c) 2017, olikraus@gmail.com
8 All rights reserved.
9
10 Redistribution and use in source and binary forms, with or without modification,
11 are permitted provided that the following conditions are met:
12
13 * Redistributions of source code must retain the above copyright notice, this list
14 of conditions and the following disclaimer.
15
16 * Redistributions in binary form must reproduce the above copyright notice, this
17 list of conditions and the following disclaimer in the documentation and/or other
18 materials provided with the distribution.
19
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
21 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
22 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
25 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
32 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
34 0x030 ext 00
35 0x031 ext 01
36 0x038 ext 10
37 0x039 ext 11
38
39 cad 011
40
41
42 code examples:
43 http://www.it610.com/article/2601023.htm
44
45 normal mode:
46 0x00c bit format
47 U8X8_CA( 0xbc, 0x00 ), data scan dir
48 U8X8_A( 0xa6 ),
49 y: 0 offset
50
51 flip mode:
52 0x008 bit format
53 U8X8_CA( 0xbc, 0x03 ), data scan dir
54 U8X8_A( 0xa6 ),
55 y: 5 offset
56
57
58 */
59
60
61 #include "u8x8.h"
62
63
64 /* not a real power down for the st75256... just a display off */
65 static const uint8_t u8x8_d_st75256_256x128_powersave0_seq[] = {
66 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
67 U8X8_C( 0x030 ), /* select 00 commands */
68 U8X8_C( 0x94 ), /* sleep out */
69 U8X8_DLY(10),
70 U8X8_C( 0xaf ), /* display on */
71 U8X8_END_TRANSFER(), /* disable chip */
72 U8X8_END() /* end of sequence */
73 };
74
75 static const uint8_t u8x8_d_st75256_256x128_powersave1_seq[] = {
76 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
77 U8X8_C( 0x030 ), /* select 00 commands */
78 U8X8_C( 0xae ), /* display off */
79 U8X8_C( 0x95 ), /* sleep in */
80 U8X8_END_TRANSFER(), /* disable chip */
81 U8X8_END() /* end of sequence */
82 };
83
84 static const uint8_t u8x8_d_st75256_jlx256128_flip0_seq[] = {
85 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
86 U8X8_C( 0x030 ), /* select 00 commands */
87 U8X8_CA( 0xbc, 0x00 ), /* data scan dir */
88 U8X8_A( 0xa6 ), /* ??? */
89
90 //U8X8_C( 0x030 ), /* select 00 commands */
91 U8X8_C( 0x00c ), /* data format LSB top */
92 U8X8_END_TRANSFER(), /* disable chip */
93 U8X8_END() /* end of sequence */
94 };
95
96 static const uint8_t u8x8_d_st75256_jlx256128_flip1_seq[] = {
97 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
98 U8X8_C( 0x030 ), /* select 00 commands */
99 U8X8_CA( 0xbc, 0x03 ), /* data scan dir */
100 U8X8_A( 0xa6 ), /* ??? */
101
102 //U8X8_C( 0x030 ), /* select 00 commands */
103 U8X8_C( 0x008 ), /* data format MSB top */
104 U8X8_END_TRANSFER(), /* disable chip */
105 U8X8_END() /* end of sequence */
106 };
107
108 static const uint8_t u8x8_d_st75256_jlx172104_flip0_seq[] = {
109 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
110 U8X8_C( 0x030 ), /* select 00 commands */
111 U8X8_CA( 0xbc, 0x02 ), /* data scan dir */
112 U8X8_A( 0xa6 ), /* ??? */
113
114 //U8X8_C( 0x030 ), /* select 00 commands */
115 U8X8_C( 0x00c ), /* data format LSB top */
116 U8X8_END_TRANSFER(), /* disable chip */
117 U8X8_END() /* end of sequence */
118 };
119
120 static const uint8_t u8x8_d_st75256_jlx172104_flip1_seq[] = {
121 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
122 U8X8_C( 0x030 ), /* select 00 commands */
123 U8X8_CA( 0xbc, 0x01 ), /* data scan dir */
124 U8X8_A( 0xa6 ), /* ??? */
125
126 //U8X8_C( 0x030 ), /* select 00 commands */
127 U8X8_C( 0x008 ), /* data format MSB top */
128 U8X8_END_TRANSFER(), /* disable chip */
129 U8X8_END() /* end of sequence */
130 };
131
132 static const uint8_t u8x8_d_st75256_jlx256160_flip0_seq[] = {
133 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
134 U8X8_C( 0x030 ), /* select 00 commands */
135 U8X8_CA( 0xbc, 0x00 ), /* data scan dir */
136 U8X8_A( 0xa6 ), /* ??? */
137
138 //U8X8_C( 0x030 ), /* select 00 commands */
139 U8X8_C( 0x00c ), /* data format LSB top */
140 U8X8_END_TRANSFER(), /* disable chip */
141 U8X8_END() /* end of sequence */
142 };
143
144 static const uint8_t u8x8_d_st75256_jlx256160_flip1_seq[] = {
145 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
146 U8X8_C( 0x030 ), /* select 00 commands */
147 U8X8_CA( 0xbc, 0x03 ), /* data scan dir */
148 U8X8_A( 0xa6 ), /* ??? */
149
150 //U8X8_C( 0x030 ), /* select 00 commands */
151 U8X8_C( 0x008 ), /* data format MSB top */
152 U8X8_END_TRANSFER(), /* disable chip */
153 U8X8_END() /* end of sequence */
154 };
155
156
157 static uint8_t u8x8_d_st75256_256x128_generic(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
158 {
159 uint8_t x, c;
160 uint8_t *ptr;
161 switch(msg)
162 {
163 /* handled by the calling function
164 case U8X8_MSG_DISPLAY_SETUP_MEMORY:
165 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_st75256_256x128_display_info);
166 break;
167 */
168 /* handled by the calling function
169 case U8X8_MSG_DISPLAY_INIT:
170 u8x8_d_helper_display_init(u8x8);
171 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_init_seq);
172 break;
173 */
174 case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
175 if ( arg_int == 0 )
176 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave0_seq);
177 else
178 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave1_seq);
179
180 break;
181 #ifdef U8X8_WITH_SET_CONTRAST
182 case U8X8_MSG_DISPLAY_SET_CONTRAST:
183
184 u8x8_cad_StartTransfer(u8x8);
185
186 u8x8_cad_SendCmd(u8x8, 0x030 );
187 u8x8_cad_SendCmd(u8x8, 0x081 ); /* there are 9 bit for the volume control */
188 u8x8_cad_SendArg(u8x8, (arg_int & 0x1f)<<1 ); /* lower 6 bit */
189 u8x8_cad_SendArg(u8x8, (arg_int>>5)); /* upper 3 bit */
190
191 u8x8_cad_EndTransfer(u8x8);
192 break;
193 #endif
194 case U8X8_MSG_DISPLAY_DRAW_TILE:
195
196 u8x8_cad_StartTransfer(u8x8);
197 x = ((u8x8_tile_t *)arg_ptr)->x_pos;
198 x *= 8;
199
200 u8x8_cad_SendCmd(u8x8, 0x030 ); /* select command set */
201 u8x8_cad_SendCmd(u8x8, 0x075 ); /* row */
202 u8x8_cad_SendArg(u8x8, u8x8->x_offset + (((u8x8_tile_t *)arg_ptr)->y_pos)); /* x offset is used as y offset */
203 u8x8_cad_SendArg(u8x8, 0x04f);
204 //u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
205 u8x8_cad_SendCmd(u8x8, 0x015 ); /* col */
206 u8x8_cad_SendArg(u8x8, x);
207 u8x8_cad_SendArg(u8x8, 255);
208 u8x8_cad_SendCmd(u8x8, 0x05c );
209
210 do
211 {
212 c = ((u8x8_tile_t *)arg_ptr)->cnt;
213 ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
214 /* SendData can not handle more than 255 bytes, treat c > 31 correctly */
215 if ( c > 31 )
216 {
217 u8x8_cad_SendData(u8x8, 248, ptr); /* 31*8=248 */
218 ptr+=248;
219 c -= 31;
220 }
221
222 u8x8_cad_SendData(u8x8, c*8, ptr);
223 arg_int--;
224 } while( arg_int > 0 );
225
226 u8x8_cad_EndTransfer(u8x8);
227 break;
228 default:
229 return 0;
230 }
231 return 1;
232 }
233
234 /*=============================================*/
235 /* JLX256128 */
236
237 static const u8x8_display_info_t u8x8_st75256_256x128_display_info =
238 {
239 /* chip_enable_level = */ 0,
240 /* chip_disable_level = */ 1,
241
242 /* post_chip_enable_wait_ns = */ 20,
243 /* pre_chip_disable_wait_ns = */ 20,
244 /* reset_pulse_width_ms = */ 5,
245 /* post_reset_wait_ms = */ 5, /**/
246 /* sda_setup_time_ns = */ 20, /* */
247 /* sck_pulse_width_ns = */ 40, /* */
248 /* sck_clock_hz = */ 4000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
249 /* spi_mode = */ 0, /* active high, rising edge */
250 /* i2c_bus_clock_100kHz = */ 4, /* 400KHz */
251 /* data_setup_time_ns = */ 15,
252 /* write_pulse_width_ns = */ 70,
253 /* tile_width = */ 32,
254 /* tile_hight = */ 16,
255 /* default_x_offset = */ 0, /* must be 0, because this is checked also for normal mode */
256 /* flipmode_x_offset = */ 5, /* used as y offset */
257 /* pixel_width = */ 256,
258 /* pixel_height = */ 128
259 };
260
261
262 static const uint8_t u8x8_d_st75256_256x128_init_seq[] = {
263 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
264
265 U8X8_DLY(20),
266
267 U8X8_C( 0x030 ), /* select 00 commands */
268 U8X8_C( 0x094 ), /* sleep out */
269
270 //U8X8_C( 0x030 ), /* select 00 commands */
271 U8X8_C( 0x0ae ), /* display off */
272
273 U8X8_C( 0x031 ), /* select 01 commands */
274 U8X8_CA( 0x0d7, 0x09f ), /* disable auto read */
275
276 //U8X8_C( 0x031 ), /* select 01 commands */
277 U8X8_C( 0x032 ), /* analog circuit set */
278 U8X8_A( 0x000 ), /* code example: OSC Frequency adjustment */
279 U8X8_A( 0x001 ), /* Frequency on booster capacitors 1 = 6KHz? */
280 U8X8_A( 0x000 ), /* Bias: 1: 1/13, 2: 1/12, 3: 1/11, 4:1/10, 5:1/9 */
281
282 //U8X8_C( 0x031 ), /* select 01 commands */
283 U8X8_C( 0x020 ), /* gray levels */
284 U8X8_A( 0x01 ),
285 U8X8_A( 0x03 ),
286 U8X8_A( 0x05 ),
287 U8X8_A( 0x07 ),
288 U8X8_A( 0x09),
289 U8X8_A( 0x0b ),
290 U8X8_A( 0x0d ),
291 U8X8_A( 0x10 ),
292 U8X8_A( 0x11 ),
293 U8X8_A( 0x13 ),
294 U8X8_A( 0x15 ),
295 U8X8_A( 0x17 ),
296 U8X8_A( 0x19 ),
297 U8X8_A( 0x1b ),
298 U8X8_A( 0x1d ),
299 U8X8_A( 0x1f ),
300
301
302 U8X8_C( 0x030 ), /* select 00 commands */
303 U8X8_CAA(0x75, 0, 0x4f), /* row range */
304 U8X8_CAA(0x15, 0, 255), /* col range */
305
306 //U8X8_C( 0x030 ), /* select 00 commands */
307 U8X8_CA( 0xbc, 0x00 ), /* data scan dir */
308 U8X8_A( 0xa6 ), /* ??? */
309
310 //U8X8_C( 0x030 ), /* select 00 commands */
311 U8X8_C( 0x00c ), /* data format LSB top */
312
313 //U8X8_C( 0x030 ), /* select 00 commands */
314 U8X8_C( 0xca ), /* display control, 3 args follow */
315 U8X8_A( 0x00 ), /* 0x00: no clock division, 0x04: devide clock */
316 U8X8_A( 0x7f ), /* 1/160 duty value from the DS example code */
317 U8X8_A( 0x20 ), /* nline off */
318
319 //U8X8_C( 0x030 ), /* select 00 commands */
320 U8X8_CA( 0x0f0, 0x010 ), /* monochrome mode = 0x010*/
321
322 //U8X8_C( 0x030 ), /* select 00 commands */
323 U8X8_CAA( 0x81, 0x36, 0x05 ), /* Volume control */
324
325 //U8X8_C( 0x030 ), /* select 00 commands */
326 U8X8_CA( 0x020, 0x00b ), /* Power control: Regulator, follower & booster on */
327 U8X8_DLY(100),
328
329 U8X8_END_TRANSFER(), /* disable chip */
330 U8X8_END() /* end of sequence */
331 };
332
333
334 uint8_t u8x8_d_st75256_jlx256128(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
335 {
336 if ( u8x8_d_st75256_256x128_generic(u8x8, msg, arg_int, arg_ptr) != 0 )
337 return 1;
338 if ( msg == U8X8_MSG_DISPLAY_SETUP_MEMORY )
339 {
340 //u8x8_SetI2CAddress(u8x8, 0x078); /* lowest I2C adr of the ST75256 */
341 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_st75256_256x128_display_info);
342 return 1;
343 }
344 else if ( msg == U8X8_MSG_DISPLAY_INIT )
345 {
346 u8x8_d_helper_display_init(u8x8);
347 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_init_seq);
348 return 1;
349 }
350 else if ( msg == U8X8_MSG_DISPLAY_SET_FLIP_MODE )
351 {
352 if ( arg_int == 0 )
353 {
354 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx256128_flip0_seq);
355 u8x8->x_offset = u8x8->display_info->default_x_offset;
356 }
357 else
358 {
359 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx256128_flip1_seq);
360 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
361 }
362 return 1;
363 }
364 return 0;
365 }
366
367
368
369 /*=============================================*/
370 /* WO256X128, https://github.com/olikraus/u8g2/issues/891 */
371
372 static const u8x8_display_info_t u8x8_st75256_wo256x128_display_info =
373 {
374 /* chip_enable_level = */ 0,
375 /* chip_disable_level = */ 1,
376
377 /* post_chip_enable_wait_ns = */ 20,
378 /* pre_chip_disable_wait_ns = */ 20,
379 /* reset_pulse_width_ms = */ 5,
380 /* post_reset_wait_ms = */ 5, /**/
381 /* sda_setup_time_ns = */ 20, /* */
382 /* sck_pulse_width_ns = */ 40, /* */
383 /* sck_clock_hz = */ 4000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
384 /* spi_mode = */ 0, /* active high, rising edge */
385 /* i2c_bus_clock_100kHz = */ 4, /* 400KHz */
386 /* data_setup_time_ns = */ 15,
387 /* write_pulse_width_ns = */ 70,
388 /* tile_width = */ 32,
389 /* tile_hight = */ 16,
390 /* default_x_offset = */ 5, /* must be 0, because this is checked also for normal mode */
391 /* flipmode_x_offset = */ 0, /* used as y offset */
392 /* pixel_width = */ 256,
393 /* pixel_height = */ 128
394 };
395
396
397 static const uint8_t u8x8_d_st75256_wo256x128_init_seq[] = {
398 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
399
400 U8X8_DLY(20),
401
402 U8X8_C( 0x030 ), /* select 00 commands */
403 U8X8_C( 0x094 ), /* sleep out */
404
405 //U8X8_C( 0x030 ), /* select 00 commands */
406 U8X8_C( 0x0ae ), /* display off */
407
408 U8X8_C( 0x031 ), /* select 01 commands */
409 U8X8_CA( 0x0d7, 0x09f ), /* disable auto read */
410
411 //U8X8_C( 0x031 ), /* select 01 commands */
412 U8X8_C( 0x032 ), /* analog circuit set */
413 U8X8_A( 0x000 ), /* code example: OSC Frequency adjustment */
414 U8X8_A( 0x001 ), /* Frequency on booster capacitors 1 = 6KHz? */
415 U8X8_A( 0x000 ), /* Bias: 1: 1/13, 2: 1/12, 3: 1/11, 4:1/10, 5:1/9 */
416
417 //U8X8_C( 0x031 ), /* select 01 commands */
418 U8X8_C( 0x020 ), /* gray levels */
419 U8X8_A( 0x01 ),
420 U8X8_A( 0x03 ),
421 U8X8_A( 0x05 ),
422 U8X8_A( 0x07 ),
423 U8X8_A( 0x09),
424 U8X8_A( 0x0b ),
425 U8X8_A( 0x0d ),
426 U8X8_A( 0x10 ),
427 U8X8_A( 0x11 ),
428 U8X8_A( 0x13 ),
429 U8X8_A( 0x15 ),
430 U8X8_A( 0x17 ),
431 U8X8_A( 0x19 ),
432 U8X8_A( 0x1b ),
433 U8X8_A( 0x1d ),
434 U8X8_A( 0x1f ),
435
436
437 U8X8_C( 0x030 ), /* select 00 commands */
438 U8X8_CAA(0x75, 0, 0x4f), /* row range */
439 U8X8_CAA(0x15, 0, 255), /* col range */
440
441 //U8X8_C( 0x030 ), /* select 00 commands */
442 U8X8_CA( 0xbc, 0x01 ), /* data scan dir */
443 U8X8_A( 0xa6 ), /* ??? */
444
445 //U8X8_C( 0x030 ), /* select 00 commands */
446 U8X8_C( 0x008 ), /* data format LSB top */
447
448 //U8X8_C( 0x030 ), /* select 00 commands */
449 U8X8_C( 0xca ), /* display control, 3 args follow */
450 U8X8_A( 0x00 ), /* 0x00: no clock division, 0x04: devide clock */
451 U8X8_A( 0x7f ), /* 1/160 duty value from the DS example code */
452 U8X8_A( 0x20 ), /* nline off */
453
454 //U8X8_C( 0x030 ), /* select 00 commands */
455 U8X8_CA( 0x0f0, 0x010 ), /* monochrome mode = 0x010*/
456
457 //U8X8_C( 0x030 ), /* select 00 commands */
458 U8X8_CAA( 0x81, 0x36, 0x05 ), /* Volume control */
459
460 //U8X8_C( 0x030 ), /* select 00 commands */
461 U8X8_CA( 0x020, 0x00b ), /* Power control: Regulator, follower & booster on */
462 U8X8_DLY(100),
463
464 U8X8_END_TRANSFER(), /* disable chip */
465 U8X8_END() /* end of sequence */
466 };
467
468
469 uint8_t u8x8_d_st75256_wo256x128(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
470 {
471 if ( u8x8_d_st75256_256x128_generic(u8x8, msg, arg_int, arg_ptr) != 0 )
472 return 1;
473 if ( msg == U8X8_MSG_DISPLAY_SETUP_MEMORY )
474 {
475 //u8x8_SetI2CAddress(u8x8, 0x078); /* lowest I2C adr of the ST75256 */
476 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_st75256_wo256x128_display_info);
477 return 1;
478 }
479 else if ( msg == U8X8_MSG_DISPLAY_INIT )
480 {
481 u8x8_d_helper_display_init(u8x8);
482 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_wo256x128_init_seq);
483 return 1;
484 }
485 else if ( msg == U8X8_MSG_DISPLAY_SET_FLIP_MODE )
486 {
487 if ( arg_int == 0 )
488 {
489 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip1_seq); // this matches the init sequence
490 u8x8->x_offset = u8x8->display_info->default_x_offset;
491 }
492 else
493 {
494 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip0_seq);
495 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
496 }
497 return 1;
498 }
499 return 0;
500 }
501
502
503 /*=============================================*/
504 /* JLX25664 */
505
506 static const u8x8_display_info_t u8x8_st75256_256x64_display_info =
507 {
508 /* chip_enable_level = */ 0,
509 /* chip_disable_level = */ 1,
510
511 /* post_chip_enable_wait_ns = */ 20,
512 /* pre_chip_disable_wait_ns = */ 20,
513 /* reset_pulse_width_ms = */ 5,
514 /* post_reset_wait_ms = */ 5, /**/
515 /* sda_setup_time_ns = */ 20, /* */
516 /* sck_pulse_width_ns = */ 40, /* */
517 /* sck_clock_hz = */ 4000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
518 /* spi_mode = */ 0, /* active high, rising edge */
519 /* i2c_bus_clock_100kHz = */ 4, /* 400KHz */
520 /* data_setup_time_ns = */ 15,
521 /* write_pulse_width_ns = */ 70,
522 /* tile_width = */ 32,
523 /* tile_hight = */ 8,
524 /* default_x_offset = */ 0, /* must be 0, because this is checked also for normal mode */
525 /* flipmode_x_offset = */ 13, /* used as y offset */
526 /* pixel_width = */ 256,
527 /* pixel_height = */ 64
528 };
529
530
531 static const uint8_t u8x8_d_st75256_256x64_init_seq[] = {
532 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
533
534 U8X8_DLY(20),
535
536 U8X8_C( 0x030 ), /* select 00 commands */
537 U8X8_C( 0x094 ), /* sleep out */
538
539 //U8X8_C( 0x030 ), /* select 00 commands */
540 U8X8_C( 0x0ae ), /* display off */
541
542 U8X8_C( 0x031 ), /* select 01 commands */
543 U8X8_CA( 0x0d7, 0x09f ), /* disable auto read */
544
545 //U8X8_C( 0x031 ), /* select 01 commands */
546 U8X8_C( 0x032 ), /* analog circuit set */
547 U8X8_A( 0x000 ), /* code example: OSC Frequency adjustment */
548 U8X8_A( 0x001 ), /* Frequency on booster capacitors 1 = 6KHz? */
549 U8X8_A( 0x005 ), /* Bias: 1: 1/13, 2: 1/12, 3: 1/11, 4:1/10, 5:1/9 */
550
551 //U8X8_C( 0x031 ), /* select 01 commands */
552 U8X8_C( 0x020 ), /* gray levels */
553 U8X8_A( 0x01 ),
554 U8X8_A( 0x03 ),
555 U8X8_A( 0x05 ),
556 U8X8_A( 0x07 ),
557 U8X8_A( 0x09),
558 U8X8_A( 0x0b ),
559 U8X8_A( 0x0d ),
560 U8X8_A( 0x10 ),
561 U8X8_A( 0x11 ),
562 U8X8_A( 0x13 ),
563 U8X8_A( 0x15 ),
564 U8X8_A( 0x17 ),
565 U8X8_A( 0x19 ),
566 U8X8_A( 0x1b ),
567 U8X8_A( 0x1d ),
568 U8X8_A( 0x1f ),
569
570
571 U8X8_C( 0x030 ), /* select 00 commands */
572 U8X8_CAA(0x75, 0, 0x1f), /* row range */
573 U8X8_CAA(0x15, 0, 255), /* col range */
574
575 //U8X8_C( 0x030 ), /* select 00 commands */
576 U8X8_CA( 0xbc, 0x00 ), /* data scan dir */
577 U8X8_A( 0xa6 ), /* ??? */
578
579 //U8X8_C( 0x030 ), /* select 00 commands */
580 U8X8_C( 0x00c ), /* data format LSB top */
581
582 //U8X8_C( 0x030 ), /* select 00 commands */
583 U8X8_C( 0xca ), /* display control, 3 args follow */
584 U8X8_A( 0x00 ), /* 0x00: no clock division, 0x04: devide clock */
585 U8X8_A( 0x3f ), /* 64 duty value from the DS example code */
586 U8X8_A( 0x20 ), /* nline off */
587
588 //U8X8_C( 0x030 ), /* select 00 commands */
589 U8X8_CA( 0x0f0, 0x010 ), /* monochrome mode = 0x010*/
590
591 //U8X8_C( 0x030 ), /* select 00 commands */
592 U8X8_CAA( 0x81, 012, 0x02 ), /* Volume control */
593
594 //U8X8_C( 0x030 ), /* select 00 commands */
595 U8X8_CA( 0x020, 0x00b ), /* Power control: Regulator, follower & booster on */
596 U8X8_DLY(100),
597
598 U8X8_END_TRANSFER(), /* disable chip */
599 U8X8_END() /* end of sequence */
600 };
601
602
603 uint8_t u8x8_d_st75256_jlx25664(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
604 {
605 if ( u8x8_d_st75256_256x128_generic(u8x8, msg, arg_int, arg_ptr) != 0 )
606 return 1;
607 if ( msg == U8X8_MSG_DISPLAY_SETUP_MEMORY )
608 {
609 //u8x8_SetI2CAddress(u8x8, 0x078); /* lowest I2C adr of the ST75256 */
610 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_st75256_256x64_display_info);
611 return 1;
612 }
613 else if ( msg == U8X8_MSG_DISPLAY_INIT )
614 {
615 u8x8_d_helper_display_init(u8x8);
616 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x64_init_seq);
617 return 1;
618 }
619 else if ( msg == U8X8_MSG_DISPLAY_SET_FLIP_MODE )
620 {
621 if ( arg_int == 0 )
622 {
623 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx256128_flip0_seq);
624 u8x8->x_offset = u8x8->display_info->default_x_offset;
625 }
626 else
627 {
628 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx256128_flip1_seq);
629 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
630 }
631 return 1;
632 }
633 return 0;
634 }
635
636
637 /*=============================================*/
638 /* JLX172104 LCD */
639
640 static const u8x8_display_info_t u8x8_st75256_172x104_display_info =
641 {
642 /* chip_enable_level = */ 0,
643 /* chip_disable_level = */ 1,
644
645 /* post_chip_enable_wait_ns = */ 20,
646 /* pre_chip_disable_wait_ns = */ 20,
647 /* reset_pulse_width_ms = */ 5,
648 /* post_reset_wait_ms = */ 5, /**/
649 /* sda_setup_time_ns = */ 20, /* */
650 /* sck_pulse_width_ns = */ 40, /* */
651 /* sck_clock_hz = */ 4000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
652 /* spi_mode = */ 0, /* active high, rising edge */
653 /* i2c_bus_clock_100kHz = */ 4, /* 400KHz */
654 /* data_setup_time_ns = */ 15,
655 /* write_pulse_width_ns = */ 70,
656 /* tile_width = */ 22, /* 22=176 */
657 /* tile_hight = */ 13,
658 /* default_x_offset = */ 84, /* */
659 /* flipmode_x_offset = */ 0,
660 /* pixel_width = */ 172,
661 /* pixel_height = */ 104
662 };
663
664 static const uint8_t u8x8_d_st75256_jlx172104_init_seq[] = {
665 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
666
667 U8X8_DLY(20),
668
669 U8X8_C( 0x030 ), /* select 00 commands */
670 U8X8_C( 0x094 ), /* sleep out */
671
672 //U8X8_C( 0x030 ), /* select 00 commands */
673 U8X8_C( 0x0ae ), /* display off */
674
675 U8X8_C( 0x031 ), /* select 01 commands */
676 U8X8_CA( 0x0d7, 0x09f ), /* disable auto read */
677
678 //U8X8_C( 0x031 ), /* select 01 commands */
679 U8X8_C( 0x032 ), /* analog circuit set */
680 U8X8_A( 0x000 ), /* code example: OSC Frequency adjustment */
681 U8X8_A( 0x001 ), /* Frequency on booster capacitors 1 = 6KHz? */
682 U8X8_A( 0x003 ), /* Bias: 1: 1/13, 2: 1/12, 3: 1/11, 4:1/10, 5:1/9 */
683
684 //U8X8_C( 0x031 ), /* select 01 commands */
685 U8X8_C( 0x020 ), /* gray levels */
686 U8X8_A( 0x01 ),
687 U8X8_A( 0x03 ),
688 U8X8_A( 0x05 ),
689 U8X8_A( 0x07 ),
690 U8X8_A( 0x09),
691 U8X8_A( 0x0b ),
692 U8X8_A( 0x0d ),
693 U8X8_A( 0x10 ),
694 U8X8_A( 0x11 ),
695 U8X8_A( 0x13 ),
696 U8X8_A( 0x15 ),
697 U8X8_A( 0x17 ),
698 U8X8_A( 0x19 ),
699 U8X8_A( 0x1b ),
700 U8X8_A( 0x1d ),
701 U8X8_A( 0x1f ),
702
703
704 U8X8_C( 0x030 ), /* select 00 commands */
705 U8X8_CAA(0x75, 0, 0x4f), /* row range */
706 U8X8_CAA(0x15, 0, 255), /* col range */
707
708 //U8X8_C( 0x030 ), /* select 00 commands */
709 U8X8_CA( 0xbc, 0x02 ), /* data scan dir */
710 U8X8_A( 0xa6 ), /* ??? */
711
712 //U8X8_C( 0x030 ), /* select 00 commands */
713 U8X8_C( 0x00c ), /* data format LSB top */
714
715 //U8X8_C( 0x030 ), /* select 00 commands */
716 U8X8_C( 0xca ), /* display control, 3 args follow */
717 U8X8_A( 0x00 ), /* 0x00: no clock division, 0x04: devide clock */
718 U8X8_A( 0x9f ), /* 1/160 duty value from the DS example code */
719 U8X8_A( 0x20 ), /* nline off */
720
721 //U8X8_C( 0x030 ), /* select 00 commands */
722 U8X8_CA( 0x0f0, 0x010 ), /* monochrome mode = 0x010*/
723
724 //U8X8_C( 0x030 ), /* select 00 commands */
725 U8X8_CAA( 0x81, 0x08, 0x04 ), /* Volume control */
726
727 //U8X8_C( 0x030 ), /* select 00 commands */
728 U8X8_CA( 0x020, 0x00b ), /* Power control: Regulator, follower & booster on */
729 U8X8_DLY(100),
730
731 U8X8_END_TRANSFER(), /* disable chip */
732 U8X8_END() /* end of sequence */
733 };
734
735
736 uint8_t u8x8_d_st75256_jlx172104(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
737 {
738 uint8_t x, c;
739 uint8_t *ptr;
740
741 switch(msg)
742 {
743 case U8X8_MSG_DISPLAY_DRAW_TILE:
744
745 u8x8_cad_StartTransfer(u8x8);
746 x = ((u8x8_tile_t *)arg_ptr)->x_pos;
747 x *= 8;
748
749 u8x8_cad_SendCmd(u8x8, 0x030 ); /* select command set */
750 u8x8_cad_SendCmd(u8x8, 0x075 ); /* row */
751 if ( u8x8->x_offset == 0 ) /* 0 means flip mode 1, then adjust y value */
752 u8x8_cad_SendArg(u8x8, 8+(((u8x8_tile_t *)arg_ptr)->y_pos));
753 else
754 u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
755 u8x8_cad_SendArg(u8x8, 0x04f);
756 //u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
757 u8x8_cad_SendCmd(u8x8, 0x015 ); /* col */
758 u8x8_cad_SendArg(u8x8, x+u8x8->x_offset);
759 u8x8_cad_SendArg(u8x8, 255);
760 u8x8_cad_SendCmd(u8x8, 0x05c );
761
762
763 /* this procedure assumes, that the overall width is 172 */
764 do
765 {
766 c = ((u8x8_tile_t *)arg_ptr)->cnt;
767 ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
768 c *= 8;
769
770 if ( c + x > 172u )
771 {
772 c = 172u;
773 c -= x;
774 }
775
776 u8x8_cad_SendData(u8x8, c, ptr);
777 x += c;
778 arg_int--;
779 } while( arg_int > 0 );
780
781 u8x8_cad_EndTransfer(u8x8);
782 return 1;
783 case U8X8_MSG_DISPLAY_SETUP_MEMORY:
784 //u8x8_SetI2CAddress(u8x8, 0x078); /* lowest I2C adr of the ST75256 */
785 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_st75256_172x104_display_info);
786 return 1;
787 case U8X8_MSG_DISPLAY_INIT:
788 u8x8_d_helper_display_init(u8x8);
789 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_init_seq);
790 return 1;
791 case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
792 if ( arg_int == 0 )
793 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave0_seq);
794 else
795 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave1_seq);
796
797 return 1;
798 case U8X8_MSG_DISPLAY_SET_FLIP_MODE:
799 if ( arg_int == 0 )
800 {
801 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip0_seq);
802 u8x8->x_offset = u8x8->display_info->default_x_offset;
803 }
804 else
805 {
806 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip1_seq);
807 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
808 }
809 return 1;
810
811 #ifdef U8X8_WITH_SET_CONTRAST
812 case U8X8_MSG_DISPLAY_SET_CONTRAST:
813
814 u8x8_cad_StartTransfer(u8x8);
815
816 u8x8_cad_SendCmd(u8x8, 0x030 );
817 u8x8_cad_SendCmd(u8x8, 0x081 ); /* there are 9 bit for the volume control */
818 u8x8_cad_SendArg(u8x8, (arg_int & 0x1f)<<1 ); /* lower 6 bit */
819 u8x8_cad_SendArg(u8x8, (arg_int>>5)); /* upper 3 bit */
820
821 u8x8_cad_EndTransfer(u8x8);
822 return 1;
823 #endif
824 }
825 return 0;
826 }
827
828 /*=============================================*/
829 /* JLX240160 */
830
831 static const u8x8_display_info_t u8x8_st75256_240x160_display_info =
832 {
833 /* chip_enable_level = */ 0,
834 /* chip_disable_level = */ 1,
835
836 /* post_chip_enable_wait_ns = */ 20,
837 /* pre_chip_disable_wait_ns = */ 20,
838 /* reset_pulse_width_ms = */ 5,
839 /* post_reset_wait_ms = */ 5, /**/
840 /* sda_setup_time_ns = */ 20, /* */
841 /* sck_pulse_width_ns = */ 40, /* */
842 /* sck_clock_hz = */ 4000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
843 /* spi_mode = */ 0, /* active high, rising edge */
844 /* i2c_bus_clock_100kHz = */ 4, /* 400KHz */
845 /* data_setup_time_ns = */ 15,
846 /* write_pulse_width_ns = */ 70,
847 /* tile_width = */ 30,
848 /* tile_hight = */ 20,
849 /* default_x_offset = */ 16, /* x offset in flipmode 0 */
850 /* flipmode_x_offset = */ 0, /* */
851 /* pixel_width = */ 240,
852 /* pixel_height = */ 160
853 };
854
855
856 static const uint8_t u8x8_d_st75256_240x160_init_seq[] = {
857 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
858
859 U8X8_DLY(20),
860
861 U8X8_C( 0x030 ), /* select 00 commands */
862 U8X8_C( 0x094 ), /* sleep out */
863
864 //U8X8_C( 0x030 ), /* select 00 commands */
865 U8X8_C( 0x0ae ), /* display off */
866
867 U8X8_C( 0x031 ), /* select 01 commands */
868 U8X8_CA( 0x0d7, 0x09f ), /* disable auto read */
869
870 //U8X8_C( 0x031 ), /* select 01 commands */
871 U8X8_C( 0x032 ), /* analog circuit set */
872 U8X8_A( 0x000 ), /* code example: OSC Frequency adjustment */
873 U8X8_A( 0x001 ), /* Frequency on booster capacitors 1 = 6KHz? */
874 U8X8_A( 0x000 ), /* Bias: 1: 1/13, 2: 1/12, 3: 1/11, 4:1/10, 5:1/9 */
875
876 //U8X8_C( 0x031 ), /* select 01 commands */
877 U8X8_C( 0x020 ), /* gray levels */
878 U8X8_A( 0x01 ),
879 U8X8_A( 0x03 ),
880 U8X8_A( 0x05 ),
881 U8X8_A( 0x07 ),
882 U8X8_A( 0x09),
883 U8X8_A( 0x0b ),
884 U8X8_A( 0x0d ),
885 U8X8_A( 0x10 ),
886 U8X8_A( 0x11 ),
887 U8X8_A( 0x13 ),
888 U8X8_A( 0x15 ),
889 U8X8_A( 0x17 ),
890 U8X8_A( 0x19 ),
891 U8X8_A( 0x1b ),
892 U8X8_A( 0x1d ),
893 U8X8_A( 0x1f ),
894
895
896 U8X8_C( 0x030 ), /* select 00 commands */
897 U8X8_CAA(0x75, 0, 0x4f), /* row range */
898 U8X8_CAA(0x15, 0, 239), /* col range */
899
900 //U8X8_C( 0x030 ), /* select 00 commands */
901 U8X8_CA( 0xbc, 0x02 ), /* data scan dir */
902 U8X8_A( 0xa6 ), /* ??? */
903
904 //U8X8_C( 0x030 ), /* select 00 commands */
905 U8X8_C( 0x00c ), /* data format LSB top */
906
907 //U8X8_C( 0x030 ), /* select 00 commands */
908 U8X8_C( 0xca ), /* display control, 3 args follow */
909 U8X8_A( 0x00 ), /* 0x00: no clock division, 0x04: devide clock */
910 U8X8_A( 159 ), /* 1/160 duty value from the DS example code */
911 U8X8_A( 0x20 ), /* nline off */
912
913 //U8X8_C( 0x030 ), /* select 00 commands */
914 U8X8_CA( 0x0f0, 0x010 ), /* monochrome mode = 0x010*/
915
916 //U8X8_C( 0x030 ), /* select 00 commands */
917 U8X8_CAA( 0x81, 0x18, 0x04 ), /* Volume control */
918
919 //U8X8_C( 0x030 ), /* select 00 commands */
920 U8X8_CA( 0x020, 0x00b ), /* Power control: Regulator, follower & booster on */
921 U8X8_DLY(100),
922
923 U8X8_END_TRANSFER(), /* disable chip */
924 U8X8_END() /* end of sequence */
925 };
926
927
928 uint8_t u8x8_d_st75256_jlx240160(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
929 {
930 uint8_t x, c;
931 uint8_t *ptr;
932
933 switch(msg)
934 {
935 case U8X8_MSG_DISPLAY_DRAW_TILE:
936
937 u8x8_cad_StartTransfer(u8x8);
938 x = ((u8x8_tile_t *)arg_ptr)->x_pos;
939 x *= 8;
940
941 u8x8_cad_SendCmd(u8x8, 0x030 ); /* select command set */
942 u8x8_cad_SendCmd(u8x8, 0x075 ); /* row */
943 if ( u8x8->x_offset == 0 ) /* 0 means flip mode 1 */
944 u8x8_cad_SendArg(u8x8, 1+(((u8x8_tile_t *)arg_ptr)->y_pos));
945 else
946 u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
947 u8x8_cad_SendArg(u8x8, 0x04f);
948 //u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
949 u8x8_cad_SendCmd(u8x8, 0x015 ); /* col */
950 u8x8_cad_SendArg(u8x8, x+u8x8->x_offset);
951 u8x8_cad_SendArg(u8x8, 255);
952 u8x8_cad_SendCmd(u8x8, 0x05c );
953
954
955 do
956 {
957 c = ((u8x8_tile_t *)arg_ptr)->cnt;
958 ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
959 c *= 8;
960
961 if ( c + x > 240u )
962 {
963 c = 240u;
964 c -= x;
965 }
966
967 u8x8_cad_SendData(u8x8, c, ptr);
968 x += c;
969 arg_int--;
970 } while( arg_int > 0 );
971
972 u8x8_cad_EndTransfer(u8x8);
973 return 1;
974 case U8X8_MSG_DISPLAY_SETUP_MEMORY:
975 //u8x8_SetI2CAddress(u8x8, 0x078); /* lowest I2C adr of the ST75256 */
976 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_st75256_240x160_display_info);
977 return 1;
978 case U8X8_MSG_DISPLAY_INIT:
979 u8x8_d_helper_display_init(u8x8);
980 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_240x160_init_seq);
981 return 1;
982 case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
983 if ( arg_int == 0 )
984 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave0_seq);
985 else
986 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave1_seq);
987
988 return 1;
989 case U8X8_MSG_DISPLAY_SET_FLIP_MODE:
990 if ( arg_int == 0 )
991 {
992 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip0_seq);
993 u8x8->x_offset = u8x8->display_info->default_x_offset;
994 }
995 else
996 {
997 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip1_seq);
998 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
999 }
1000 return 1;
1001
1002 #ifdef U8X8_WITH_SET_CONTRAST
1003 case U8X8_MSG_DISPLAY_SET_CONTRAST:
1004
1005 u8x8_cad_StartTransfer(u8x8);
1006
1007 u8x8_cad_SendCmd(u8x8, 0x030 );
1008 u8x8_cad_SendCmd(u8x8, 0x081 ); /* there are 9 bit for the volume control */
1009 u8x8_cad_SendArg(u8x8, (arg_int & 0x1f)<<1 ); /* lower 6 bit */
1010 u8x8_cad_SendArg(u8x8, (arg_int>>5)); /* upper 3 bit */
1011
1012 u8x8_cad_EndTransfer(u8x8);
1013 return 1;
1014 #endif
1015 }
1016 return 0;
1017
1018
1019
1020 }
1021
1022
1023 /*=============================================*/
1024 /* JLX256160 */
1025
1026 static const u8x8_display_info_t u8x8_st75256_256x160_display_info =
1027 {
1028 /* chip_enable_level = */ 0,
1029 /* chip_disable_level = */ 1,
1030
1031 /* post_chip_enable_wait_ns = */ 20,
1032 /* pre_chip_disable_wait_ns = */ 20,
1033 /* reset_pulse_width_ms = */ 5,
1034 /* post_reset_wait_ms = */ 5, /**/
1035 /* sda_setup_time_ns = */ 20, /* */
1036 /* sck_pulse_width_ns = */ 40, /* */
1037 /* sck_clock_hz = */ 4000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
1038 /* spi_mode = */ 0, /* active high, rising edge */
1039 /* i2c_bus_clock_100kHz = */ 4, /* 400KHz */
1040 /* data_setup_time_ns = */ 15,
1041 /* write_pulse_width_ns = */ 70,
1042 /* tile_width = */ 32,
1043 /* tile_hight = */ 20,
1044 /* default_x_offset = */ 0,
1045 /* flipmode_x_offset = */ 1, /* x offset is used as y offset in flipmode */
1046 /* pixel_width = */ 256,
1047 /* pixel_height = */ 160
1048 };
1049
1050
1051 static const uint8_t u8x8_d_st75256_256x160_init_seq[] = {
1052 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
1053
1054 U8X8_DLY(20),
1055
1056 U8X8_C( 0x030 ), /* select 00 commands */
1057 U8X8_C( 0x094 ), /* sleep out */
1058
1059 //U8X8_C( 0x030 ), /* select 00 commands */
1060 U8X8_C( 0x0ae ), /* display off */
1061
1062 U8X8_C( 0x031 ), /* select 01 commands */
1063 U8X8_CA( 0x0d7, 0x09f ), /* disable auto read */
1064
1065 //U8X8_C( 0x031 ), /* select 01 commands */
1066 U8X8_C( 0x032 ), /* analog circuit set */
1067 U8X8_A( 0x000 ), /* code example: OSC Frequency adjustment */
1068 U8X8_A( 0x001 ), /* Frequency on booster capacitors 1 = 6KHz? */
1069 U8X8_A( 0x000 ), /* Bias: 1: 1/13, 2: 1/12, 3: 1/11, 4:1/10, 5:1/9 */
1070
1071 //U8X8_C( 0x031 ), /* select 01 commands */
1072 U8X8_C( 0x020 ), /* gray levels */
1073 U8X8_A( 0x01 ),
1074 U8X8_A( 0x03 ),
1075 U8X8_A( 0x05 ),
1076 U8X8_A( 0x07 ),
1077 U8X8_A( 0x09),
1078 U8X8_A( 0x0b ),
1079 U8X8_A( 0x0d ),
1080 U8X8_A( 0x10 ),
1081 U8X8_A( 0x11 ),
1082 U8X8_A( 0x13 ),
1083 U8X8_A( 0x15 ),
1084 U8X8_A( 0x17 ),
1085 U8X8_A( 0x19 ),
1086 U8X8_A( 0x1b ),
1087 U8X8_A( 0x1d ),
1088 U8X8_A( 0x1f ),
1089
1090
1091 U8X8_C( 0x030 ), /* select 00 commands */
1092 U8X8_CAA(0x75, 0, 0x28), /* row range */
1093 U8X8_CAA(0x15, 0, 0xFF), /* col range */
1094
1095 //U8X8_C( 0x030 ), /* select 00 commands */
1096 U8X8_CA( 0xbc, 0x00 ), /* data scan dir */
1097 U8X8_A( 0xa6 ), /* ??? */
1098
1099 //U8X8_C( 0x030 ), /* select 00 commands */
1100 U8X8_C( 0x00c ), /* data format LSB top */
1101
1102 //U8X8_C( 0x030 ), /* select 00 commands */
1103 U8X8_C( 0xca ), /* display control, 3 args follow */
1104 U8X8_A( 0x00 ), /* 0x00: no clock division, 0x04: devide clock */
1105 U8X8_A( 159 ), /* 1/160 duty value from the DS example code */
1106 U8X8_A( 0x20 ), /* nline off */
1107
1108 //U8X8_C( 0x030 ), /* select 00 commands */
1109 U8X8_CA( 0x0f0, 0x010 ), /* monochrome mode = 0x010*/
1110
1111 //U8X8_C( 0x030 ), /* select 00 commands */
1112 U8X8_CAA( 0x81, 0x18, 0x05 ), /* Volume control */
1113
1114 //U8X8_C( 0x030 ), /* select 00 commands */
1115 U8X8_CA( 0x020, 0x00b ), /* Power control: Regulator, follower & booster on */
1116 U8X8_DLY(100),
1117
1118 U8X8_END_TRANSFER(), /* disable chip */
1119 U8X8_END() /* end of sequence */
1120 };
1121
1122
1123 uint8_t u8x8_d_st75256_jlx256160(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
1124 {
1125 uint8_t x, c;
1126 uint8_t *ptr;
1127
1128 switch(msg)
1129 {
1130 case U8X8_MSG_DISPLAY_DRAW_TILE:
1131
1132 u8x8_cad_StartTransfer(u8x8);
1133 x = ((u8x8_tile_t *)arg_ptr)->x_pos;
1134 x *= 8;
1135
1136 u8x8_cad_SendCmd(u8x8, 0x030 ); /* select command set */
1137 u8x8_cad_SendCmd(u8x8, 0x075 ); /* row */
1138 if ( u8x8->x_offset == 1 ) /* 1 means flip mode 1 */
1139 u8x8_cad_SendArg(u8x8, 1+(((u8x8_tile_t *)arg_ptr)->y_pos));
1140 else
1141 u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
1142 u8x8_cad_SendArg(u8x8, 0x04f);
1143 //u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
1144 u8x8_cad_SendCmd(u8x8, 0x015 ); /* col */
1145 u8x8_cad_SendArg(u8x8, x+u8x8->display_info->default_x_offset);
1146 u8x8_cad_SendArg(u8x8, 255);
1147 u8x8_cad_SendCmd(u8x8, 0x05c );
1148
1149
1150 do
1151 {
1152 c = ((u8x8_tile_t *)arg_ptr)->cnt;
1153 ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
1154 /* SendData can not handle more than 255 bytes, treat c > 31 correctly */
1155 if ( c > 31 )
1156 {
1157 u8x8_cad_SendData(u8x8, 248, ptr); /* 31*8=248 */
1158 ptr+=248;
1159 c -= 31;
1160 }
1161
1162 u8x8_cad_SendData(u8x8, c*8, ptr);
1163 arg_int--;
1164 } while( arg_int > 0 );
1165
1166 u8x8_cad_EndTransfer(u8x8);
1167 return 1;
1168 case U8X8_MSG_DISPLAY_SETUP_MEMORY:
1169 //u8x8_SetI2CAddress(u8x8, 0x078); /* lowest I2C adr of the ST75256 */
1170 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_st75256_256x160_display_info);
1171 return 1;
1172 case U8X8_MSG_DISPLAY_INIT:
1173 u8x8_d_helper_display_init(u8x8);
1174 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x160_init_seq);
1175 return 1;
1176 case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
1177 if ( arg_int == 0 )
1178 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave0_seq);
1179 else
1180 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave1_seq);
1181
1182 return 1;
1183 case U8X8_MSG_DISPLAY_SET_FLIP_MODE:
1184 if ( arg_int == 0 )
1185 {
1186 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx256160_flip0_seq);
1187 u8x8->x_offset = u8x8->display_info->default_x_offset;
1188 }
1189 else
1190 {
1191 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx256160_flip1_seq);
1192 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
1193 }
1194 return 1;
1195
1196 #ifdef U8X8_WITH_SET_CONTRAST
1197 case U8X8_MSG_DISPLAY_SET_CONTRAST:
1198
1199 u8x8_cad_StartTransfer(u8x8);
1200
1201 u8x8_cad_SendCmd(u8x8, 0x030 );
1202 u8x8_cad_SendCmd(u8x8, 0x081 ); /* there are 9 bit for the volume control */
1203 u8x8_cad_SendArg(u8x8, (arg_int & 0x1f)<<1 ); /* lower 6 bit */
1204 u8x8_cad_SendArg(u8x8, (arg_int>>5)); /* upper 3 bit */
1205
1206 u8x8_cad_EndTransfer(u8x8);
1207 return 1;
1208 #endif
1209 }
1210 return 0;
1211 }
1212
1213
1214 /*=============================================*/
1215 /* JLX256160 mirror version #930 */
1216
1217
1218 static const uint8_t u8x8_d_st75256_256x160m_init_seq[] = {
1219 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
1220
1221 U8X8_DLY(20),
1222
1223 U8X8_C( 0x030 ), /* select 00 commands */
1224 U8X8_C( 0x094 ), /* sleep out */
1225
1226 //U8X8_C( 0x030 ), /* select 00 commands */
1227 U8X8_C( 0x0ae ), /* display off */
1228
1229 U8X8_C( 0x031 ), /* select 01 commands */
1230 U8X8_CA( 0x0d7, 0x09f ), /* disable auto read */
1231
1232 //U8X8_C( 0x031 ), /* select 01 commands */
1233 U8X8_C( 0x032 ), /* analog circuit set */
1234 U8X8_A( 0x000 ), /* code example: OSC Frequency adjustment */
1235 U8X8_A( 0x001 ), /* Frequency on booster capacitors 1 = 6KHz? */
1236 U8X8_A( 0x000 ), /* Bias: 1: 1/13, 2: 1/12, 3: 1/11, 4:1/10, 5:1/9 */
1237
1238 //U8X8_C( 0x031 ), /* select 01 commands */
1239 U8X8_C( 0x020 ), /* gray levels */
1240 U8X8_A( 0x01 ),
1241 U8X8_A( 0x03 ),
1242 U8X8_A( 0x05 ),
1243 U8X8_A( 0x07 ),
1244 U8X8_A( 0x09),
1245 U8X8_A( 0x0b ),
1246 U8X8_A( 0x0d ),
1247 U8X8_A( 0x10 ),
1248 U8X8_A( 0x11 ),
1249 U8X8_A( 0x13 ),
1250 U8X8_A( 0x15 ),
1251 U8X8_A( 0x17 ),
1252 U8X8_A( 0x19 ),
1253 U8X8_A( 0x1b ),
1254 U8X8_A( 0x1d ),
1255 U8X8_A( 0x1f ),
1256
1257
1258 U8X8_C( 0x030 ), /* select 00 commands */
1259 U8X8_CAA(0x75, 0, 0x28), /* row range */
1260 U8X8_CAA(0x15, 0, 0xFF), /* col range */
1261
1262 //U8X8_C( 0x030 ), /* select 00 commands */
1263 U8X8_CA( 0xbc, 0x02 ), /* data scan dir ( CHANGED FOR MIRROR VERSION ) */
1264 U8X8_A( 0xa6 ), /* ??? */
1265
1266 //U8X8_C( 0x030 ), /* select 00 commands */
1267 U8X8_C( 0x00c ), /* data format LSB top */
1268
1269 //U8X8_C( 0x030 ), /* select 00 commands */
1270 U8X8_C( 0xca ), /* display control, 3 args follow */
1271 U8X8_A( 0x00 ), /* 0x00: no clock division, 0x04: devide clock */
1272 U8X8_A( 159 ), /* 1/160 duty value from the DS example code */
1273 U8X8_A( 0x20 ), /* nline off */
1274
1275 //U8X8_C( 0x030 ), /* select 00 commands */
1276 U8X8_CA( 0x0f0, 0x010 ), /* monochrome mode = 0x010*/
1277
1278 //U8X8_C( 0x030 ), /* select 00 commands */
1279 U8X8_CAA( 0x81, 0x18, 0x05 ), /* Volume control */
1280
1281 //U8X8_C( 0x030 ), /* select 00 commands */
1282 U8X8_CA( 0x020, 0x00b ), /* Power control: Regulator, follower & booster on */
1283 U8X8_DLY(100),
1284
1285 U8X8_END_TRANSFER(), /* disable chip */
1286 U8X8_END() /* end of sequence */
1287 };
1288
1289 uint8_t u8x8_d_st75256_jlx256160m(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
1290 {
1291 uint8_t x, c;
1292 uint8_t *ptr;
1293
1294 switch(msg)
1295 {
1296 case U8X8_MSG_DISPLAY_DRAW_TILE:
1297
1298 u8x8_cad_StartTransfer(u8x8);
1299 x = ((u8x8_tile_t *)arg_ptr)->x_pos;
1300 x *= 8;
1301
1302 u8x8_cad_SendCmd(u8x8, 0x030 ); /* select command set */
1303 u8x8_cad_SendCmd(u8x8, 0x075 ); /* row */
1304 if ( u8x8->x_offset == 1 ) /* 1 means flip mode 1 */
1305 u8x8_cad_SendArg(u8x8, 1+(((u8x8_tile_t *)arg_ptr)->y_pos));
1306 else
1307 u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
1308 u8x8_cad_SendArg(u8x8, 0x04f);
1309 //u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
1310 u8x8_cad_SendCmd(u8x8, 0x015 ); /* col */
1311 u8x8_cad_SendArg(u8x8, x+u8x8->display_info->default_x_offset);
1312 u8x8_cad_SendArg(u8x8, 255);
1313 u8x8_cad_SendCmd(u8x8, 0x05c );
1314
1315
1316 do
1317 {
1318 c = ((u8x8_tile_t *)arg_ptr)->cnt;
1319 ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
1320 /* SendData can not handle more than 255 bytes, treat c > 31 correctly */
1321 if ( c > 31 )
1322 {
1323 u8x8_cad_SendData(u8x8, 248, ptr); /* 31*8=248 */
1324 ptr+=248;
1325 c -= 31;
1326 }
1327
1328 u8x8_cad_SendData(u8x8, c*8, ptr);
1329 arg_int--;
1330 } while( arg_int > 0 );
1331
1332 u8x8_cad_EndTransfer(u8x8);
1333 return 1;
1334 case U8X8_MSG_DISPLAY_SETUP_MEMORY:
1335 //u8x8_SetI2CAddress(u8x8, 0x078); /* lowest I2C adr of the ST75256 */
1336 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_st75256_256x160_display_info);
1337 return 1;
1338 case U8X8_MSG_DISPLAY_INIT:
1339 u8x8_d_helper_display_init(u8x8);
1340 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x160m_init_seq);
1341 return 1;
1342 case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
1343 if ( arg_int == 0 )
1344 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave0_seq);
1345 else
1346 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave1_seq);
1347
1348 return 1;
1349 case U8X8_MSG_DISPLAY_SET_FLIP_MODE:
1350 if ( arg_int == 0 )
1351 {
1352 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip0_seq);
1353 u8x8->x_offset = u8x8->display_info->default_x_offset;
1354 }
1355 else
1356 {
1357 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip1_seq);
1358 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
1359 }
1360 return 1;
1361
1362 #ifdef U8X8_WITH_SET_CONTRAST
1363 case U8X8_MSG_DISPLAY_SET_CONTRAST:
1364
1365 u8x8_cad_StartTransfer(u8x8);
1366
1367 u8x8_cad_SendCmd(u8x8, 0x030 );
1368 u8x8_cad_SendCmd(u8x8, 0x081 ); /* there are 9 bit for the volume control */
1369 u8x8_cad_SendArg(u8x8, (arg_int & 0x1f)<<1 ); /* lower 6 bit */
1370 u8x8_cad_SendArg(u8x8, (arg_int>>5)); /* upper 3 bit */
1371
1372 u8x8_cad_EndTransfer(u8x8);
1373 return 1;
1374 #endif
1375 }
1376 return 0;
1377 }
1378
1379
1380
1381
1382 /*=============================================*/
1383 /* JLX256160 alternative version from issue #561 */
1384
1385 static const u8x8_display_info_t u8x8_st75256_256x160_alt_display_info =
1386 {
1387 /* chip_enable_level = */ 0,
1388 /* chip_disable_level = */ 1,
1389
1390 /* post_chip_enable_wait_ns = */ 20,
1391 /* pre_chip_disable_wait_ns = */ 20,
1392 /* reset_pulse_width_ms = */ 5,
1393 /* post_reset_wait_ms = */ 5, /**/
1394 /* sda_setup_time_ns = */ 20, /* */
1395 /* sck_pulse_width_ns = */ 40, /* */
1396 /* sck_clock_hz = */ 4000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
1397 /* spi_mode = */ 0, /* active high, rising edge */
1398 /* i2c_bus_clock_100kHz = */ 4, /* 400KHz */
1399 /* data_setup_time_ns = */ 15,
1400 /* write_pulse_width_ns = */ 70,
1401 /* tile_width = */ 32,
1402 /* tile_hight = */ 20,
1403 /* default_x_offset = */ 0, /* x offset in flipmode 0 */
1404 /* flipmode_x_offset = */ 0, /* */
1405 /* pixel_width = */ 256,
1406 /* pixel_height = */ 160
1407 };
1408
1409
1410 static const uint8_t u8x8_d_st75256_256x160_alt_init_seq[] = {
1411 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
1412
1413 U8X8_DLY(20),
1414
1415 U8X8_C( 0x030 ), /* select 00 commands */
1416 U8X8_C( 0x094 ), /* sleep out */
1417
1418 //U8X8_C( 0x030 ), /* select 00 commands */
1419 U8X8_C( 0x0ae ), /* display off */
1420
1421 U8X8_C( 0x031 ), /* select 01 commands */
1422 U8X8_CA( 0x0d7, 0x09f ), /* disable auto read */
1423
1424 //U8X8_C( 0x031 ), /* select 01 commands */
1425 U8X8_C( 0x032 ), /* analog circuit set */
1426 U8X8_A( 0x000 ), /* code example: OSC Frequency adjustment */
1427 U8X8_A( 0x001 ), /* Frequency on booster capacitors 1 = 6KHz? */
1428 U8X8_A( 0x000 ), /* Bias: 1: 1/13, 2: 1/12, 3: 1/11, 4:1/10, 5:1/9 */
1429
1430 //U8X8_C( 0x031 ), /* select 01 commands */
1431 U8X8_C( 0x020 ), /* gray levels */
1432 U8X8_A( 0x01 ),
1433 U8X8_A( 0x03 ),
1434 U8X8_A( 0x05 ),
1435 U8X8_A( 0x07 ),
1436 U8X8_A( 0x09),
1437 U8X8_A( 0x0b ),
1438 U8X8_A( 0x0d ),
1439 U8X8_A( 0x10 ),
1440 U8X8_A( 0x11 ),
1441 U8X8_A( 0x13 ),
1442 U8X8_A( 0x15 ),
1443 U8X8_A( 0x17 ),
1444 U8X8_A( 0x19 ),
1445 U8X8_A( 0x1b ),
1446 U8X8_A( 0x1d ),
1447 U8X8_A( 0x1f ),
1448
1449
1450 U8X8_C( 0x030 ), /* select 00 commands */
1451 U8X8_CAA(0x75, 0, 0x4f), /* row range */
1452 U8X8_CAA(0x15, 0, 255), /* col range */
1453
1454 //U8X8_C( 0x030 ), /* select 00 commands */
1455 U8X8_CA( 0xbc, 0x02 ), /* data scan dir */
1456 U8X8_A( 0xa6 ), /* ??? */
1457
1458 //U8X8_C( 0x030 ), /* select 00 commands */
1459 U8X8_C( 0x00c ), /* data format LSB top */
1460
1461 //U8X8_C( 0x030 ), /* select 00 commands */
1462 U8X8_C( 0xca ), /* display control, 3 args follow */
1463 U8X8_A( 0x00 ), /* 0x00: no clock division, 0x04: devide clock */
1464 U8X8_A( 159 ), /* 1/160 duty value from the DS example code */
1465 U8X8_A( 0x20 ), /* nline off */
1466
1467 //U8X8_C( 0x030 ), /* select 00 commands */
1468 U8X8_CA( 0x0f0, 0x010 ), /* monochrome mode = 0x010*/
1469
1470 //U8X8_C( 0x030 ), /* select 00 commands */
1471 U8X8_CAA( 0x81, 0x18, 0x05 ), /* Volume control */
1472
1473 //U8X8_C( 0x030 ), /* select 00 commands */
1474 U8X8_CA( 0x020, 0x00b ), /* Power control: Regulator, follower & booster on */
1475 U8X8_DLY(100),
1476
1477 U8X8_END_TRANSFER(), /* disable chip */
1478 U8X8_END() /* end of sequence */
1479 };
1480
1481
1482 uint8_t u8x8_d_st75256_jlx256160_alt(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
1483 {
1484 uint8_t x, c;
1485 uint8_t *ptr;
1486
1487 switch(msg)
1488 {
1489 case U8X8_MSG_DISPLAY_DRAW_TILE:
1490
1491 u8x8_cad_StartTransfer(u8x8);
1492 x = ((u8x8_tile_t *)arg_ptr)->x_pos;
1493 x *= 8;
1494
1495 u8x8_cad_SendCmd(u8x8, 0x030 ); /* select command set */
1496 u8x8_cad_SendCmd(u8x8, 0x075 ); /* row */
1497 if ( u8x8->x_offset == 0 ) /* 0 means flip mode 1 */
1498 u8x8_cad_SendArg(u8x8, 1+(((u8x8_tile_t *)arg_ptr)->y_pos));
1499 else
1500 u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
1501 u8x8_cad_SendArg(u8x8, 0x04f);
1502 //u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
1503 u8x8_cad_SendCmd(u8x8, 0x015 ); /* col */
1504 u8x8_cad_SendArg(u8x8, x+u8x8->x_offset);
1505 u8x8_cad_SendArg(u8x8, 255);
1506 u8x8_cad_SendCmd(u8x8, 0x05c );
1507
1508
1509 do
1510 {
1511 c = ((u8x8_tile_t *)arg_ptr)->cnt;
1512 ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
1513 /* SendData can not handle more than 255 bytes, treat c > 31 correctly */
1514 if ( c > 31 )
1515 {
1516 u8x8_cad_SendData(u8x8, 248, ptr); /* 31*8=248 */
1517 ptr+=248;
1518 c -= 31;
1519 }
1520
1521 u8x8_cad_SendData(u8x8, c*8, ptr);
1522 arg_int--;
1523 } while( arg_int > 0 );
1524
1525 u8x8_cad_EndTransfer(u8x8);
1526 return 1;
1527 case U8X8_MSG_DISPLAY_SETUP_MEMORY:
1528 //u8x8_SetI2CAddress(u8x8, 0x078); /* lowest I2C adr of the ST75256 */
1529 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_st75256_256x160_alt_display_info);
1530 return 1;
1531 case U8X8_MSG_DISPLAY_INIT:
1532 u8x8_d_helper_display_init(u8x8);
1533 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x160_alt_init_seq);
1534 return 1;
1535 case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
1536 if ( arg_int == 0 )
1537 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave0_seq);
1538 else
1539 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave1_seq);
1540
1541 return 1;
1542 case U8X8_MSG_DISPLAY_SET_FLIP_MODE:
1543 if ( arg_int == 0 )
1544 {
1545 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip0_seq);
1546 u8x8->x_offset = u8x8->display_info->default_x_offset;
1547 }
1548 else
1549 {
1550 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip1_seq);
1551 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
1552 }
1553 return 1;
1554
1555 #ifdef U8X8_WITH_SET_CONTRAST
1556 case U8X8_MSG_DISPLAY_SET_CONTRAST:
1557
1558 u8x8_cad_StartTransfer(u8x8);
1559
1560 u8x8_cad_SendCmd(u8x8, 0x030 );
1561 u8x8_cad_SendCmd(u8x8, 0x081 ); /* there are 9 bit for the volume control */
1562 u8x8_cad_SendArg(u8x8, (arg_int & 0x1f)<<1 ); /* lower 6 bit */
1563 u8x8_cad_SendArg(u8x8, (arg_int>>5)); /* upper 3 bit */
1564
1565 u8x8_cad_EndTransfer(u8x8);
1566 return 1;
1567 #endif
1568 }
1569 return 0;
1570
1571 }
1572
1573
1574 /*=============================================*/
1575 /* JLX19296 LCD */
1576
1577 static const u8x8_display_info_t u8x8_st75256_192x96_display_info =
1578 {
1579 /* chip_enable_level = */ 0,
1580 /* chip_disable_level = */ 1,
1581
1582 /* post_chip_enable_wait_ns = */ 20,
1583 /* pre_chip_disable_wait_ns = */ 20,
1584 /* reset_pulse_width_ms = */ 5,
1585 /* post_reset_wait_ms = */ 5, /**/
1586 /* sda_setup_time_ns = */ 20, /* */
1587 /* sck_pulse_width_ns = */ 40, /* */
1588 /* sck_clock_hz = */ 4000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
1589 /* spi_mode = */ 0, /* active high, rising edge */
1590 /* i2c_bus_clock_100kHz = */ 4, /* 400KHz */
1591 /* data_setup_time_ns = */ 15,
1592 /* write_pulse_width_ns = */ 70,
1593 /* tile_width = */ 24,
1594 /* tile_hight = */ 12,
1595 /* default_x_offset = */ 0, /* */
1596 /* flipmode_x_offset = */ 64,
1597 /* pixel_width = */ 192,
1598 /* pixel_height = */ 96
1599 };
1600
1601 static const uint8_t u8x8_d_st75256_jlx19296_init_seq[] = {
1602 U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
1603
1604 U8X8_DLY(20),
1605
1606 U8X8_C( 0x030 ), /* select 00 commands */
1607 U8X8_C( 0x094 ), /* sleep out */
1608
1609 //U8X8_C( 0x030 ), /* select 00 commands */
1610 U8X8_C( 0x0ae ), /* display off */
1611
1612 U8X8_C( 0x031 ), /* select 01 commands */
1613 U8X8_CA( 0x0d7, 0x09f ), /* disable auto read */
1614
1615 //U8X8_C( 0x031 ), /* select 01 commands */
1616 U8X8_C( 0x032 ), /* analog circuit set */
1617 U8X8_A( 0x000 ), /* code example: OSC Frequency adjustment */
1618 U8X8_A( 0x001 ), /* Frequency on booster capacitors 1 = 6KHz? */
1619 U8X8_A( 0x003 ), /* Bias: 1: 1/13, 2: 1/12, 3: 1/11, 4:1/10, 5:1/9 */
1620
1621 //U8X8_C( 0x031 ), /* select 01 commands */
1622 U8X8_C( 0x020 ), /* gray levels */
1623 U8X8_A( 0x01 ),
1624 U8X8_A( 0x03 ),
1625 U8X8_A( 0x05 ),
1626 U8X8_A( 0x07 ),
1627 U8X8_A( 0x09),
1628 U8X8_A( 0x0b ),
1629 U8X8_A( 0x0d ),
1630 U8X8_A( 0x10 ),
1631 U8X8_A( 0x11 ),
1632 U8X8_A( 0x13 ),
1633 U8X8_A( 0x15 ),
1634 U8X8_A( 0x17 ),
1635 U8X8_A( 0x19 ),
1636 U8X8_A( 0x1b ),
1637 U8X8_A( 0x1d ),
1638 U8X8_A( 0x1f ),
1639
1640
1641 U8X8_C( 0x030 ), /* select 00 commands */
1642 U8X8_CAA(0x75, 0, 0x4f), /* row range */
1643 U8X8_CAA(0x15, 0, 255), /* col range */
1644
1645 //U8X8_C( 0x030 ), /* select 00 commands */
1646 U8X8_CA( 0xbc, 0x00 ), /* data scan dir */
1647 U8X8_A( 0xa6 ), /* ??? */
1648
1649 //U8X8_C( 0x030 ), /* select 00 commands */
1650 U8X8_C( 0x00c ), /* data format LSB top */
1651
1652 //U8X8_C( 0x030 ), /* select 00 commands */
1653 U8X8_C( 0xca ), /* display control, 3 args follow */
1654 U8X8_A( 0x00 ), /* 0x00: no clock division, 0x04: devide clock */
1655 U8X8_A( 0x9f ), /* 1/160 duty value from the DS example code */
1656 U8X8_A( 0x20 ), /* nline off */
1657
1658 //U8X8_C( 0x030 ), /* select 00 commands */
1659 U8X8_CA( 0x0f0, 0x010 ), /* monochrome mode = 0x010*/
1660
1661 //U8X8_C( 0x030 ), /* select 00 commands */
1662 U8X8_CAA( 0x81, 0x2e, 0x03 ), /* Volume control */
1663
1664 //U8X8_C( 0x030 ), /* select 00 commands */
1665 U8X8_CA( 0x020, 0x00b ), /* Power control: Regulator, follower & booster on */
1666 U8X8_DLY(100),
1667
1668 U8X8_END_TRANSFER(), /* disable chip */
1669 U8X8_END() /* end of sequence */
1670 };
1671
1672
1673 uint8_t u8x8_d_st75256_jlx19296(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
1674 {
1675 uint8_t x, c;
1676 uint8_t *ptr;
1677
1678 switch(msg)
1679 {
1680 case U8X8_MSG_DISPLAY_DRAW_TILE:
1681
1682 u8x8_cad_StartTransfer(u8x8);
1683 x = ((u8x8_tile_t *)arg_ptr)->x_pos;
1684 x *= 8;
1685
1686 u8x8_cad_SendCmd(u8x8, 0x030 ); /* select command set */
1687 u8x8_cad_SendCmd(u8x8, 0x075 ); /* row */
1688 if ( u8x8->x_offset == 0 ) /* 0 means flip mode 1, then adjust y value */
1689 u8x8_cad_SendArg(u8x8, 8+(((u8x8_tile_t *)arg_ptr)->y_pos));
1690 else
1691 u8x8_cad_SendArg(u8x8, 1+(((u8x8_tile_t *)arg_ptr)->y_pos));
1692 u8x8_cad_SendArg(u8x8, 0x04f);
1693 //u8x8_cad_SendArg(u8x8, (((u8x8_tile_t *)arg_ptr)->y_pos));
1694 u8x8_cad_SendCmd(u8x8, 0x015 ); /* col */
1695 u8x8_cad_SendArg(u8x8, x+u8x8->x_offset);
1696 u8x8_cad_SendArg(u8x8, 255);
1697 u8x8_cad_SendCmd(u8x8, 0x05c );
1698
1699
1700 do
1701 {
1702 c = ((u8x8_tile_t *)arg_ptr)->cnt;
1703 ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr;
1704 c *= 8;
1705
1706 if ( c + x > 192u )
1707 {
1708 c = 192u;
1709 c -= x;
1710 }
1711
1712 u8x8_cad_SendData(u8x8, c, ptr);
1713 x += c;
1714 arg_int--;
1715 } while( arg_int > 0 );
1716
1717 u8x8_cad_EndTransfer(u8x8);
1718 return 1;
1719 case U8X8_MSG_DISPLAY_SETUP_MEMORY:
1720 //u8x8_SetI2CAddress(u8x8, 0x078); /* lowest I2C adr of the ST75256 */
1721 u8x8_d_helper_display_setup_memory(u8x8, &u8x8_st75256_192x96_display_info);
1722 return 1;
1723 case U8X8_MSG_DISPLAY_INIT:
1724 u8x8_d_helper_display_init(u8x8);
1725 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx19296_init_seq);
1726 return 1;
1727 case U8X8_MSG_DISPLAY_SET_POWER_SAVE:
1728 if ( arg_int == 0 )
1729 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave0_seq);
1730 else
1731 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_256x128_powersave1_seq);
1732
1733 return 1;
1734 case U8X8_MSG_DISPLAY_SET_FLIP_MODE:
1735 if ( arg_int == 0 )
1736 {
1737 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx256160_flip0_seq);
1738 u8x8->x_offset = u8x8->display_info->default_x_offset;
1739 }
1740 else
1741 {
1742 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx256160_flip1_seq);
1743 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
1744 }
1745 return 1;
1746 /*
1747 if ( arg_int == 0 )
1748 {
1749 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip0_seq);
1750 u8x8->x_offset = u8x8->display_info->default_x_offset;
1751 }
1752 else
1753 {
1754 u8x8_cad_SendSequence(u8x8, u8x8_d_st75256_jlx172104_flip1_seq);
1755 u8x8->x_offset = u8x8->display_info->flipmode_x_offset;
1756 }
1757 return 1;
1758 */
1759
1760 #ifdef U8X8_WITH_SET_CONTRAST
1761 case U8X8_MSG_DISPLAY_SET_CONTRAST:
1762
1763 u8x8_cad_StartTransfer(u8x8);
1764
1765 u8x8_cad_SendCmd(u8x8, 0x030 );
1766 u8x8_cad_SendCmd(u8x8, 0x081 ); /* there are 9 bit for the volume control */
1767 u8x8_cad_SendArg(u8x8, (arg_int & 0x1f)<<1 ); /* lower 6 bit */
1768 u8x8_cad_SendArg(u8x8, (arg_int>>5)); /* upper 3 bit */
1769
1770 u8x8_cad_EndTransfer(u8x8);
1771 return 1;
1772 #endif
1773 }
1774 return 0;
1775 }
1776

mercurial