x かころぐをみよ
//秋月のOLEDとアイテンドウのOLEDのアドレスは3C
//ssd1306_Sound_Sprite_q1_S3_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
//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
//データの配列の定義
uint8_t databytes[2] = {DATA_MODE, 0x00};
int jjkk = 0;
int qq = 0;
//ドットを打つ
void Dot(int x, int y, int c) {
qq = qq >> 1;
qq = qq | ( c << 7);
jjkk++;
if ( jjkk >= 8 ) {
databytes[1] = qq;
write_s(databytes, 2);
qq = 0;
jjkk = 0;
}//end if
}//DOt
//スプライトの定義
char Sprite1[] = {
0x70, 0x88, 0x88, 0x88, 0xf8, 0x88, 0x88, 0x00, //'A'
0xf0, 0x88, 0x88, 0xf0, 0x88, 0x88, 0xf0, 0x00 //'B'
};
int ux1 = 0; int uy1 = 0;
int ux2 = 0; int uy2 = 0;
//再表示
void display(void) {
int y; int x;
int a; int b;
//範囲の設定 (OLED内部のx,yカウンターを初期化してホームポジション0,0に)
setPageAddress(0, MAX_PAGE); // all pages
setColumnAddress(0, MAX_COL); // all columns
for (int ii = 0; ii < 8192; ii++) {
//SSD1306のバッファーの配置順のxとyを求める
y = ((ii & 0b0001110000000000 ) >> 7) + ( ii & 0b0111);
x = (ii & 0b0000001111111000) >> 3;
a = 0; b = 0;
//スプライト2の表示
if ( (x + 1) > ux2 && x < (ux2 + 8) && (y + 1) > uy2 && y < (uy2 + 8) ) {
//相対座標からキャラクターパターンを求める
a = Sprite1[y - uy2 + 8 ] << (x - ux2);
a = a & 0x80;
}//ux1,uy1
if (a) { // a != 0
b = a;
}//end if
//スプライト1の表示
if ( (x + 1) > ux1 && x < (ux1 + 8) && (y + 1) > uy1 && y < (uy1 + 8) ) {
//相対座標からキャラクターパターンを求める
a = Sprite1[y - uy1 + 0 ] << (x - ux1);
a = a & 0x80;
}//ux1,uy1
if (a) { // a != 0
b = a;
}//end if
if (b != 0) {
Dot(x, y, 1); //黒のドットを打つ
} else {
Dot(x, y, 0); //白のドットを打つ
}//end if
}//for ii
}//display
//SSD1306の初期化
void display_begin(void) {
//I2Cの初期化
Wire.begin(); //C011
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();
ux1 = 8; uy1 = 8;
ux2 = 16; uy2 = 16;
//再表示
display();
for ( ux2 = 0; ux2 < 16; ux2++) {
//再表示
display();
}
}//setup
//メインループ
void loop() {
}//loop