「液晶128x160」ST7735S(Parallel)を使用して時計を作って遊ぶ(Arduino UNO)(ブロック)



参考　ST7735(パラレル)で遊ぶ まとめ(リンク集)

↓クリック↓


https://qiita.com/caa45040/items/4a66c0a0c9e78b73d043


↑クリック↑


x あまり正確でない
x 時間合わせは、別
x 過去ログを見ょ!!!

目的
低性能(小規模マイコン)で300円程度の液晶を使って時計を作って遊ぶ。

結果

![o_coq118.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/968977db-d93c-4595-483c-9326b3b606b4.jpeg)

●カラーアトリビュートが次の設定の時

```c++

  //colorアトリビュートの設定
  //1行目 時
  c_att[0][0] = 0xF800; //H
  c_att[0][1] = 0x07E0; //0 時 上位
  c_att[0][2] = 0x04f0; //1 時 下位

  //2行目 分
  c_att[1][0] = 0xF800; //M
  c_att[1][1] = 0x07E0; //2 分 上位
  c_att[1][2] = 0x04f0; //3 分 下位

```

![o_coq121.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/46377830-495b-0889-b558-e64610d3de98.jpeg)



![o_coq117.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7f2d70e6-2163-1ee9-1dd0-b7ec4308de12.jpeg)

![o_coq115.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/67371647-eaa6-9ffd-8a54-3207bed6e017.jpeg)


参考　各自、データシートとプログラムを参照せよ

![o_coq119.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d23a5ba0-5486-6d35-ae07-298c544f3fbe.jpeg)

![o_cop525.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0b587cd9-60df-8273-d2c9-43daad569227.jpeg)

![o_cop518.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/777eccce-d1db-4f97-bfc7-ba7d22ed57ba.jpeg)


![o_coq120.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e3f7fda0-f48b-91e7-1dab-de39933490cb.jpeg)


プログラム




```c++



//ssd1306_block_0123456789_UNO_7

//バージョン管理
//V3 3以前　いろいろ
//V4 キャラクターRAMの0対応
//V5 デファインのピン名を名前から仮名化
//V6 ブロックパターンRAMのカラー化
//V7 カーラーアトリビュートRAM


//インクルド
#include <Arduino.h>
#include <Wire.h>   //I2C


//定義
//GPIO
#define GPIO_RESET_P  2 //RESET=1
#define GPIO_RS_P    A3 //RS=0
#define GPIO_WR_P     3 //WR=1
#define GPIO_RD_P    A2 //RD=1

#define GPIO_DB7      8
#define GPIO_DB6      7
#define GPIO_DB5      9
#define GPIO_DB4      6
#define GPIO_DB3     A0
#define GPIO_DB2      5
#define GPIO_DB1     A1
#define GPIO_DB0      4

// GPIO A4 I2Cで使用済み
// GPIO A5 I2Cで使用済み

#define GPIO1(s) digitalWrite(GPIO_RESET_P , s)  //RESET
#define GPIO2(s) digitalWrite(GPIO_RS_P    , s)  //A0
#define GPIO3(s) digitalWrite(GPIO_WR_P    , s)  //WR
#define GPIO4(s) digitalWrite(GPIO_RD_P    , s)  //RD

//全体のカラー
int s_color = 0xFFFF; //ハイホワイト

//パターンRAM 16x20ドット
int s_dot[20][16];

//キャラクターRAM 3x2文字
char st_p[2][3] = {
  {' ', '4', '6'},
  {'1', '2',  0 }
};

//colorアトリビュートRAM 3x2文字
int c_att[2][3] = {
  {0xFFFF, 0xFFFF, 0xFFFF},
  {0xFFFF, 0xFFFF, 0xFFFF }
};

//1234567890
uint8_t ch_data7[8 * (10 + 2)] = {
  0x70, 0x88, 0x98, 0xa8, 0xc8, 0x70, 0x00, 0x00, //( 48) 0
  0x10, 0x30, 0x50, 0x10, 0x10, 0x10, 0x00, 0x00, //( 49) 1
  0x70, 0x88, 0x08, 0x30, 0x40, 0xf8, 0x00, 0x00, //( 50) 2
  0x70, 0x88, 0x30, 0x08, 0x88, 0x70, 0x00, 0x00, //( 51) 3
  0x18, 0x28, 0x48, 0x88, 0xf8, 0x08, 0x00, 0x00, //( 52) 4
  0xf8, 0x80, 0xf0, 0x08, 0x08, 0xf0, 0x00, 0x00, //( 53) 5
  0x78, 0x80, 0xf0, 0x88, 0x88, 0x70, 0x00, 0x00, //( 54) 6
  0xf8, 0x08, 0x10, 0x20, 0x20, 0x20, 0x00, 0x00, //( 55) 7
  0x70, 0x88, 0x70, 0x88, 0x88, 0x70, 0x00, 0x00, //( 56) 8
  0x70, 0x88, 0x78, 0x08, 0x88, 0x70, 0x00, 0x00, //( 57) 9
  0x88, 0x88, 0xf8, 0x88, 0x88, 0x88, 0x00, 0x00, //( 72) H
  0x88, 0xd8, 0xa8, 0x88, 0x88, 0x88, 0x00, 0x00  //( 77) M
};


//パラレルポートにデータをセットする。
void GPIO_8BIT(int s)
{
  digitalWrite(GPIO_DB7, (s >> 7) & 0x01); //DB7
  digitalWrite(GPIO_DB6, (s >> 6) & 0x01); //DB6
  digitalWrite(GPIO_DB5, (s >> 5) & 0x01); //DB5
  digitalWrite(GPIO_DB4, (s >> 4) & 0x01); //DB4
  digitalWrite(GPIO_DB3, (s >> 3) & 0x01); //DB3
  digitalWrite(GPIO_DB2, (s >> 2) & 0x01); //DB2
  digitalWrite(GPIO_DB1, (s >> 1) & 0x01); //DB1
  digitalWrite(GPIO_DB0,  s       & 0x01); //DB0
} //GPIO_8BIT

//コマンドの書き込み
void LCD_Write_CMD(int a)
{
  GPIO2(0); //A0=0;
  GPIO_8BIT(a);//P1=a; data
  GPIO3(0);//WRB=0;
  GPIO3(1);//WRB=1;
} //LCD_Write_CMD


//データ書き込み
void LCD_Write_Data(int a)
{
  GPIO2(1);//A0=1;
  GPIO_8BIT(a);//P1=a; data
  GPIO3(0);//WRB=0;
  GPIO3(1);//WRB=1;
} //LCD_Write_Data


//液晶の初期化処理
void ATM0177B5_ST7735S_Init(void)
{

  //----------  ST7735S Reset Sequence  --------//

  GPIO1(1);//LCD_RESET=1;

  delay(1); //Delay 1ms

  GPIO1(0);//LCD_RESET=0;

  delay(1); //Delay 1ms

  GPIO1(1);//LCD_RESET=1;

  delay(120); //Delay 120ms

  //----------  ST7735S Reset Sequence  --------//


  LCD_Write_CMD(0x01);//SOFTWARE RESET
  delay(50);

  LCD_Write_CMD(0x11);//SLEEP OUT
  delay(200);

  LCD_Write_CMD(0x29);//display on
  delay(100);

  LCD_Write_CMD(0x3a);//Interface pixel format
  LCD_Write_Data(0x05);//16bit mode
  delay(100);

  LCD_Write_CMD(0x36);//RGB-RGR format
  LCD_Write_Data(0x08);//RGB mode
  delay(100);

  // y,x パターンRAMの初期化
  for (int y = 0; y < 20; y++) {
    for (int x = 0; x < 16; x++) {
      s_dot[y][x] = 0;
    }//for x
  }//for y

} //ATM0177B5_ST7735S_Init


//全体のカラーの変更
void set_color(int color) {

  s_color = color;

}//set_color


//キャラクターRAMの内容をパターンRAMに描画
void c_ram_refresh() {

  int p; //一時領域
  for (int jj = 0; jj < 2; jj++) { //行のループ
    for (int ii = 0; ii < 3; ii++) { //列のループ

      if ( st_p[jj][ii] != ' ' && st_p[jj][ii] != 0 ) { //空白以外

        //キャラクターの描画
        for (int y = 0; y < 6; y++) {
          p = ch_data7[ (  ( st_p[jj][ii] - '0' )   * 8) + y ];
          for (int x = 0; x < 5; x++) {
            s_dot[x + (ii * 6) + 1][(14 - (jj * 7)) - y]
              =  ((p & 0x80) == 0) ? 0 : c_att[jj][ii];
            p = p << 1;
          }//for x
        }//for y

      } else { //空白の場合

        //空白の描画
        for (int y = 0; y < 6; y++) {
          for (int x = 0; x < 5; x++) {
            s_dot[x + (ii * 6) + 1][(14 - (jj * 7)) - y] =  0;
          }//for x
        }//for y

      }//end if

    }//for ii
  }//for jj

}//c_ram_refresh


//パターンRAMの内容を液晶に転送
void p_ram_refresh() {

  //カラーの上位と下位と一時
  int color_h;
  int color_l;
  int color_vel;

  //画面の書き込み開始
  LCD_Write_CMD(0x2C); //memory write
  GPIO2(1);//A0=1;
  delay(2);

  for (int y = 0; y < 20; y++) {
    for (int k = 0; k < 7; k++) {
      for (int x = 0; x < 16; x++) {
        for (int i = 0; i < 7; i++) {
          color_vel = s_dot[y][x];
          if ( color_vel != 0) {//ドットがあり
            color_h = (color_vel >> 8) & 0xff;
            color_l =  color_vel       & 0xff;
            
            GPIO_8BIT( color_h );//P1=a; data
            GPIO3(0);//WRB=0;
            GPIO3(1);//WRB=1;

            GPIO_8BIT( color_l );//P1=a; data
            GPIO3(0);//WRB=0;
            GPIO3(1);//WRB=1;
          } else {//ドットがなし
            GPIO_8BIT(0x00);//P1=a; data
            GPIO3(0);//WRB=0;
            GPIO3(1);//WRB=1;

            GPIO3(0);//WRB=0;
            GPIO3(1);//WRB=1;
          }//end if
        }//for 8
        GPIO_8BIT(0x00);//P1=a; data

        GPIO3(0);//WRB=0;
        GPIO3(1);//WRB=1;

        GPIO3(0);//WRB=0;
        GPIO3(1);//WRB=1;
      }//for 16
    }//for 7
    for (int i = 0; i < 128; i++) {//空白を1ライン引く
      GPIO3(0);//WRB=0;
      GPIO3(1);//WRB=1;

      GPIO3(0);//WRB=0;
      GPIO3(1);//WRB=1;
    }//for i
  }//for tt

}//p_ram_refresh


//リフレッシュ(画像の再表示)
void refresh() {

  c_ram_refresh();//キャラクターRAMの反映
  p_ram_refresh();//パターンRAMの反映

}//refresh


//初期化
void setup() {

  //i2cの初期化処理
  Wire.begin(); // 13 15 M5S3

  //ポートのモード設定
  //アウトプットモード
  pinMode(GPIO_RESET_P, OUTPUT); //REST
  pinMode(GPIO_RS_P,    OUTPUT); //RS
  pinMode(GPIO_WR_P,    OUTPUT); //WR
  pinMode(GPIO_RD_P,    OUTPUT); //RD

  pinMode(GPIO_DB0, OUTPUT); //DB0
  pinMode(GPIO_DB1, OUTPUT); //DB1
  pinMode(GPIO_DB2, OUTPUT); //DB2
  pinMode(GPIO_DB3, OUTPUT); //DB3

  pinMode(GPIO_DB4, OUTPUT); //DB4
  pinMode(GPIO_DB5, OUTPUT); //DB5
  pinMode(GPIO_DB6, OUTPUT); //DB6
  pinMode(GPIO_DB7, OUTPUT); //DB7

  //ポートの初期化
  GPIO4(1);//RD=1
  GPIO3(0);//WR=0
  GPIO2(0);//RS=0
  GPIO1(1);//RESET=1

  delay(500); //0.5秒待つ

  //液晶の初期化処理
  ATM0177B5_ST7735S_Init();

} //setup


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

//RTCの開始　↓

  //RTC DS1307のアドレス
#define ADDR    0x68    // 2進数 1101000

  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(1);

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);

  // 8byteのデータを取得する
  unsigned char data_read[16] = {0x88, 0x88, 0x88}; //データバッファー
  int ii = 0;
  while (Wire.available())  {   // 要求より短いデータが来る可能性あり
    data_read[ii++] = Wire.read();       // 1バイトを受信
  }//while

//RTCの終了　↑

  //dbug [2]は、時間　[1]は、分
  //unsigned char data_read[16];
  //data_read[2] = 0x01; data_read[1] = 0x23;

  //表示変換する
  //1行目 時
  st_p[0][0] = ':'; //H
  st_p[0][1] = '0' + (data_read[2] >> 4);  //0 時 上位
  st_p[0][2] = '0' + (data_read[2] & 0xf); //1 時 下位

  //2行目 分
  st_p[1][0] = ';'; //M
  st_p[1][1] = '0' + (data_read[1] >> 4);  //2 分 上位
  st_p[1][2] = '0' + (data_read[1] & 0xf); //3 分 下位

  //colorアトリビュートの設定
  //1行目 時
  c_att[0][0] = s_color; //H
  c_att[0][1] = s_color; //0 時 上位
  c_att[0][2] = s_color; //1 時 下位

  //2行目 分
  c_att[1][0] = s_color; //M
  c_att[1][1] = s_color; //2 分 上位
  c_att[1][2] = s_color; //3 分 下位

  refresh(); //画面の再表示

  for(int hh=0;hh<60;hh++) {delay(1000);  /*1秒待つ*/}

  //delay(1000); //1秒待つ debug

} //loop


```