C12832 LCD kanji interface.
Fork of GraphicOLED by
- 8×8 ドット日本語フォント「美咲フォント」
- misaki2cpp.py 美咲フォントをC++コードへ変換。
- app-board-LCD
GraphicOLED.cpp@3:a6650dd2dbc8, 2014-08-12 (annotated)
- Committer:
- va009039
- Date:
- Tue Aug 12 01:47:43 2014 +0000
- Revision:
- 3:a6650dd2dbc8
- Parent:
- 2:337a2655f815
change from shift-jis to utf-8.
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 | |
va009039 | 3:a6650dd2dbc8 | 4 | extern void font_4x8(uint8_t buf[], int c); // misaki_4x8_jis201.cpp |
va009039 | 3:a6650dd2dbc8 | 5 | extern void font_8x8(uint8_t buf[], uint32_t unicode); // misaki_8x8_unicode.cpp |
va009039 | 2:337a2655f815 | 6 | |
va009039 | 2:337a2655f815 | 7 | 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 | 8 | _e = 1; |
va009039 | 2:337a2655f815 | 9 | _rs = 0; // command mode |
va009039 | 2:337a2655f815 | 10 | |
va009039 | 3:a6650dd2dbc8 | 11 | wait_ms(500); // Wait For Stabilization 500ms |
va009039 | 0:67d983a1ed3e | 12 | |
va009039 | 3:a6650dd2dbc8 | 13 | writeCommand(0x00); // 0x0 x 5, sync 4bit-mode |
va009039 | 0:67d983a1ed3e | 14 | writeCommand(0x00); |
va009039 | 0:67d983a1ed3e | 15 | writeCommand(0x02); // function set |
va009039 | 3:a6650dd2dbc8 | 16 | writeCommand(0x28); // N=1 2-line display |
va009039 | 0:67d983a1ed3e | 17 | writeCommand(0x0c); // D=1 display on |
va009039 | 0:67d983a1ed3e | 18 | writeCommand(0x14); // S/C=0 R/L=1 |
va009039 | 0:67d983a1ed3e | 19 | writeCommand(0x1f); // G/C=1 graphic mode |
va009039 | 3:a6650dd2dbc8 | 20 | |
va009039 | 3:a6650dd2dbc8 | 21 | _uni_len = 0; |
va009039 | 0:67d983a1ed3e | 22 | } |
va009039 | 0:67d983a1ed3e | 23 | |
va009039 | 3:a6650dd2dbc8 | 24 | void GraphicOLED::g_write(uint8_t pat, int x, int y) { |
va009039 | 3:a6650dd2dbc8 | 25 | writeCommand(0x80 + (x&0x7f)); // x position |
va009039 | 3:a6650dd2dbc8 | 26 | writeCommand(0x40 + (y&0x01)); //y position |
va009039 | 0:67d983a1ed3e | 27 | writeData(pat); |
va009039 | 0:67d983a1ed3e | 28 | } |
va009039 | 0:67d983a1ed3e | 29 | |
va009039 | 3:a6650dd2dbc8 | 30 | void GraphicOLED::g_write(uint8_t *buf, int len, int x, int y) { |
va009039 | 3:a6650dd2dbc8 | 31 | for(int i = 0; i < len; i++) { |
va009039 | 3:a6650dd2dbc8 | 32 | g_write(*buf++, x++, y); |
va009039 | 0:67d983a1ed3e | 33 | } |
va009039 | 0:67d983a1ed3e | 34 | } |
va009039 | 0:67d983a1ed3e | 35 | |
va009039 | 2:337a2655f815 | 36 | void GraphicOLED::writeCommand(uint8_t command) { |
va009039 | 2:337a2655f815 | 37 | _rs = 0; |
va009039 | 2:337a2655f815 | 38 | writeByte(command); |
va009039 | 2:337a2655f815 | 39 | } |
va009039 | 2:337a2655f815 | 40 | |
va009039 | 2:337a2655f815 | 41 | void GraphicOLED::writeData(uint8_t data) { |
va009039 | 2:337a2655f815 | 42 | _rs = 1; |
va009039 | 2:337a2655f815 | 43 | writeByte(data); |
va009039 | 2:337a2655f815 | 44 | } |
va009039 | 2:337a2655f815 | 45 | |
va009039 | 2:337a2655f815 | 46 | void GraphicOLED::writeByte(uint8_t value) { |
va009039 | 2:337a2655f815 | 47 | _d = value >> 4; |
va009039 | 2:337a2655f815 | 48 | wait_us(40); // most instructions take 40us |
va009039 | 2:337a2655f815 | 49 | _e = 0; |
va009039 | 2:337a2655f815 | 50 | wait_us(40); |
va009039 | 2:337a2655f815 | 51 | _e = 1; |
va009039 | 2:337a2655f815 | 52 | _d = value >> 0; |
va009039 | 2:337a2655f815 | 53 | wait_us(40); |
va009039 | 2:337a2655f815 | 54 | _e = 0; |
va009039 | 2:337a2655f815 | 55 | wait_us(40); // most instructions take 40us |
va009039 | 2:337a2655f815 | 56 | _e = 1; |
va009039 | 2:337a2655f815 | 57 | } |
va009039 | 2:337a2655f815 | 58 | |
va009039 | 3:a6650dd2dbc8 | 59 | void GraphicOLED::cls() { |
va009039 | 3:a6650dd2dbc8 | 60 | for(int y = 0; y < rows(); y++) { |
va009039 | 0:67d983a1ed3e | 61 | for(int x = 0; x < 100; x++) { |
va009039 | 2:337a2655f815 | 62 | g_write(0x00, x, y); |
va009039 | 0:67d983a1ed3e | 63 | } |
va009039 | 0:67d983a1ed3e | 64 | } |
va009039 | 1:a104653979bf | 65 | locate(0,0); |
va009039 | 3:a6650dd2dbc8 | 66 | _uni_len = 0; |
va009039 | 0:67d983a1ed3e | 67 | } |
va009039 | 0:67d983a1ed3e | 68 | |
va009039 | 2:337a2655f815 | 69 | void GraphicOLED::locate(int column, int row) { |
va009039 | 2:337a2655f815 | 70 | _column = column; |
va009039 | 2:337a2655f815 | 71 | _row = row; |
va009039 | 2:337a2655f815 | 72 | } |
va009039 | 2:337a2655f815 | 73 | |
va009039 | 3:a6650dd2dbc8 | 74 | int GraphicOLED::columns() { |
va009039 | 3:a6650dd2dbc8 | 75 | return 25; |
va009039 | 3:a6650dd2dbc8 | 76 | } |
va009039 | 0:67d983a1ed3e | 77 | |
va009039 | 2:337a2655f815 | 78 | int GraphicOLED::rows() { |
va009039 | 2:337a2655f815 | 79 | return 2; |
va009039 | 2:337a2655f815 | 80 | } |
va009039 | 2:337a2655f815 | 81 | |
va009039 | 0:67d983a1ed3e | 82 | int GraphicOLED::_putc(int value) |
va009039 | 0:67d983a1ed3e | 83 | { |
va009039 | 3:a6650dd2dbc8 | 84 | int step = 0; |
va009039 | 0:67d983a1ed3e | 85 | if (value == '\n') { |
va009039 | 0:67d983a1ed3e | 86 | _column = 0; |
va009039 | 0:67d983a1ed3e | 87 | _row++; |
va009039 | 0:67d983a1ed3e | 88 | if (_row >= rows()) { |
va009039 | 0:67d983a1ed3e | 89 | _row = 0; |
va009039 | 0:67d983a1ed3e | 90 | } |
va009039 | 3:a6650dd2dbc8 | 91 | _uni_len = 0; |
va009039 | 3:a6650dd2dbc8 | 92 | } else if (value <= 0x7f) { |
va009039 | 3:a6650dd2dbc8 | 93 | step = character(_column, _row, value); |
va009039 | 3:a6650dd2dbc8 | 94 | } else if (value >= 0xc2 && value <= 0xdf) { |
va009039 | 3:a6650dd2dbc8 | 95 | _unicode = value & 0x1f; |
va009039 | 3:a6650dd2dbc8 | 96 | _uni_len = 1; |
va009039 | 3:a6650dd2dbc8 | 97 | } else if (value >= 0xe0 && value <= 0xef) { |
va009039 | 3:a6650dd2dbc8 | 98 | _unicode = value & 0x0f; |
va009039 | 3:a6650dd2dbc8 | 99 | _uni_len = 2; |
va009039 | 3:a6650dd2dbc8 | 100 | } else if (value >= 0xf0 && value <= 0xf7) { |
va009039 | 3:a6650dd2dbc8 | 101 | _unicode = value & 0x07; |
va009039 | 3:a6650dd2dbc8 | 102 | _uni_len = 3; |
va009039 | 3:a6650dd2dbc8 | 103 | } else if (value >= 0xf8 && value <= 0xfb) { |
va009039 | 3:a6650dd2dbc8 | 104 | _unicode = value & 0x03; |
va009039 | 3:a6650dd2dbc8 | 105 | _uni_len = 4; |
va009039 | 3:a6650dd2dbc8 | 106 | } else if (value >= 0xfc && value <= 0xfd) { |
va009039 | 3:a6650dd2dbc8 | 107 | _unicode = value & 0x01; |
va009039 | 3:a6650dd2dbc8 | 108 | _uni_len = 5; |
va009039 | 3:a6650dd2dbc8 | 109 | } else if (_uni_len >= 1 && value >= 0x80 && value <= 0xbf) { |
va009039 | 3:a6650dd2dbc8 | 110 | _unicode = (_unicode<<6) | (value&0x3f); |
va009039 | 3:a6650dd2dbc8 | 111 | if (--_uni_len == 0) { |
va009039 | 3:a6650dd2dbc8 | 112 | step = character(_column, _row, _unicode); |
va009039 | 3:a6650dd2dbc8 | 113 | } |
va009039 | 3:a6650dd2dbc8 | 114 | } else { |
va009039 | 3:a6650dd2dbc8 | 115 | _uni_len = 0; |
va009039 | 3:a6650dd2dbc8 | 116 | } |
va009039 | 3:a6650dd2dbc8 | 117 | if (step > 0) { |
va009039 | 3:a6650dd2dbc8 | 118 | _column += step; |
va009039 | 0:67d983a1ed3e | 119 | if (_column >= columns()) { |
va009039 | 0:67d983a1ed3e | 120 | _column = 0; |
va009039 | 3:a6650dd2dbc8 | 121 | if (++_row >= rows()) { |
va009039 | 0:67d983a1ed3e | 122 | _row = 0; |
va009039 | 0:67d983a1ed3e | 123 | } |
va009039 | 0:67d983a1ed3e | 124 | } |
va009039 | 3:a6650dd2dbc8 | 125 | _uni_len = 0; |
va009039 | 0:67d983a1ed3e | 126 | } |
va009039 | 0:67d983a1ed3e | 127 | return value; |
va009039 | 0:67d983a1ed3e | 128 | } |
va009039 | 0:67d983a1ed3e | 129 | |
va009039 | 2:337a2655f815 | 130 | int GraphicOLED::_getc() { |
va009039 | 2:337a2655f815 | 131 | return -1; |
va009039 | 2:337a2655f815 | 132 | } |
va009039 | 2:337a2655f815 | 133 | |
va009039 | 3:a6650dd2dbc8 | 134 | int GraphicOLED::character(int column, int row, int c) { |
va009039 | 3:a6650dd2dbc8 | 135 | if (c <= 0x7f) { // 半角 |
va009039 | 3:a6650dd2dbc8 | 136 | uint8_t buf[4]; |
va009039 | 3:a6650dd2dbc8 | 137 | font_4x8(buf, c); |
va009039 | 3:a6650dd2dbc8 | 138 | g_write(buf, sizeof(buf), column*4, row); |
va009039 | 3:a6650dd2dbc8 | 139 | return 1; |
va009039 | 3:a6650dd2dbc8 | 140 | } else if (c >= 0xff61 && c <= 0xff9f) { // 半角カタカナ |
va009039 | 3:a6650dd2dbc8 | 141 | int i = c - 0xff61 + 0xa1; |
va009039 | 3:a6650dd2dbc8 | 142 | uint8_t buf[4]; |
va009039 | 3:a6650dd2dbc8 | 143 | font_4x8(buf, i); |
va009039 | 3:a6650dd2dbc8 | 144 | g_write(buf, sizeof(buf), column*4, row); |
va009039 | 3:a6650dd2dbc8 | 145 | return 1; |
va009039 | 3:a6650dd2dbc8 | 146 | } else { // 全角 |
va009039 | 3:a6650dd2dbc8 | 147 | uint8_t buf[8]; |
va009039 | 3:a6650dd2dbc8 | 148 | font_8x8(buf, c); |
va009039 | 3:a6650dd2dbc8 | 149 | g_write(buf, sizeof(buf), column*4, row); |
va009039 | 3:a6650dd2dbc8 | 150 | return 2; |
va009039 | 0:67d983a1ed3e | 151 | } |
va009039 | 0:67d983a1ed3e | 152 | } |
va009039 | 0:67d983a1ed3e | 153 |