ST7735パラレルのカラードライバを考えるB(display関数)



x オンラインコンパイラーを使ってロジックのテスト

目的
ドライバーを都合よく改造して
ST7735のパラレルモデルでカラー表示を行う
リフレッシュ時の書き込みプログラム


いろいろ
16ビットカラーからの書き込み単位8ビットへの
変換は、ポインターによる共有で型変換を行い取り出す


https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12242352062




![o_cop642.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f370cdef-063e-cac7-a2c7-591da25e804f.jpeg)



プログラム


```c++


#include <iostream>
using namespace std;


int y_shift[]={
0,128,256,384,512,640,768,896,1024,1152,
1280,1408,1536,1664,1792,1920,2048,2176,2304,2432,
2560,2688,2816,2944,3072,3200,3328,3456,3584,3712,
3840,3968,4096,4224,4352,4480,4608,4736,4864,4992,
5120,5248,5376,5504,5632,5760,5888,6016,6144,6272,
6400,6528,6656,6784,6912,7040,7168,7296,7424,7552,
7680,7808,7936,8064,8192,8320,8448,8576,8704,8832,
8960,9088,9216,9344,9472,9600,9728,9856,9984,10112,
10240,10368,10496,10624,10752,10880,11008,11136,11264,11392,
11520,11648,11776,11904,12032,12160,12288,12416,12544,12672,
12800,12928,13056,13184,13312,13440,13568,13696,13824,13952,
14080,14208,14336,14464,14592,14720,14848,14976,15104,15232,
15360,15488,15616,15744,15872,16000,16128,16256,16384,16512,
16640,16768,16896,17024,17152,17280,17408,17536,17664,17792,
17920,18048,18176,18304,18432,18560,18688,18816,18944,19072,
19200,19328,19456,19584,19712,19840,19968,20096,20224,20352
};




#define WIDTH 128
#define HEIGHT 32

//#define ESP8266 1

void yield(){return;} //空関数

int ft=0;
void GPIO_8BIT(int a){
    
    printf("%2x ",a);
    ft++;
    if(ft>=128){printf("\r\n");ft=0;}
    
    return;
    
} //空関数
void GPIO_WR(int a){return;} //WRB=0; 10 空関数

void LCD_Write_CMD(int a){return;}  //memory write  空関数
void GPIO_RS(int a){return;} //A0=1; //データモード 空関数


uint16_t *buffer;

//char yu[HEIGHT * WIDTH];



//とりま　めんどくさいから普通の関数として定義する

void display(void) {

#if defined(ESP8266)
  // ESP8266 needs a periodic yield() call to avoid watchdog reset.
  // With the limited size of SSD1306 displays, and the fast bitrate
  // being used (1 MHz or more), I think one yield() immediately before
  // a screen write and one immediately after should cover it.  But if
  // not, if this becomes a problem, yields() might be added in the
  // 32-byte transfer condition below.
  yield();
#endif

//buffer = (uint16_t*)yu; //とりま 仮想VRAMに実態を設定


//  uint16_t count = WIDTH * ((HEIGHT + 7) / 8);
//  uint16_t *ptr = buffer;

//    while (count--) {
//
//      //WIRE_WRITE(*ptr++);
//    }

//どつかから拾ってきたint を　文字列　にするアルゴリズム
//int a=0x01234567;
//char s[4];
//int *p;
//p=(int*)s;
//*p=a;

  //画面の書き込み開始
  LCD_Write_CMD(0x2C); //memory write

    GPIO_RS(1);//A0=1; //データモード

  char vg[2];
  uint16_t *ptr;  //ポインター型
  ptr = (uint16_t*)vg; //ポインターに実態の文字列を強制型変換して入れる

  for (int i = 0; i < (HEIGHT * WIDTH); i++) {
 
      *ptr=buffer[i]; //ptr と　vg は、ポインタでリンクしている

        GPIO_8BIT(vg[0]);

        GPIO_WR(0);//WRB=0; 10
        GPIO_WR(1);//WRB=1; 10

        GPIO_8BIT(vg[1]);

        GPIO_WR(0);//WRB=0; 10
        GPIO_WR(1);//WRB=1; 10

  }//i

#if defined(ESP8266)
  yield();
#endif
}//display


uint16_t ggg[] = {
0x0000,0x1111,0x1111,0x0000,0x0000,0x0000,0x0000,0x0000,
0x1111,0x0000,0x0000,0x1111,0x0000,0x0000,0x0000,0x0000,
0x1111,0x0000,0x0000,0x1111,0x0000,0x0000,0x0000,0x0000,
0x1111,0x1111,0x1111,0x1111,0x0000,0x0000,0x0000,0x0000,
0x1111,0x0000,0x0000,0x1111,0x0000,0x0000,0x0000,0x0000,
0x1111,0x0000,0x0000,0x1111,0x0000,0x0000,0x0000,0x0000,
0x1111,0x0000,0x0000,0x1111,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
};



int main(void){
    printf("\r\nSTRAT\r\n");
    
    //表示用の仮想VRAMのエリア確保
    
    buffer = (uint16_t *)malloc(WIDTH * HEIGHT * 2);

    int jj=0;
    for(int y=0;y<8;y++){
        for(int x=0;x<8;x++){
      
    buffer[ x |  y_shift[y]  ] = ggg[jj];
    //drawPixel(x, y, ggg[jj]);
        jj++;
      }
    }
    
   
   display();
    
}



```