Graphic OLED 100x16 pixels interface

Dependents:   mbed_nicovideo_search_api mbed_recent_nicovideo_display_pub

/media/uploads/va009039/graphicoled_1.jpg

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?

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