Arduino UNOとSSD1306に「46」12x24(反転表示)


Arduino UNOとSSD1306に「46」12x24(反転表示)

![o_cop540.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1db59a90-fb4e-5efe-e9de-4829fa452265.jpeg)

![o_cop539.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c38d7a22-1dc5-fb06-f5a6-287670116702.jpeg)


```c++


//OLED_SSD1306_BITMAP12x240_R_46_UNO

//ヘッダーファイル
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// ビットマップデータ
// 'soiya1', 128x320px
static const unsigned char PROGMEM databytes[] = {


// 'f12x24_0_9', 12x240px


// 'f12x24_0_9_R', 12x240px


  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0x80, 0x7b, 0xc0, 
  0x70, 0xc0, 0x60, 0xe0, 0x60, 0xe0, 0x60, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x60, 0xe0, 
  0x60, 0xe0, 0x60, 0xe0, 0x70, 0xc0, 0x7b, 0xc0, 0x3f, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0e, 0x00, 
  0x3e, 0x00, 0x3e, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 
  0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x3f, 0xc0, 0x3f, 0xc0, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0x73, 0xc0, 
  0x41, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x03, 0x80, 0x07, 0x00, 0x0f, 0x00, 
  0x1e, 0x00, 0x3c, 0x00, 0x38, 0x00, 0x7f, 0xe0, 0x7f, 0xe0, 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x7f, 0xc0, 0x73, 0xc0, 
  0x41, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x03, 0xc0, 0x0f, 0x00, 0x0f, 0x80, 0x01, 0xc0, 0x00, 0xc0, 
  0x00, 0xe0, 0x00, 0xc0, 0x41, 0xc0, 0x73, 0xc0, 0x7f, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, 0x07, 0x80, 
  0x0f, 0x80, 0x1d, 0x80, 0x1d, 0x80, 0x39, 0x80, 0x71, 0x80, 0xe1, 0x80, 0xff, 0xe0, 0xff, 0xe0, 
  0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x7f, 0xe0, 0x7f, 0xe0, 
  0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x7c, 0x00, 0x7f, 0x80, 0x7f, 0xc0, 0x01, 0xc0, 0x00, 0xc0, 
  0x00, 0xe0, 0x00, 0xc0, 0x41, 0xc0, 0x73, 0xc0, 0x7f, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x1f, 0xc0, 0x3c, 0xc0, 
  0x38, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x7f, 0xc0, 0xf9, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 
  0x60, 0xe0, 0x60, 0xe0, 0x70, 0xe0, 0x79, 0xc0, 0x3f, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x7f, 0xe0, 0x7f, 0xe0, 
  0x00, 0xe0, 0x01, 0xc0, 0x01, 0xc0, 0x03, 0x80, 0x03, 0x80, 0x07, 0x00, 0x07, 0x00, 0x0e, 0x00, 
  0x0e, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xc0, 0x79, 0xc0, 
  0x70, 0xe0, 0x70, 0xe0, 0x70, 0xe0, 0x78, 0xc0, 0x3f, 0x80, 0x3f, 0xc0, 0x73, 0xe0, 0x60, 0xe0, 
  0xe0, 0xe0, 0xe0, 0xe0, 0x70, 0xe0, 0x79, 0xe0, 0x3f, 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0x80, 0x7b, 0xc0, 
  0x71, 0xc0, 0x60, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x70, 0xe0, 0x79, 0xe0, 0x3f, 0xe0, 0x1f, 0xe0, 
  0x00, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x27, 0x80, 0x3f, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00




};


//初期化
void setup() {

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}//setup


//メインループ
void loop() {

  int ii;    //ループカウンター
  int c1000 = 1; //千の桁
  int c100  = 2;  //百の桁
  int c10   = 3;   //十の桁
  int c1    = 4;    //一の桁

  int x = 46; //数値


    if       ( x >= 9000 ) {x = x - 9000; c1000 = 9;
    } else if( x >= 8000 ) {x = x - 8000; c1000 = 8;
    } else if( x >= 7000 ) {x = x - 7000; c1000 = 7;
    } else if( x >= 6000 ) {x = x - 6000; c1000 = 6;
    } else if( x >= 5000 ) {x = x - 5000; c1000 = 5;
    } else if( x >= 4000 ) {x = x - 4000; c1000 = 4;
    } else if( x >= 3000 ) {x = x - 3000; c1000 = 3;
    } else if( x >= 2000 ) {x = x - 2000; c1000 = 2;
    } else if( x >= 1000 ) {x = x - 1000; c1000 = 1;
    } else                 {              c1000 = 0;
    }//if

  //031
  //10の割り算 0から1028までは、正しい。主に0から999
  //#define DIV10(n) ((n*205)>>11)

  //UNO
  //10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(X) ((((X>>5)*205)+(((X&0x1f)*205)>>5))>>6)

  c1   =  (  x - (DIV10(x) * 10)  );  // 3  <- 120 - 123
  x = DIV10(x);                       // 12 <= 123 / 10
  c10  =  (  x - (DIV10(x) * 10)  );  // 2  <- 12 - 10
  c100 =   DIV10(x);                  // 1  <- 12 / 10

  // 画面表示をクリア
  display.fillScreen(BLACK);


  //ビットマップの表示
  display.drawBitmap( 0, 0, databytes + (c1000 * (16 / 8) * 24), 12, 24,  WHITE);

  //ビットマップの表示
  display.drawBitmap(12, 0, databytes + ( c100 * (16 / 8) * 24), 12, 24,  WHITE);

  //ビットマップの表示
  display.drawBitmap(24, 0, databytes + (  c10 * (16 / 8) * 24), 12, 24,  WHITE);

  //ビットマップの表示
  display.drawBitmap(36, 0, databytes + (   c1 * (16 / 8) * 24), 12, 24,  WHITE);


  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000); //1秒待つ

}//loop


```