仕様
-
過去ログを見て?
-
L1からL8まで任意の値をセットして表示させる
-
L(ライン)1(番目)の事
-
0の時は、0番目の長さ8ビットラインを表示
-
指定された回数ループ、あとは、黒ループ
-
L1からL8までダイレクトこーでんぐ
-
コンパイルが速いのでArduino UNO rev3を使用
-
L1は、グローバルでint。(約7倍程度かかるがしゃない)
-
再表示関数で再表示
-
初期化は、魔法のコマンドを使用
-
9割がた出来たので酒のつまみ状態
-
メインの処理
//L1の回数分、ループする
for (int i = 0; i < (L1 + 1); i++) {
write_s(databytes_ON, 2); //0xFFの事
}//for i
for (int i = 0; i < ((128 - 1) - L1); i++) {
write_s(databytes_OFF, 2); //0x00の事
}//for i
結果
プログラム
//秋月のOLEDとアイテンドウのOLEDのアドレスは3C
//ssd1306_8ch_SoundLevelMeter_1_uno_1
//ヘッダー
#include <Arduino.h>
//#include <avr/pgmspace.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
int L1 = 0;
int L2 = 0;
int L3 = 0;
int L4 = 0;
int L5 = 0;
int L6 = 0;
int L7 = 0;
int L8 = 0;
//再表示
void display(void) {
//範囲の設定 (OLED内部のx,yカウンターを初期化してホームポジション0,0に)
setPageAddress(0, MAX_PAGE); // all pages
setColumnAddress(0, MAX_COL); // all columns
static uint8_t databytes_ON[2] = {DATA_MODE, 0xFF};
static uint8_t databytes_OFF[2] = {DATA_MODE, 0x00};
//L1の回数分、ループする
for (int i = 0; i < (L1 + 1); i++) {
write_s(databytes_ON, 2); //0xFFの事
}//for i
for (int i = 0; i < ((128 - 1) - L1); i++) {
write_s(databytes_OFF, 2); //0x00の事
}//for i
//L2の回数分、ループする
for (int i = 0; i < (L2 + 1); i++) {
write_s(databytes_ON, 2); //0xFFの事
}//for i
for (int i = 0; i < ((128 - 1) - L2); i++) {
write_s(databytes_OFF, 2); //0x00の事
}//for i
//L3の回数分、ループする
for (int i = 0; i < (L3 + 1); i++) {
write_s(databytes_ON, 2); //0xFFの事
}//for i
for (int i = 0; i < ((128 - 1) - L3); i++) {
write_s(databytes_OFF, 2); //0x00の事
}//for i
//L4の回数分、ループする
for (int i = 0; i < (L4 + 1); i++) {
write_s(databytes_ON, 2); //0xFFの事
}//for i
for (int i = 0; i < ((128 - 1) - L4); i++) {
write_s(databytes_OFF, 2); //0x00の事
}//for i
//L5の回数分、ループする
for (int i = 0; i < (L5 + 1); i++) {
write_s(databytes_ON, 2); //0xFFの事
}//for i
for (int i = 0; i < ((128 - 1) - L5); i++) {
write_s(databytes_OFF, 2); //0x00の事
}//for i
//L6の回数分、ループする
for (int i = 0; i < (L6 + 1); i++) {
write_s(databytes_ON, 2); //0xFFの事
}//for i
for (int i = 0; i < ((128 - 1) - L6); i++) {
write_s(databytes_OFF, 2); //0x00の事
}//for i
//L7の回数分、ループする
for (int i = 0; i < (L7 + 1); i++) {
write_s(databytes_ON, 2); //0xFFの事
}//for i
for (int i = 0; i < ((128 - 1) - L7); i++) {
write_s(databytes_OFF, 2); //0x00の事
}//for i
//L8の回数分、ループする
for (int i = 0; i < (L8 + 1); i++) {
write_s(databytes_ON, 2); //0xFFの事
}//for i
for (int i = 0; i < ((128 - 1) - L8); i++) {
write_s(databytes_OFF, 2); //0x00の事
}//for i
}//display
//SSD1306の初期化
void display_begin(void) {
//I2Cの初期化
//Wire.setSDA(A5); //SDA I2Cのポートの変更
//Wire.setSCL(A4); //SCL I2Cのポートの変更
Wire.begin(); //Arduino UNO Rev3
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() {
L1 = 64;
L2 = 64 + 8;
L3 = 64 + 8 + 8;
L4 = 64 + 8 + 8 + 8;
L5 = 64;
L6 = 64 - 8;
L7 = 64 - 8 - 8;
L8 = 64 - 8 - 8 - 8;
//再表示
display();
delay(1000); //1秒待つ
}//loop