Graphic OLED 100x16 pixels interface

Dependents:   mbed_nicovideo_search_api mbed_recent_nicovideo_display_pub

/media/uploads/va009039/graphicoled_1.jpg

Committer:
va009039
Date:
Wed Apr 18 10:17:51 2012 +0000
Revision:
1:a104653979bf
Parent:
0:67d983a1ed3e
Child:
2:337a2655f815

        

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
va009039 1:a104653979bf 8 GraphicOLED::GraphicOLED(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7):
va009039 1:a104653979bf 9 TextLCD(rs, e, d4, d5, d6, d7)
va009039 0:67d983a1ed3e 10 {
va009039 0:67d983a1ed3e 11 wait_ms(500); // wait 500ms
va009039 0:67d983a1ed3e 12 writeCommand(0x00); // 0x0 x 5
va009039 0:67d983a1ed3e 13 writeCommand(0x00);
va009039 0:67d983a1ed3e 14 writeCommand(0x02); // function set
va009039 0:67d983a1ed3e 15 writeCommand(0x28); // N=1
va009039 0:67d983a1ed3e 16 writeCommand(0x0c); // D=1 display on
va009039 0:67d983a1ed3e 17 writeCommand(0x14); // S/C=0 R/L=1
va009039 0:67d983a1ed3e 18 writeCommand(0x1f); // G/C=1 graphic mode
va009039 0:67d983a1ed3e 19 _kanji_flag = false;
va009039 0:67d983a1ed3e 20 }
va009039 0:67d983a1ed3e 21
va009039 0:67d983a1ed3e 22 void GraphicOLED::g_wrtie(int pat, int x, int y)
va009039 0:67d983a1ed3e 23 {
va009039 0:67d983a1ed3e 24 writeCommand(0x40+y); // y position
va009039 0:67d983a1ed3e 25 writeCommand(0x80+x); // x position
va009039 0:67d983a1ed3e 26 writeData(pat);
va009039 0:67d983a1ed3e 27 }
va009039 0:67d983a1ed3e 28
va009039 0:67d983a1ed3e 29 void GraphicOLED::g_wrtie(char *buf, int len, int x, int y)
va009039 0:67d983a1ed3e 30 {
va009039 0:67d983a1ed3e 31 writeCommand(0x40+y); // y position
va009039 0:67d983a1ed3e 32 while(len-- > 0) {
va009039 0:67d983a1ed3e 33 writeCommand(0x80 + x++); // x position
va009039 0:67d983a1ed3e 34 writeData(*buf++);
va009039 0:67d983a1ed3e 35 }
va009039 0:67d983a1ed3e 36 }
va009039 0:67d983a1ed3e 37
va009039 0:67d983a1ed3e 38 void GraphicOLED::cls()
va009039 0:67d983a1ed3e 39 {
va009039 0:67d983a1ed3e 40 for(int y = 0; y < 2; y++) {
va009039 0:67d983a1ed3e 41 for(int x = 0; x < 100; x++) {
va009039 0:67d983a1ed3e 42 g_wrtie(0x00, x, y);
va009039 0:67d983a1ed3e 43 }
va009039 0:67d983a1ed3e 44 }
va009039 1:a104653979bf 45 locate(0,0);
va009039 1:a104653979bf 46 _kanji_flag = false;
va009039 0:67d983a1ed3e 47 }
va009039 0:67d983a1ed3e 48
va009039 0:67d983a1ed3e 49 int GraphicOLED::columns() { return 25; }
va009039 0:67d983a1ed3e 50
va009039 0:67d983a1ed3e 51 int GraphicOLED::_putc(int value)
va009039 0:67d983a1ed3e 52 {
va009039 0:67d983a1ed3e 53 if (value == '\n') {
va009039 0:67d983a1ed3e 54 _column = 0;
va009039 0:67d983a1ed3e 55 _row++;
va009039 0:67d983a1ed3e 56 if (_row >= rows()) {
va009039 0:67d983a1ed3e 57 _row = 0;
va009039 0:67d983a1ed3e 58 }
va009039 0:67d983a1ed3e 59 _kanji_flag = false;
va009039 0:67d983a1ed3e 60 } else if (_kanji_flag) {
va009039 0:67d983a1ed3e 61 character2(_column, _row, _kanji_1st<<8 | value);
va009039 0:67d983a1ed3e 62 _kanji_flag = false;
va009039 0:67d983a1ed3e 63 _column += 2;
va009039 0:67d983a1ed3e 64 if (_column >= columns()) {
va009039 0:67d983a1ed3e 65 _column = 0;
va009039 0:67d983a1ed3e 66 _row++;
va009039 0:67d983a1ed3e 67 if (_row >= rows()) {
va009039 0:67d983a1ed3e 68 _row = 0;
va009039 0:67d983a1ed3e 69 }
va009039 0:67d983a1ed3e 70 }
va009039 0:67d983a1ed3e 71 } else if (iskanji(value)) {
va009039 0:67d983a1ed3e 72 _kanji_1st = value;
va009039 0:67d983a1ed3e 73 _kanji_flag = true;
va009039 0:67d983a1ed3e 74 } else {
va009039 0:67d983a1ed3e 75 character(_column, _row, value);
va009039 0:67d983a1ed3e 76 _column++;
va009039 0:67d983a1ed3e 77 if (_column >= columns()) {
va009039 0:67d983a1ed3e 78 _column = 0;
va009039 0:67d983a1ed3e 79 _row++;
va009039 0:67d983a1ed3e 80 if (_row >= rows()) {
va009039 0:67d983a1ed3e 81 _row = 0;
va009039 0:67d983a1ed3e 82 }
va009039 0:67d983a1ed3e 83 }
va009039 0:67d983a1ed3e 84 }
va009039 0:67d983a1ed3e 85 return value;
va009039 0:67d983a1ed3e 86 }
va009039 0:67d983a1ed3e 87
va009039 0:67d983a1ed3e 88 void GraphicOLED::character(int column, int row, int c)
va009039 0:67d983a1ed3e 89 {
va009039 0:67d983a1ed3e 90 int i = 0;
va009039 0:67d983a1ed3e 91 if (c >= 0xa1 && c <= 0xdf) {
va009039 0:67d983a1ed3e 92 i = c - 66;
va009039 0:67d983a1ed3e 93 } else if (isprint(c)) { // 20 - 7e
va009039 0:67d983a1ed3e 94 i = c - 32;
va009039 0:67d983a1ed3e 95 }
va009039 0:67d983a1ed3e 96 char buf[4];
va009039 0:67d983a1ed3e 97 font_4x8(buf, i);
va009039 0:67d983a1ed3e 98 g_wrtie(buf, sizeof(buf), column*4, row);
va009039 0:67d983a1ed3e 99 }
va009039 0:67d983a1ed3e 100
va009039 0:67d983a1ed3e 101 void _jis(int *ph, int *pl)
va009039 0:67d983a1ed3e 102 {
va009039 0:67d983a1ed3e 103 if (*ph <= 0x9F) {
va009039 0:67d983a1ed3e 104 if (*pl < 0x9F) *ph = (*ph << 1) - 0xE1;
va009039 0:67d983a1ed3e 105 else *ph = (*ph << 1) - 0xE0;
va009039 0:67d983a1ed3e 106 } else {
va009039 0:67d983a1ed3e 107 if (*pl < 0x9F) *ph = (*ph << 1) - 0x161;
va009039 0:67d983a1ed3e 108 else *ph = (*ph << 1) - 0x160;
va009039 0:67d983a1ed3e 109 }
va009039 0:67d983a1ed3e 110 if (*pl < 0x7F) *pl -= 0x1F;
va009039 0:67d983a1ed3e 111 else if (*pl < 0x9F) *pl -= 0x20;
va009039 0:67d983a1ed3e 112 else *pl -= 0x7E;
va009039 0:67d983a1ed3e 113 }
va009039 0:67d983a1ed3e 114
va009039 0:67d983a1ed3e 115 int _jis2adrs(int jiscode)
va009039 0:67d983a1ed3e 116 {
va009039 0:67d983a1ed3e 117 const int offset_table[][2] ={
va009039 0:67d983a1ed3e 118 {0x2121, 0}, {0x223a, 11}, {0x224a, 19}, {0x225c, 30}, {0x2272, 37}, {0x227e, 41}, {0x2330, 56},
va009039 0:67d983a1ed3e 119 {0x2341, 63}, {0x2361, 69}, {0x2421, 73}, {0x2521, 84}, {0x2621, 92}, {0x2641, 100}, {0x2721, 138},
va009039 0:67d983a1ed3e 120 {0x2751, 153}, {0x2821, 166}, {0x2d21, 604}, {0x2d40, 605}, {0x2d5f, 613}, {0x3021, 803},
va009039 0:67d983a1ed3e 121 {0x5021, 846}, {0x7ffff, 846}};
va009039 0:67d983a1ed3e 122 int ku = jiscode>>8;
va009039 0:67d983a1ed3e 123 int ten = jiscode&0xff;
va009039 0:67d983a1ed3e 124 int adrs = (ku-0x21) * (0x7e-0x21+1);
va009039 0:67d983a1ed3e 125 adrs += (ten-0x21);
va009039 0:67d983a1ed3e 126 for(int i = 0; ; i++) { // adjust
va009039 0:67d983a1ed3e 127 if (jiscode >= offset_table[i][0] && jiscode < offset_table[i+1][0]) {
va009039 0:67d983a1ed3e 128 adrs -= offset_table[i][1];
va009039 0:67d983a1ed3e 129 break;
va009039 0:67d983a1ed3e 130 }
va009039 0:67d983a1ed3e 131 }
va009039 0:67d983a1ed3e 132 return adrs;
va009039 0:67d983a1ed3e 133 }
va009039 0:67d983a1ed3e 134
va009039 0:67d983a1ed3e 135 void GraphicOLED::character2(int column, int row, int c)
va009039 0:67d983a1ed3e 136 {
va009039 0:67d983a1ed3e 137 int h,l;
va009039 0:67d983a1ed3e 138 h = c >> 8;
va009039 0:67d983a1ed3e 139 l = c & 0xff;
va009039 0:67d983a1ed3e 140 _jis(&h, &l);
va009039 0:67d983a1ed3e 141 int adrs = _jis2adrs(h<<8 | l);
va009039 0:67d983a1ed3e 142 char buf[8];
va009039 0:67d983a1ed3e 143 font_8x8(buf, adrs);
va009039 0:67d983a1ed3e 144 g_wrtie(buf, sizeof(buf), column*4, row);
va009039 0:67d983a1ed3e 145 }