C12832 LCD kanji interface.
Fork of GraphicOLED by
- 8×8 ドット日本語フォント「美咲フォント」
- misaki2cpp.py 美咲フォントをC++コードへ変換。
- app-board-LCD
GraphicOLED.cpp@0:67d983a1ed3e, 2012-03-23 (annotated)
- Committer:
- va009039
- Date:
- Fri Mar 23 09:20:04 2012 +0000
- Revision:
- 0:67d983a1ed3e
- Child:
- 1:a104653979bf
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 | 0:67d983a1ed3e | 5 | extern void font_4x8(char buf[], int i); |
va009039 | 0:67d983a1ed3e | 6 | extern void font_8x8(char buf[], int i); |
va009039 | 0:67d983a1ed3e | 7 | extern void font_8x8_sd(char buf[], int i); |
va009039 | 0:67d983a1ed3e | 8 | |
va009039 | 0:67d983a1ed3e | 9 | GraphicOLED::GraphicOLED(PinName rs, PinName e, PinName d0, PinName d1, PinName d2, PinName d3): |
va009039 | 0:67d983a1ed3e | 10 | TextLCD(rs, e, d0, d1, d2, d3) |
va009039 | 0:67d983a1ed3e | 11 | { |
va009039 | 0:67d983a1ed3e | 12 | wait_ms(500); // wait 500ms |
va009039 | 0:67d983a1ed3e | 13 | writeCommand(0x00); // 0x0 x 5 |
va009039 | 0:67d983a1ed3e | 14 | writeCommand(0x00); |
va009039 | 0:67d983a1ed3e | 15 | writeCommand(0x02); // function set |
va009039 | 0:67d983a1ed3e | 16 | writeCommand(0x28); // N=1 |
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 | 0:67d983a1ed3e | 20 | _kanji_flag = false; |
va009039 | 0:67d983a1ed3e | 21 | } |
va009039 | 0:67d983a1ed3e | 22 | |
va009039 | 0:67d983a1ed3e | 23 | void GraphicOLED::g_wrtie(int pat, int x, int y) |
va009039 | 0:67d983a1ed3e | 24 | { |
va009039 | 0:67d983a1ed3e | 25 | writeCommand(0x40+y); // y position |
va009039 | 0:67d983a1ed3e | 26 | writeCommand(0x80+x); // x position |
va009039 | 0:67d983a1ed3e | 27 | writeData(pat); |
va009039 | 0:67d983a1ed3e | 28 | } |
va009039 | 0:67d983a1ed3e | 29 | |
va009039 | 0:67d983a1ed3e | 30 | void GraphicOLED::g_wrtie(char *buf, int len, int x, int y) |
va009039 | 0:67d983a1ed3e | 31 | { |
va009039 | 0:67d983a1ed3e | 32 | writeCommand(0x40+y); // y position |
va009039 | 0:67d983a1ed3e | 33 | while(len-- > 0) { |
va009039 | 0:67d983a1ed3e | 34 | writeCommand(0x80 + x++); // x position |
va009039 | 0:67d983a1ed3e | 35 | writeData(*buf++); |
va009039 | 0:67d983a1ed3e | 36 | } |
va009039 | 0:67d983a1ed3e | 37 | } |
va009039 | 0:67d983a1ed3e | 38 | |
va009039 | 0:67d983a1ed3e | 39 | void GraphicOLED::cls() |
va009039 | 0:67d983a1ed3e | 40 | { |
va009039 | 0:67d983a1ed3e | 41 | for(int y = 0; y < 2; y++) { |
va009039 | 0:67d983a1ed3e | 42 | for(int x = 0; x < 100; x++) { |
va009039 | 0:67d983a1ed3e | 43 | g_wrtie(0x00, x, y); |
va009039 | 0:67d983a1ed3e | 44 | } |
va009039 | 0:67d983a1ed3e | 45 | } |
va009039 | 0:67d983a1ed3e | 46 | } |
va009039 | 0:67d983a1ed3e | 47 | |
va009039 | 0:67d983a1ed3e | 48 | int GraphicOLED::columns() { return 25; } |
va009039 | 0:67d983a1ed3e | 49 | |
va009039 | 0:67d983a1ed3e | 50 | int GraphicOLED::_putc(int value) |
va009039 | 0:67d983a1ed3e | 51 | { |
va009039 | 0:67d983a1ed3e | 52 | if (value == '\n') { |
va009039 | 0:67d983a1ed3e | 53 | _column = 0; |
va009039 | 0:67d983a1ed3e | 54 | _row++; |
va009039 | 0:67d983a1ed3e | 55 | if (_row >= rows()) { |
va009039 | 0:67d983a1ed3e | 56 | _row = 0; |
va009039 | 0:67d983a1ed3e | 57 | } |
va009039 | 0:67d983a1ed3e | 58 | _kanji_flag = false; |
va009039 | 0:67d983a1ed3e | 59 | } else if (_kanji_flag) { |
va009039 | 0:67d983a1ed3e | 60 | character2(_column, _row, _kanji_1st<<8 | value); |
va009039 | 0:67d983a1ed3e | 61 | _kanji_flag = false; |
va009039 | 0:67d983a1ed3e | 62 | _column += 2; |
va009039 | 0:67d983a1ed3e | 63 | if (_column >= columns()) { |
va009039 | 0:67d983a1ed3e | 64 | _column = 0; |
va009039 | 0:67d983a1ed3e | 65 | _row++; |
va009039 | 0:67d983a1ed3e | 66 | if (_row >= rows()) { |
va009039 | 0:67d983a1ed3e | 67 | _row = 0; |
va009039 | 0:67d983a1ed3e | 68 | } |
va009039 | 0:67d983a1ed3e | 69 | } |
va009039 | 0:67d983a1ed3e | 70 | } else if (iskanji(value)) { |
va009039 | 0:67d983a1ed3e | 71 | _kanji_1st = value; |
va009039 | 0:67d983a1ed3e | 72 | _kanji_flag = true; |
va009039 | 0:67d983a1ed3e | 73 | } else { |
va009039 | 0:67d983a1ed3e | 74 | character(_column, _row, value); |
va009039 | 0:67d983a1ed3e | 75 | _column++; |
va009039 | 0:67d983a1ed3e | 76 | if (_column >= columns()) { |
va009039 | 0:67d983a1ed3e | 77 | _column = 0; |
va009039 | 0:67d983a1ed3e | 78 | _row++; |
va009039 | 0:67d983a1ed3e | 79 | if (_row >= rows()) { |
va009039 | 0:67d983a1ed3e | 80 | _row = 0; |
va009039 | 0:67d983a1ed3e | 81 | } |
va009039 | 0:67d983a1ed3e | 82 | } |
va009039 | 0:67d983a1ed3e | 83 | } |
va009039 | 0:67d983a1ed3e | 84 | return value; |
va009039 | 0:67d983a1ed3e | 85 | } |
va009039 | 0:67d983a1ed3e | 86 | |
va009039 | 0:67d983a1ed3e | 87 | void GraphicOLED::character(int column, int row, int c) |
va009039 | 0:67d983a1ed3e | 88 | { |
va009039 | 0:67d983a1ed3e | 89 | int i = 0; |
va009039 | 0:67d983a1ed3e | 90 | if (c >= 0xa1 && c <= 0xdf) { |
va009039 | 0:67d983a1ed3e | 91 | i = c - 66; |
va009039 | 0:67d983a1ed3e | 92 | } else if (isprint(c)) { // 20 - 7e |
va009039 | 0:67d983a1ed3e | 93 | i = c - 32; |
va009039 | 0:67d983a1ed3e | 94 | } |
va009039 | 0:67d983a1ed3e | 95 | char buf[4]; |
va009039 | 0:67d983a1ed3e | 96 | font_4x8(buf, i); |
va009039 | 0:67d983a1ed3e | 97 | g_wrtie(buf, sizeof(buf), column*4, row); |
va009039 | 0:67d983a1ed3e | 98 | } |
va009039 | 0:67d983a1ed3e | 99 | |
va009039 | 0:67d983a1ed3e | 100 | void _jis(int *ph, int *pl) |
va009039 | 0:67d983a1ed3e | 101 | { |
va009039 | 0:67d983a1ed3e | 102 | if (*ph <= 0x9F) { |
va009039 | 0:67d983a1ed3e | 103 | if (*pl < 0x9F) *ph = (*ph << 1) - 0xE1; |
va009039 | 0:67d983a1ed3e | 104 | else *ph = (*ph << 1) - 0xE0; |
va009039 | 0:67d983a1ed3e | 105 | } else { |
va009039 | 0:67d983a1ed3e | 106 | if (*pl < 0x9F) *ph = (*ph << 1) - 0x161; |
va009039 | 0:67d983a1ed3e | 107 | else *ph = (*ph << 1) - 0x160; |
va009039 | 0:67d983a1ed3e | 108 | } |
va009039 | 0:67d983a1ed3e | 109 | if (*pl < 0x7F) *pl -= 0x1F; |
va009039 | 0:67d983a1ed3e | 110 | else if (*pl < 0x9F) *pl -= 0x20; |
va009039 | 0:67d983a1ed3e | 111 | else *pl -= 0x7E; |
va009039 | 0:67d983a1ed3e | 112 | } |
va009039 | 0:67d983a1ed3e | 113 | |
va009039 | 0:67d983a1ed3e | 114 | int _jis2adrs(int jiscode) |
va009039 | 0:67d983a1ed3e | 115 | { |
va009039 | 0:67d983a1ed3e | 116 | const int offset_table[][2] ={ |
va009039 | 0:67d983a1ed3e | 117 | {0x2121, 0}, {0x223a, 11}, {0x224a, 19}, {0x225c, 30}, {0x2272, 37}, {0x227e, 41}, {0x2330, 56}, |
va009039 | 0:67d983a1ed3e | 118 | {0x2341, 63}, {0x2361, 69}, {0x2421, 73}, {0x2521, 84}, {0x2621, 92}, {0x2641, 100}, {0x2721, 138}, |
va009039 | 0:67d983a1ed3e | 119 | {0x2751, 153}, {0x2821, 166}, {0x2d21, 604}, {0x2d40, 605}, {0x2d5f, 613}, {0x3021, 803}, |
va009039 | 0:67d983a1ed3e | 120 | {0x5021, 846}, {0x7ffff, 846}}; |
va009039 | 0:67d983a1ed3e | 121 | int ku = jiscode>>8; |
va009039 | 0:67d983a1ed3e | 122 | int ten = jiscode&0xff; |
va009039 | 0:67d983a1ed3e | 123 | int adrs = (ku-0x21) * (0x7e-0x21+1); |
va009039 | 0:67d983a1ed3e | 124 | adrs += (ten-0x21); |
va009039 | 0:67d983a1ed3e | 125 | for(int i = 0; ; i++) { // adjust |
va009039 | 0:67d983a1ed3e | 126 | if (jiscode >= offset_table[i][0] && jiscode < offset_table[i+1][0]) { |
va009039 | 0:67d983a1ed3e | 127 | adrs -= offset_table[i][1]; |
va009039 | 0:67d983a1ed3e | 128 | break; |
va009039 | 0:67d983a1ed3e | 129 | } |
va009039 | 0:67d983a1ed3e | 130 | } |
va009039 | 0:67d983a1ed3e | 131 | return adrs; |
va009039 | 0:67d983a1ed3e | 132 | } |
va009039 | 0:67d983a1ed3e | 133 | |
va009039 | 0:67d983a1ed3e | 134 | void GraphicOLED::character2(int column, int row, int c) |
va009039 | 0:67d983a1ed3e | 135 | { |
va009039 | 0:67d983a1ed3e | 136 | int h,l; |
va009039 | 0:67d983a1ed3e | 137 | h = c >> 8; |
va009039 | 0:67d983a1ed3e | 138 | l = c & 0xff; |
va009039 | 0:67d983a1ed3e | 139 | _jis(&h, &l); |
va009039 | 0:67d983a1ed3e | 140 | int adrs = _jis2adrs(h<<8 | l); |
va009039 | 0:67d983a1ed3e | 141 | char buf[8]; |
va009039 | 0:67d983a1ed3e | 142 | font_8x8(buf, adrs); |
va009039 | 0:67d983a1ed3e | 143 | g_wrtie(buf, sizeof(buf), column*4, row); |
va009039 | 0:67d983a1ed3e | 144 | } |