Graphic OLED 100x16 pixels interface

Dependents:   mbed_nicovideo_search_api mbed_recent_nicovideo_display_pub

/media/uploads/va009039/graphicoled_1.jpg

Committer:
va009039
Date:
Fri Mar 23 09:20:04 2012 +0000
Revision:
0:67d983a1ed3e
Child:
1:a104653979bf

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }