Graphic OLED 100x16 pixels interface

Dependents:   mbed_nicovideo_search_api mbed_recent_nicovideo_display_pub

/media/uploads/va009039/graphicoled_1.jpg

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?

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