Graphic OLED 100x16 pixels interface
Dependents: mbed_nicovideo_search_api mbed_recent_nicovideo_display_pub
- グラフィック有機ELモジュール100x16
- 8×8 ドット日本語フォント「美咲フォント」
- misaki2cpp.py 美咲フォントをC++コードへ変換。
GraphicOLED.cpp@2:337a2655f815, 2014-08-04 (annotated)
- Committer:
- va009039
- Date:
- Mon Aug 04 06:17:36 2014 +0000
- Revision:
- 2:337a2655f815
- Parent:
- 1:a104653979bf
- Child:
- 3:a6650dd2dbc8
remove Text LCD
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:67d983a1ed3e | 1 | // GraphicOLED.cpp |
va009039 | 0:67d983a1ed3e | 2 | #include "GraphicOLED.h" |
va009039 | 0:67d983a1ed3e | 3 | #include <ctype.h> |
va009039 | 0:67d983a1ed3e | 4 | |
va009039 | 2:337a2655f815 | 5 | extern void font_4x8(uint8_t buf[], int i); |
va009039 | 2:337a2655f815 | 6 | extern void font_8x8(uint8_t buf[], int i); |
va009039 | 2:337a2655f815 | 7 | |
va009039 | 2:337a2655f815 | 8 | GraphicOLED::GraphicOLED(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7) : _rs(rs), _e(e), _d(d4, d5, d6, d7) { |
va009039 | 2:337a2655f815 | 9 | _e = 1; |
va009039 | 2:337a2655f815 | 10 | _rs = 0; // command mode |
va009039 | 2:337a2655f815 | 11 | |
va009039 | 2:337a2655f815 | 12 | wait_ms(15); // Wait 15ms to ensure powered up |
va009039 | 0:67d983a1ed3e | 13 | |
va009039 | 2:337a2655f815 | 14 | // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus) |
va009039 | 2:337a2655f815 | 15 | for (int i=0; i<3; i++) { |
va009039 | 2:337a2655f815 | 16 | writeByte(0x3); |
va009039 | 2:337a2655f815 | 17 | wait_ms(2); // this command takes 1.64ms, so wait for it |
va009039 | 2:337a2655f815 | 18 | } |
va009039 | 2:337a2655f815 | 19 | writeByte(0x2); // 4-bit mode |
va009039 | 2:337a2655f815 | 20 | wait_us(40); // most instructions take 40us |
va009039 | 2:337a2655f815 | 21 | |
va009039 | 2:337a2655f815 | 22 | //writeCommand(0x28); // Function set 001 BW N F - - |
va009039 | 2:337a2655f815 | 23 | //writeCommand(0x0C); |
va009039 | 2:337a2655f815 | 24 | //writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes |
va009039 | 2:337a2655f815 | 25 | //cls(); |
va009039 | 2:337a2655f815 | 26 | |
va009039 | 0:67d983a1ed3e | 27 | wait_ms(500); // wait 500ms |
va009039 | 0:67d983a1ed3e | 28 | writeCommand(0x00); // 0x0 x 5 |
va009039 | 0:67d983a1ed3e | 29 | writeCommand(0x00); |
va009039 | 0:67d983a1ed3e | 30 | writeCommand(0x02); // function set |
va009039 | 0:67d983a1ed3e | 31 | writeCommand(0x28); // N=1 |
va009039 | 0:67d983a1ed3e | 32 | writeCommand(0x0c); // D=1 display on |
va009039 | 0:67d983a1ed3e | 33 | writeCommand(0x14); // S/C=0 R/L=1 |
va009039 | 0:67d983a1ed3e | 34 | writeCommand(0x1f); // G/C=1 graphic mode |
va009039 | 0:67d983a1ed3e | 35 | _kanji_flag = false; |
va009039 | 0:67d983a1ed3e | 36 | } |
va009039 | 0:67d983a1ed3e | 37 | |
va009039 | 2:337a2655f815 | 38 | void GraphicOLED::g_write(uint8_t pat, int x, int y) |
va009039 | 0:67d983a1ed3e | 39 | { |
va009039 | 0:67d983a1ed3e | 40 | writeCommand(0x40+y); // y position |
va009039 | 0:67d983a1ed3e | 41 | writeCommand(0x80+x); // x position |
va009039 | 0:67d983a1ed3e | 42 | writeData(pat); |
va009039 | 0:67d983a1ed3e | 43 | } |
va009039 | 0:67d983a1ed3e | 44 | |
va009039 | 2:337a2655f815 | 45 | void GraphicOLED::g_write(uint8_t *buf, int len, int x, int y) |
va009039 | 0:67d983a1ed3e | 46 | { |
va009039 | 0:67d983a1ed3e | 47 | writeCommand(0x40+y); // y position |
va009039 | 0:67d983a1ed3e | 48 | while(len-- > 0) { |
va009039 | 0:67d983a1ed3e | 49 | writeCommand(0x80 + x++); // x position |
va009039 | 0:67d983a1ed3e | 50 | writeData(*buf++); |
va009039 | 0:67d983a1ed3e | 51 | } |
va009039 | 0:67d983a1ed3e | 52 | } |
va009039 | 0:67d983a1ed3e | 53 | |
va009039 | 2:337a2655f815 | 54 | void GraphicOLED::writeCommand(uint8_t command) { |
va009039 | 2:337a2655f815 | 55 | _rs = 0; |
va009039 | 2:337a2655f815 | 56 | writeByte(command); |
va009039 | 2:337a2655f815 | 57 | } |
va009039 | 2:337a2655f815 | 58 | |
va009039 | 2:337a2655f815 | 59 | void GraphicOLED::writeData(uint8_t data) { |
va009039 | 2:337a2655f815 | 60 | _rs = 1; |
va009039 | 2:337a2655f815 | 61 | writeByte(data); |
va009039 | 2:337a2655f815 | 62 | } |
va009039 | 2:337a2655f815 | 63 | |
va009039 | 2:337a2655f815 | 64 | void GraphicOLED::writeByte(uint8_t value) { |
va009039 | 2:337a2655f815 | 65 | _d = value >> 4; |
va009039 | 2:337a2655f815 | 66 | wait_us(40); // most instructions take 40us |
va009039 | 2:337a2655f815 | 67 | _e = 0; |
va009039 | 2:337a2655f815 | 68 | wait_us(40); |
va009039 | 2:337a2655f815 | 69 | _e = 1; |
va009039 | 2:337a2655f815 | 70 | _d = value >> 0; |
va009039 | 2:337a2655f815 | 71 | wait_us(40); |
va009039 | 2:337a2655f815 | 72 | _e = 0; |
va009039 | 2:337a2655f815 | 73 | wait_us(40); // most instructions take 40us |
va009039 | 2:337a2655f815 | 74 | _e = 1; |
va009039 | 2:337a2655f815 | 75 | } |
va009039 | 2:337a2655f815 | 76 | |
va009039 | 0:67d983a1ed3e | 77 | void GraphicOLED::cls() |
va009039 | 0:67d983a1ed3e | 78 | { |
va009039 | 0:67d983a1ed3e | 79 | for(int y = 0; y < 2; y++) { |
va009039 | 0:67d983a1ed3e | 80 | for(int x = 0; x < 100; x++) { |
va009039 | 2:337a2655f815 | 81 | g_write(0x00, x, y); |
va009039 | 0:67d983a1ed3e | 82 | } |
va009039 | 0:67d983a1ed3e | 83 | } |
va009039 | 1:a104653979bf | 84 | locate(0,0); |
va009039 | 1:a104653979bf | 85 | _kanji_flag = false; |
va009039 | 0:67d983a1ed3e | 86 | } |
va009039 | 0:67d983a1ed3e | 87 | |
va009039 | 2:337a2655f815 | 88 | void GraphicOLED::locate(int column, int row) { |
va009039 | 2:337a2655f815 | 89 | _column = column; |
va009039 | 2:337a2655f815 | 90 | _row = row; |
va009039 | 2:337a2655f815 | 91 | } |
va009039 | 2:337a2655f815 | 92 | |
va009039 | 0:67d983a1ed3e | 93 | int GraphicOLED::columns() { return 25; } |
va009039 | 0:67d983a1ed3e | 94 | |
va009039 | 2:337a2655f815 | 95 | int GraphicOLED::rows() { |
va009039 | 2:337a2655f815 | 96 | return 2; |
va009039 | 2:337a2655f815 | 97 | } |
va009039 | 2:337a2655f815 | 98 | |
va009039 | 0:67d983a1ed3e | 99 | int GraphicOLED::_putc(int value) |
va009039 | 0:67d983a1ed3e | 100 | { |
va009039 | 0:67d983a1ed3e | 101 | if (value == '\n') { |
va009039 | 0:67d983a1ed3e | 102 | _column = 0; |
va009039 | 0:67d983a1ed3e | 103 | _row++; |
va009039 | 0:67d983a1ed3e | 104 | if (_row >= rows()) { |
va009039 | 0:67d983a1ed3e | 105 | _row = 0; |
va009039 | 0:67d983a1ed3e | 106 | } |
va009039 | 0:67d983a1ed3e | 107 | _kanji_flag = false; |
va009039 | 0:67d983a1ed3e | 108 | } else if (_kanji_flag) { |
va009039 | 0:67d983a1ed3e | 109 | character2(_column, _row, _kanji_1st<<8 | value); |
va009039 | 0:67d983a1ed3e | 110 | _kanji_flag = false; |
va009039 | 0:67d983a1ed3e | 111 | _column += 2; |
va009039 | 0:67d983a1ed3e | 112 | if (_column >= columns()) { |
va009039 | 0:67d983a1ed3e | 113 | _column = 0; |
va009039 | 0:67d983a1ed3e | 114 | _row++; |
va009039 | 0:67d983a1ed3e | 115 | if (_row >= rows()) { |
va009039 | 0:67d983a1ed3e | 116 | _row = 0; |
va009039 | 0:67d983a1ed3e | 117 | } |
va009039 | 0:67d983a1ed3e | 118 | } |
va009039 | 0:67d983a1ed3e | 119 | } else if (iskanji(value)) { |
va009039 | 0:67d983a1ed3e | 120 | _kanji_1st = value; |
va009039 | 0:67d983a1ed3e | 121 | _kanji_flag = true; |
va009039 | 0:67d983a1ed3e | 122 | } else { |
va009039 | 0:67d983a1ed3e | 123 | character(_column, _row, value); |
va009039 | 0:67d983a1ed3e | 124 | _column++; |
va009039 | 0:67d983a1ed3e | 125 | if (_column >= columns()) { |
va009039 | 0:67d983a1ed3e | 126 | _column = 0; |
va009039 | 0:67d983a1ed3e | 127 | _row++; |
va009039 | 0:67d983a1ed3e | 128 | if (_row >= rows()) { |
va009039 | 0:67d983a1ed3e | 129 | _row = 0; |
va009039 | 0:67d983a1ed3e | 130 | } |
va009039 | 0:67d983a1ed3e | 131 | } |
va009039 | 0:67d983a1ed3e | 132 | } |
va009039 | 0:67d983a1ed3e | 133 | return value; |
va009039 | 0:67d983a1ed3e | 134 | } |
va009039 | 0:67d983a1ed3e | 135 | |
va009039 | 2:337a2655f815 | 136 | int GraphicOLED::_getc() { |
va009039 | 2:337a2655f815 | 137 | return -1; |
va009039 | 2:337a2655f815 | 138 | } |
va009039 | 2:337a2655f815 | 139 | |
va009039 | 0:67d983a1ed3e | 140 | void GraphicOLED::character(int column, int row, int c) |
va009039 | 0:67d983a1ed3e | 141 | { |
va009039 | 0:67d983a1ed3e | 142 | int i = 0; |
va009039 | 0:67d983a1ed3e | 143 | if (c >= 0xa1 && c <= 0xdf) { |
va009039 | 0:67d983a1ed3e | 144 | i = c - 66; |
va009039 | 0:67d983a1ed3e | 145 | } else if (isprint(c)) { // 20 - 7e |
va009039 | 0:67d983a1ed3e | 146 | i = c - 32; |
va009039 | 0:67d983a1ed3e | 147 | } |
va009039 | 2:337a2655f815 | 148 | uint8_t buf[4]; |
va009039 | 0:67d983a1ed3e | 149 | font_4x8(buf, i); |
va009039 | 2:337a2655f815 | 150 | g_write(buf, sizeof(buf), column*4, row); |
va009039 | 0:67d983a1ed3e | 151 | } |
va009039 | 0:67d983a1ed3e | 152 | |
va009039 | 0:67d983a1ed3e | 153 | void _jis(int *ph, int *pl) |
va009039 | 0:67d983a1ed3e | 154 | { |
va009039 | 0:67d983a1ed3e | 155 | if (*ph <= 0x9F) { |
va009039 | 0:67d983a1ed3e | 156 | if (*pl < 0x9F) *ph = (*ph << 1) - 0xE1; |
va009039 | 0:67d983a1ed3e | 157 | else *ph = (*ph << 1) - 0xE0; |
va009039 | 0:67d983a1ed3e | 158 | } else { |
va009039 | 0:67d983a1ed3e | 159 | if (*pl < 0x9F) *ph = (*ph << 1) - 0x161; |
va009039 | 0:67d983a1ed3e | 160 | else *ph = (*ph << 1) - 0x160; |
va009039 | 0:67d983a1ed3e | 161 | } |
va009039 | 0:67d983a1ed3e | 162 | if (*pl < 0x7F) *pl -= 0x1F; |
va009039 | 0:67d983a1ed3e | 163 | else if (*pl < 0x9F) *pl -= 0x20; |
va009039 | 0:67d983a1ed3e | 164 | else *pl -= 0x7E; |
va009039 | 0:67d983a1ed3e | 165 | } |
va009039 | 0:67d983a1ed3e | 166 | |
va009039 | 0:67d983a1ed3e | 167 | int _jis2adrs(int jiscode) |
va009039 | 0:67d983a1ed3e | 168 | { |
va009039 | 0:67d983a1ed3e | 169 | const int offset_table[][2] ={ |
va009039 | 0:67d983a1ed3e | 170 | {0x2121, 0}, {0x223a, 11}, {0x224a, 19}, {0x225c, 30}, {0x2272, 37}, {0x227e, 41}, {0x2330, 56}, |
va009039 | 0:67d983a1ed3e | 171 | {0x2341, 63}, {0x2361, 69}, {0x2421, 73}, {0x2521, 84}, {0x2621, 92}, {0x2641, 100}, {0x2721, 138}, |
va009039 | 0:67d983a1ed3e | 172 | {0x2751, 153}, {0x2821, 166}, {0x2d21, 604}, {0x2d40, 605}, {0x2d5f, 613}, {0x3021, 803}, |
va009039 | 0:67d983a1ed3e | 173 | {0x5021, 846}, {0x7ffff, 846}}; |
va009039 | 0:67d983a1ed3e | 174 | int ku = jiscode>>8; |
va009039 | 0:67d983a1ed3e | 175 | int ten = jiscode&0xff; |
va009039 | 0:67d983a1ed3e | 176 | int adrs = (ku-0x21) * (0x7e-0x21+1); |
va009039 | 0:67d983a1ed3e | 177 | adrs += (ten-0x21); |
va009039 | 0:67d983a1ed3e | 178 | for(int i = 0; ; i++) { // adjust |
va009039 | 0:67d983a1ed3e | 179 | if (jiscode >= offset_table[i][0] && jiscode < offset_table[i+1][0]) { |
va009039 | 0:67d983a1ed3e | 180 | adrs -= offset_table[i][1]; |
va009039 | 0:67d983a1ed3e | 181 | break; |
va009039 | 0:67d983a1ed3e | 182 | } |
va009039 | 0:67d983a1ed3e | 183 | } |
va009039 | 0:67d983a1ed3e | 184 | return adrs; |
va009039 | 0:67d983a1ed3e | 185 | } |
va009039 | 0:67d983a1ed3e | 186 | |
va009039 | 0:67d983a1ed3e | 187 | void GraphicOLED::character2(int column, int row, int c) |
va009039 | 0:67d983a1ed3e | 188 | { |
va009039 | 0:67d983a1ed3e | 189 | int h,l; |
va009039 | 0:67d983a1ed3e | 190 | h = c >> 8; |
va009039 | 0:67d983a1ed3e | 191 | l = c & 0xff; |
va009039 | 0:67d983a1ed3e | 192 | _jis(&h, &l); |
va009039 | 0:67d983a1ed3e | 193 | int adrs = _jis2adrs(h<<8 | l); |
va009039 | 2:337a2655f815 | 194 | uint8_t buf[8]; |
va009039 | 0:67d983a1ed3e | 195 | font_8x8(buf, adrs); |
va009039 | 2:337a2655f815 | 196 | g_write(buf, sizeof(buf), column*4, row); |
va009039 | 0:67d983a1ed3e | 197 | } |