// ChibiMo 3 Firmware for LS027B4DH01 // Version 0.20121217 // // (c)kuroi kouichi. q61.org 2012. // This firmware is provided AS-IS. No warranty. // For personal and non-commercial use only. // For modifying and redistributing, follow GPL v3. #include #define _nop() __asm__("nop\n\t") #define BAUD_RATE 1000000 #define startup_bmp chibimodata const uint8_t startup_bmp_lines = 44; //const uint8_t startup_bmp_lines = 240; PROGMEM const prog_char chibimodata[44 * 54] = { 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x05, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x06, 0xff, 0x3f, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xff, 0x87, 0x3f, 0xfc, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x07, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0xf0, 0xff, 0xff, 0x87, 0x3f, 0xfc, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x08, 0xff, 0x03, 0x00, 0x80, 0xff, 0xf0, 0xff, 0xff, 0x87, 0x3f, 0xfc, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xf3, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x09, 0xff, 0x01, 0xfe, 0x00, 0xff, 0xf0, 0xff, 0xff, 0x87, 0x3f, 0xfc, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf3, 0xff, 0xec, 0xfa, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x0a, 0xff, 0x80, 0xff, 0x03, 0xff, 0xf0, 0xff, 0xff, 0x87, 0x3f, 0xfc, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xef, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x0b, 0xff, 0xe0, 0xff, 0x0f, 0xfe, 0xf0, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfe, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xec, 0x69, 0xff, 0xfb, 0x7f, 0xbe, 0x7c, 0xfa, 0x00, 0x00, 0x01, 0x0c, 0x7f, 0xf0, 0xff, 0x1f, 0xfc, 0xf0, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xdb, 0x66, 0xf9, 0xfb, 0xbf, 0x3d, 0xbb, 0xf9, 0x00, 0x00, 0x01, 0x0d, 0x3f, 0xf0, 0xff, 0x1f, 0xfc, 0xf0, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x5f, 0x6f, 0xf6, 0xfb, 0xdf, 0x3b, 0xdb, 0xfb, 0x00, 0x00, 0x01, 0x0e, 0x3f, 0xf8, 0xff, 0x3f, 0xfc, 0xf0, 0x01, 0xff, 0xff, 0x3f, 0x3c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xf0, 0xff, 0x7f, 0x80, 0xff, 0x87, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x5f, 0x6f, 0xef, 0xfb, 0xdf, 0xbb, 0xdf, 0xfb, 0x00, 0x00, 0x01, 0x0f, 0x1f, 0xfc, 0xff, 0x3f, 0xf8, 0x70, 0x00, 0xfc, 0x87, 0x3f, 0x0c, 0x80, 0xff, 0x87, 0x7f, 0x38, 0x00, 0x0f, 0xc0, 0xff, 0x1f, 0x00, 0xfe, 0x87, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x5b, 0x6f, 0xef, 0xfb, 0xdf, 0xbb, 0xdf, 0xfb, 0x00, 0x00, 0x01, 0x10, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0x30, 0x00, 0xf8, 0x87, 0x3f, 0x04, 0x00, 0xfe, 0x87, 0x7f, 0x08, 0x00, 0x07, 0x00, 0xff, 0x0f, 0x00, 0xfc, 0x87, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x6c, 0x6f, 0xef, 0xfb, 0xdf, 0xbb, 0xdf, 0xfb, 0x00, 0x00, 0x01, 0x11, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0x10, 0x00, 0xf0, 0x87, 0x3f, 0x00, 0x00, 0xfc, 0x87, 0x7f, 0x08, 0x00, 0x02, 0x00, 0xff, 0x03, 0x00, 0xf0, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf7, 0xe6, 0xf6, 0xfb, 0xbe, 0xbd, 0xbf, 0xf9, 0x00, 0x00, 0x01, 0x12, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x3e, 0xf0, 0x87, 0x3f, 0x80, 0x0f, 0xfc, 0x87, 0x7f, 0x80, 0x0f, 0xc0, 0x07, 0xfe, 0x03, 0x3f, 0xf0, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf8, 0xe9, 0xf9, 0xe0, 0x7c, 0xbe, 0x7f, 0xfa, 0x00, 0x00, 0x01, 0x13, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0x80, 0xff, 0xe0, 0x87, 0x3f, 0xe0, 0x3f, 0xf8, 0x87, 0x7f, 0xe0, 0x1f, 0xf0, 0x0f, 0xfe, 0xc1, 0xff, 0xe0, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x01, 0x14, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xe0, 0x87, 0x3f, 0xf0, 0x7f, 0xf0, 0x87, 0x7f, 0xf0, 0x3f, 0xf8, 0x1f, 0xfe, 0xe0, 0xff, 0xc1, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0x00, 0x00, 0x01, 0x15, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xe1, 0x87, 0x3f, 0xf8, 0xff, 0xf0, 0x87, 0x7f, 0xf0, 0x3f, 0xf8, 0x1f, 0xfe, 0xe0, 0xff, 0xc1, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x00, 0x00, 0x01, 0x16, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xe1, 0x87, 0x3f, 0xf8, 0xff, 0xf0, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfe, 0xf0, 0xff, 0xc3, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x17, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xf8, 0xff, 0xe0, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0x7e, 0xf0, 0xff, 0x83, 0xff, 0x0f, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x18, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xfc, 0xff, 0xe1, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0x7e, 0xf8, 0xff, 0x87, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x19, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xfc, 0xff, 0xe1, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0x7e, 0xf8, 0xff, 0x87, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x1a, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xfc, 0xff, 0xe1, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0x7e, 0xf8, 0xff, 0x87, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x1b, 0x0f, 0xfc, 0xff, 0x3f, 0xf8, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xfc, 0xff, 0xe1, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0x7e, 0xf8, 0xff, 0x87, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x1c, 0x1f, 0xfc, 0xff, 0x3f, 0xf8, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xfc, 0xff, 0xe1, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0x7e, 0xf8, 0xff, 0x87, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf9, 0xfc, 0xfc, 0xf9, 0xfc, 0x7c, 0x7e, 0xfe, 0x00, 0x00, 0x01, 0x1d, 0x1f, 0xfc, 0xff, 0x3f, 0xf8, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xfc, 0xff, 0xe1, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0x7e, 0xf8, 0xff, 0x87, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0x76, 0x7b, 0xfd, 0x76, 0x7d, 0xbb, 0xbd, 0xfe, 0x00, 0x00, 0x01, 0x1e, 0x1f, 0xfc, 0xff, 0x3f, 0xfc, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xfc, 0xff, 0xe1, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0x7e, 0xf8, 0xff, 0x87, 0xc3, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f, 0xb7, 0xf7, 0x7d, 0xf7, 0xbd, 0xdb, 0xfb, 0xfe, 0x00, 0x00, 0x01, 0x1f, 0x3f, 0xf8, 0xff, 0x1f, 0xfc, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xf8, 0xff, 0xe0, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0x7e, 0xf0, 0xff, 0x83, 0xc3, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xef, 0xff, 0xff, 0xb7, 0xf7, 0xfd, 0xf7, 0xfd, 0xfb, 0xfb, 0xfe, 0x00, 0x00, 0x01, 0x20, 0x3f, 0xf0, 0xff, 0x1f, 0xfc, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xf8, 0xff, 0xf0, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfe, 0xf0, 0xff, 0xc3, 0x83, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xb8, 0xef, 0xff, 0xff, 0xbb, 0xf7, 0xfd, 0xfb, 0xfd, 0xfd, 0xfd, 0xfe, 0x00, 0x00, 0x01, 0x21, 0x7f, 0xf0, 0xff, 0x0f, 0xfe, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xf8, 0xff, 0xf0, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfe, 0xe0, 0xff, 0xc1, 0x87, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xed, 0xff, 0xff, 0xbd, 0xf7, 0xfd, 0xfd, 0xfd, 0x7e, 0xfe, 0xfe, 0x00, 0x00, 0x01, 0x22, 0x7f, 0xe0, 0xff, 0x07, 0xfe, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xf0, 0x7f, 0xf0, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfe, 0xe0, 0xff, 0xc1, 0x07, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xed, 0xff, 0xff, 0xbe, 0xf7, 0xfd, 0xfe, 0x7d, 0xff, 0xfd, 0xfe, 0x00, 0x00, 0x01, 0x23, 0xff, 0x80, 0xff, 0x03, 0xff, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0xe0, 0x3f, 0xf8, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfe, 0xc1, 0xff, 0xe0, 0x07, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xea, 0xff, 0x7f, 0xbf, 0xf7, 0x7d, 0xff, 0xbd, 0xff, 0xfb, 0xfe, 0x00, 0x00, 0x01, 0x24, 0xff, 0x01, 0xfe, 0x80, 0xff, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0x80, 0x0f, 0xf8, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfe, 0x03, 0x3f, 0xf0, 0x0f, 0xfc, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xf2, 0xff, 0xbf, 0xbf, 0xf7, 0xbd, 0xff, 0xdd, 0xff, 0xfb, 0xfe, 0x00, 0x00, 0x01, 0x25, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0x00, 0x00, 0xfc, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfe, 0x03, 0x00, 0xf0, 0x1f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xf2, 0xfe, 0xbf, 0x7f, 0xfb, 0xbd, 0xff, 0xdd, 0xdf, 0xfd, 0xfe, 0x00, 0x00, 0x01, 0x26, 0xff, 0x07, 0x00, 0xe0, 0xff, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0x04, 0x00, 0xfe, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfe, 0x07, 0x00, 0xf8, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xf7, 0xfc, 0x3f, 0xf0, 0x7c, 0x30, 0x70, 0x10, 0x38, 0x3e, 0xf8, 0x00, 0x00, 0x01, 0x27, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xe1, 0x87, 0x3f, 0x0c, 0x00, 0xff, 0x87, 0x7f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfe, 0x1f, 0x00, 0xfe, 0x7f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x28, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x80, 0xff, 0xff, 0x03, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; volatile uint8_t g_tmr_tick; volatile uint8_t g_tmr_ticked; uint8_t g_disp_on; uint8_t g_com_active; ISR(TIMER1_COMPA_vect) { static uint8_t s_subtick = 0; if (++s_subtick == 0x0) { ++g_tmr_tick; g_tmr_ticked = 0; s_subtick = 0; if (g_com_active) { PORTC = (g_tmr_tick & 1); } } TCNT1H = 0; TCNT1L = 0; } void serial_init(long baud) { uint16_t baud_setting; UCSR0A = 0; baud_setting = (F_CPU / 8 / baud - 1) / 2; UBRR0H = baud_setting >> 8; UBRR0L = baud_setting; UCSR0B = 1 << RXEN0; } volatile uint8_t serial_data_ready() { return ((UCSR0A & (1 << RXC0)) >> RXC0); } volatile uint8_t serial_data_read() { return (UDR0); } // PB0 -> DISP (disp on) // PB1 -> SCS (chip select) // PB3 SPI MOSI -> SI (data) // PB5 SPI SCK -> SCLK (serial clock) // PC0 -> EXTCOMIN #define PORT_LCD_DISP 0 #define PORT_LCD_SCS 1 static uint8_t *g_spi_data_ptr; static uint8_t g_spi_data_len; static uint8_t g_spi_data_pos; void lcd_write_scs_start() { uint8_t x = (g_disp_on) ? (1 << PORT_LCD_DISP) : 0x00; PORTB = x; // scs setup PORTB = x | (1 << PORT_LCD_SCS); delayMicroseconds(3); } void lcd_write_scs_end() { uint8_t x = (g_disp_on) ? (1 << PORT_LCD_DISP) : 0x00; PORTB = x; // scs end delayMicroseconds(1); PORTB = x; } void lcd_write_init() { g_spi_data_ptr = NULL; g_spi_data_len = 0; g_spi_data_pos = 0; } void lcd_write_data_start(uint8_t *dt, uint8_t len) { g_spi_data_ptr = dt; g_spi_data_len = len; // write first byte to clear SPIF lcd_write_scs_start(); SPDR = g_spi_data_ptr[0]; g_spi_data_pos = 1; } uint8_t lcd_write_data_next() { // wait until last byte goes out if ((SPSR & (1 << SPIF)) == 0) { return (0); } // if pos has got past end return 1 if (g_spi_data_pos > g_spi_data_len) { return (1); } // if pos has reached end stop scs if (g_spi_data_pos == g_spi_data_len) { lcd_write_scs_end(); g_spi_data_pos++; return (1); } // write next byte SPDR = g_spi_data_ptr[g_spi_data_pos]; g_spi_data_pos++; return (0); } void lcd_write_data_sync(uint8_t *dt, uint8_t len) { lcd_write_data_start(dt, len); do { ; } while (lcd_write_data_next() == 0); } void lcd_write_data_old(uint8_t *dt, uint8_t len) { uint8_t x = (g_disp_on) ? ((1 << PORT_LCD_DISP) | (1 << PORT_LCD_SCS)) : (1 << PORT_LCD_SCS); PORTB = x; for (uint8_t i = 0; i < len; i++) { SPDR = dt[i]; while ((SPSR & (1 << SPIF)) == 0) { ; } } PORTB = x; } void lcd_keep_disp() { uint8_t dt[4] = { 0x00, 0x00, 0x00, 0x00 }; lcd_write_data_sync(dt, 2); delayMicroseconds(10); } void lcd_all_clear() { uint8_t dt[4] = { 0x04, 0x00, 0x00, 0x00 }; lcd_write_data_sync(dt, 2); delayMicroseconds(10); } void lcd_write_line(uint8_t *dt) { dt[0] = 0x01; lcd_write_data_sync(dt, 54); } void lcd_gen_data(uint8_t y, uint8_t *dt, uint8_t n) { dt[1] = y; for (uint8_t i = 0; i < 50; i++) { dt[2 + i] = n; } dt[52] = 0; dt[53] = 0; dt[54] = 0; dt[55] = 0; } void lcd_write_startup_bmp() { PROGMEM const prog_char *p = startup_bmp; uint8_t dttmp[60]; for (uint8_t i = 0; i < startup_bmp_lines; i++) { for (uint8_t k = 0; k < 54; k++) { dttmp[k] = pgm_read_byte(p++); } lcd_write_line(dttmp); } } void setup() { PORTB = 0; PORTC = 0; DDRB = 0xff; DDRC = 0xff; g_disp_on = 0; g_com_active = 0; TCCR1A = 0; TCCR1B = 3; // prescale 1/64 OCR1AH = 0; OCR1AL = 128; TIMSK1 = (1 << OCIE1A); SPCR = (1 << SPE) | (1 << DORD) | (1 << MSTR) | (1 << SPR0); SPSR = (1 << SPI2X); lcd_write_init(); serial_init(BAUD_RATE); delay(100); lcd_all_clear(); delay(50); g_disp_on = 1; PORTB = (1 << PORT_LCD_DISP); delay(30); g_com_active = 1; // com on delay(30); lcd_write_startup_bmp(); } // data protocol for updating one line: // 0x80 0x80 [line_num] [pixel_0] [pixel_1] ... [pixel_48] [pixel_49] 0x00 0x00 0x00 void loop() { uint8_t dt1[60], dt2[60]; uint8_t *dtnext; uint8_t dtpos; uint8_t dtpending; uint8_t writedone; dtnext = dt1; dtpos = 0; dtpending = 0; while (1) { g_tmr_ticked = 1; writedone = 0; while (g_tmr_ticked) { if (lcd_write_data_next()) { dtpending = 0; } else { writedone = 1; } if (serial_data_ready()) { uint8_t indt = serial_data_read(); if ((dtpos == 0) || (dtpos == 1)) { // read command id 0x80 0x80 if (indt != 0x80) { dtpos = 0; } else { dtpos++; } } else if (dtpos == 2) { // read line number if ((indt < 1) || (indt > 240)) { dtpos = 0; } else { dtnext[0] = 1; dtnext[1] = indt; dtpos++; } } else if (dtpos < 53) { // read pixel data dtnext[dtpos - 1] = indt; dtpos++; } else if (dtpos < 55) { // read trailing dummy data dtnext[dtpos - 1] = 0; dtpos++; } else if (dtpos == 55) { // read flush command if (dtpending) { ; } else { lcd_write_data_start(dtnext, 54); dtnext = (dtnext == dt1) ? dt2 : dt1; dtpos = 0; dtpending = 1; } } } } if (writedone == 0) { lcd_keep_disp(); } } }