STM8とWS2812Bで3分タイマー


x 注意　STM8は、遅い


目的
GPIOのテスト

![o_con29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8eecc5e3-722d-44c2-712b-dd7c00f6f4e3.jpeg)


```c++




#define G0  0
#define R0  12
#define B0  0

#define G1  12
#define R1  0
#define B1  0

#define G2  0
#define R2  0
#define B2  12

#define G3  6
#define R3  6
#define B3  6

#define L_NUM 40

char l[L_NUM*3]; //max40 led

#define PD_ODR *(volatile uint8_t *)0x500F

// 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 
void bit_off1(){
   //0.3us 800khz

    PD_ODR = 0b00000001; //1 0.125
    PD_ODR = 0b00000000; //2 0.250
    PD_ODR = 0b00000000; //3 0.375
    PD_ODR = 0b00000000; //4
    PD_ODR = 0b00000000; //5

    PD_ODR = 0b00000000; //1
    PD_ODR = 0b00000000; //2
    PD_ODR = 0b00000000; //3
    //PD_ODR = 0b00000000; //4
    //PD_ODR = 0b00000000; //5

}//bit_off1

// 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
void bit_on1(){
   //1us 800khz

    PD_ODR = 0b00000001; //1
    PD_ODR = 0b00000001; //2
    PD_ODR = 0b00000001; //3
    PD_ODR = 0b00000001; //4
    PD_ODR = 0b00000001; //5

    PD_ODR = 0b00000001; //1
    PD_ODR = 0b00000001; //2
    PD_ODR = 0b00000000; //3 0.375
    //PD_ODR = 0b00000000; //4 0.250
    //PD_ODR = 0b00000000; //5 0.125

}//bit_on1

//RGB_LEDにデータをn回分送る
void ws_led()
{
  char al;
  disableInterrupts();
  //num1で指定された分だけループする
  for(char ii=0;ii<(L_NUM*3);ii++){
      al=l[ii];

      if( al & 0b10000000 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b01000000 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00100000 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00010000 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00001000 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00000100 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00000010 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}
      if( al & 0b00000001 ){bit_on1();/*ビットが1*/}else{bit_off1();/*ビットが0*/}

  }//for
  enableInterrupts();
}//ws_led


//RGB_LEDに0データをn回分送る
void ws_led_cl()
{
  disableInterrupts();
  //num1で指定された分だけループする
  for(char ii=0;ii< (L_NUM*3)  ;ii++){
    bit_off1(); //ビットが0
    bit_off1(); //ビットが0
    bit_off1(); //ビットが0
    bit_off1(); //ビットが0

    bit_off1(); //ビットが0
    bit_off1(); //ビットが0
    bit_off1(); //ビットが0
    bit_off1(); //ビットが0
  }//for
  enableInterrupts();
}//ws_led

void setup() {

  //GPIOの初期化
  pinMode(PD0, OUTPUT);

  //ws2812bへ0データを送る
  ws_led_cl();delay(100);

}//setup

char hh;
#define s60() for(hh=0;hh<60;hh++)delay(1000);

void loop() {


//0000000000000000000000000000000000000000

  //状態を1づつ進める
  for(char ii=0;ii<L_NUM;ii++){

    //1個のデータをセット  
    l[(ii*3)+0] = G0;
    l[(ii*3)+1] = R0;
    l[(ii*3)+2] = B0;

  }//for

  //RGB_LEDにデータをn回分送る
  ws_led();s60();


//11111111111111111111111111111111111111

  //状態を1づつ進める
  for(char ii=0;ii<L_NUM;ii++){

    //1個のデータをセット  
    l[(ii*3)+0] = G1;
    l[(ii*3)+1] = R1;
    l[(ii*3)+2] = B1;

  }//for

  //RGB_LEDにデータをn回分送る
  ws_led();s60();


//2222222222222222222222222222222222222

  //状態を1づつ進める
  for(char ii=0;ii<L_NUM;ii++){

    //1個のデータをセット  
    l[(ii*3)+0] = G2;
    l[(ii*3)+1] = R2;
    l[(ii*3)+2] = B2;

  }//for

  //RGB_LEDにデータをn回分送る
  ws_led();s60();

//33333333333333333333333333333333333

  //状態を1づつ進める
  for(char ii=0;ii<L_NUM;ii++){

    //1個のデータをセット  
    l[(ii*3)+0] = G3;
    l[(ii*3)+1] = R3;
    l[(ii*3)+2] = B3;

  }//for

  //RGB_LEDにデータをn回分送る
  ws_led();s60();


  //無限ループ
  while(1){}

}//loop



```