//秋月のOLEDとアイテンドウのOLEDのアドレスは3C
//SSD1306_all_128x64_H_C0116_1
//ヘッダー
#include <Arduino.h>
#include <Wire.h>
//定義
#define MAX_PAGE (7)
#define MAX_COL (127)
#define COMMAND_MODE 0x80 // continuation bit is set!
#define DATA_MODE 0x40
#define SET_COLUMN_ADDRESS 0x21 // takes two bytes, start address and end address of display data RAM
#define SET_PAGE_ADDRESS 0x22 // takes two bytes, start address and end address of display data RAM
#define SET_MEMORY_ADDRESSING_MODE 0x20 // takes one byte as given above
#define HORIZONTAL_ADDRESSING_MODE 0x00
// ビットマップデータ
// 'kao_1', 128x64px
static const unsigned char PROGMEM kao_1[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xcf, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x00, 0x07, 0xf8, 0x00, 0x07, 0xff, 0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0xff,
0xe0, 0x30, 0x00, 0x07, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0xff,
0x00, 0x30, 0x03, 0xe7, 0x00, 0x07, 0xff, 0xff, 0xfe, 0x03, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0xff,
0x00, 0x31, 0xf3, 0xe7, 0xff, 0x87, 0xff, 0xc0, 0x00, 0x01, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0xff,
0x01, 0xf1, 0xf3, 0xe7, 0xff, 0x07, 0xff, 0xc0, 0x00, 0x01, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0xff,
0xe1, 0xf1, 0xf3, 0xe7, 0xfc, 0x1f, 0x8f, 0xc0, 0x00, 0x01, 0x1f, 0xf0, 0xff, 0x80, 0x00, 0x01,
0xe1, 0xf1, 0xf0, 0x07, 0xf8, 0xff, 0x0f, 0xc0, 0x3f, 0xe1, 0x1f, 0xf0, 0xc0, 0x00, 0x00, 0x00,
0xe1, 0xf0, 0x00, 0x07, 0xe0, 0xfc, 0x0f, 0xff, 0xff, 0xe1, 0x1f, 0xf0, 0xc0, 0x00, 0x00, 0x00,
0xe1, 0xf0, 0x00, 0xe7, 0xe1, 0xf8, 0x1f, 0xff, 0xff, 0xe1, 0x1f, 0xf0, 0xc0, 0x00, 0x3f, 0xc1,
0xe1, 0xf9, 0xf3, 0xe7, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xc1, 0x1f, 0xf0, 0xe1, 0xff, 0xff, 0xc3,
0xe0, 0x39, 0xf3, 0xe7, 0xf0, 0x01, 0xff, 0xff, 0xff, 0xc1, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0x87,
0x00, 0x39, 0xf3, 0xc7, 0xfe, 0x03, 0xc7, 0xff, 0xff, 0xc3, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0x07,
0x00, 0x39, 0xf3, 0x07, 0xfe, 0x0f, 0xc3, 0xff, 0xff, 0x83, 0x1f, 0xf0, 0xff, 0xff, 0xfe, 0x0f,
0x01, 0xf8, 0x00, 0x07, 0xf8, 0x3f, 0xc1, 0xff, 0xff, 0x07, 0x1f, 0xf0, 0xff, 0xff, 0xfc, 0x1f,
0xe1, 0xf8, 0x00, 0x07, 0xf0, 0x7f, 0xe0, 0xff, 0xff, 0x07, 0x1f, 0xf0, 0xff, 0xe7, 0xfc, 0x3f,
0xe1, 0xf8, 0x03, 0xc7, 0xc1, 0xfc, 0x00, 0x7f, 0xff, 0x0f, 0x1f, 0xf0, 0xff, 0xc3, 0xf0, 0xff,
0xe1, 0xf9, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x0f, 0xff, 0xf0, 0xff, 0xe1, 0xe1, 0xff,
0xe1, 0xff, 0xe3, 0xff, 0x00, 0x00, 0x3c, 0x7f, 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xf0, 0xc1, 0xff,
0xe1, 0xff, 0xe3, 0xff, 0x0c, 0x00, 0x3e, 0x7f, 0xf8, 0x1f, 0xff, 0xf0, 0xff, 0xf0, 0x07, 0xff,
0xe0, 0x30, 0x00, 0x03, 0xff, 0xc1, 0xfe, 0x7f, 0xf8, 0x3f, 0xff, 0xf0, 0xff, 0xfc, 0x0f, 0xff,
0xe0, 0x30, 0x00, 0x03, 0xf1, 0xc1, 0xcf, 0xff, 0xf0, 0xff, 0xff, 0xf1, 0xff, 0xfe, 0x0f, 0xff,
0x80, 0xf0, 0x00, 0x03, 0xe1, 0xc1, 0xc7, 0xff, 0xe0, 0xff, 0xff, 0xe1, 0xff, 0xff, 0x0f, 0xff,
0x01, 0xff, 0xe3, 0xff, 0xe1, 0xc1, 0xe3, 0xff, 0xc1, 0xff, 0xff, 0xe3, 0xff, 0xff, 0x07, 0xff,
0x0f, 0xff, 0xe3, 0xff, 0xc3, 0xc1, 0xf0, 0xff, 0x03, 0xff, 0xff, 0xc3, 0xff, 0xff, 0x83, 0xff,
0x3f, 0xff, 0xe3, 0xff, 0x87, 0xc1, 0xf8, 0x7c, 0x0f, 0xff, 0xff, 0x87, 0xff, 0xff, 0xc3, 0xff,
0xff, 0xff, 0xe3, 0xff, 0x0f, 0xc1, 0xf8, 0x38, 0x1f, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xe3, 0xff,
0xff, 0xc0, 0x00, 0x01, 0x1f, 0xc1, 0xfc, 0x38, 0x7f, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xc0, 0x00, 0x01, 0x3f, 0xc1, 0xfe, 0x3d, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xc0, 0x00, 0x01, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
//I2Cに配列を転送する
void write_s(uint8_t *str1, uint8_t len1) {
Wire.beginTransmission(0x3c);
for (int ii = 0; ii < len1; ii++) {
//一文字出力
Wire.write(*str1++);
} //for
Wire.endTransmission();
} //write_s
//セットページアドレス
void setPageAddress(uint8_t start, uint8_t end) {
uint8_t databytes[6] = { COMMAND_MODE, SET_PAGE_ADDRESS, COMMAND_MODE, start, COMMAND_MODE, end };
write_s(databytes, 6);
} //setPageAddress
//セットカラムアクセス
void setColumnAddress(uint8_t start, uint8_t end) {
uint8_t databytes[6] = { COMMAND_MODE, SET_COLUMN_ADDRESS, COMMAND_MODE, start, COMMAND_MODE, end };
write_s(databytes, 6);
} //setColumnAddress
//セットメモリーアドレシングモード
void setMemoryAddressingMode() {
uint8_t databytes[4] = { COMMAND_MODE, SET_MEMORY_ADDRESSING_MODE, COMMAND_MODE, HORIZONTAL_ADDRESSING_MODE };
write_s(databytes, 4);
} //setMemoryAddressingMode
//ドットを打つ
void Dot(int x, int y, int c) {
//データの配列の定義
static uint8_t databytes[2] = { DATA_MODE, 0x00 };
static int qq = 0; //一時
qq = qq | (c << (y & 0x07));
if ((y & 0x07) == 7) { //1バイト分、貯まったら
databytes[1] = qq;
qq = 0;
write_s(databytes, 2); //I2Cに1バイト書き出す
} //endif
} //Dot
//再表示
void display(void) {
//範囲の設定 (OLED内部のx,yカウンターを初期化してホームポジション0,0に)
setPageAddress(0, MAX_PAGE); // all pages
setColumnAddress(0, MAX_COL); // all columns
// x × y の回数分、ループする
int y, x, dot_1;
for (int ii = 0; ii < 8192; ii++) {
//SSD1306のバッファーの配置順のxとyを求める
y = ((ii & 0b0001110000000000) >> 7) | (ii & 0b0111);
x = (ii & 0b0000001111111000) >> 3;
//↓開始 「デカ文字」のメイン処理
dot_1 = (kao_1[(y * (128 / 8)) + (x / 8)] >> (7 - (x & 7))) & 1;
//↑終了
if (dot_1 != 0) {
Dot(x, y, 0); //黒のドットを打つ
} else {
Dot(x, y, 1); //白のドットを打つ
} //endif
} //for ii
} //display
//SSD1306の初期化
void display_begin(void) {
//I2Cの初期化
Wire.begin(); //c0116
delay(200);
//SSD1306の初期化スペル(魔法)
//0x80,0x8D,0x80,0x14,0x80,0xAF
write_s((uint8_t *)"\200\215\200\024\200\257", 6);
delay(100);
//セットメモリーアドレシングモード (画面の終端に来たら画面の先頭に)
setMemoryAddressingMode();
} //display_begin
//初期化
void setup() {
//SSD1306の初期化
display_begin();
//再表示
display();
} //setup
//メインループ
void loop() {
delay(3); //ダミー
} //loop