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


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

目的
ドライバーを都合よく改造して
ST7735のパラレルモデルでカラー表示を行う
仮想VRAMにドット表示を行う

いろいろ
xとyの合成は、いろいろ過去のプログラムを見ると加算では、なく
ORでやっているものが多い
ORだとゼロフラグ以外動かないのと8ビット系だと面倒な繰り上がり
繰り下がりの処理が要らないと思われる。
その為にORで下位7ビットは、xで上位8ビットはy
 0yyy-yyyy-yxxx-xxxx
でアドレス変換をする
bufferは、仮想VRAM
y_shiftは、7ビットシフト
colorは、設定したいカラー

いみふな人は、気にしないでね!!

```c++

    //ドットのカラーの設定
    buffer[ x |  y_shift[y]  ] = color;


```

例
x=38 (010 0110)
y=46 (0010 1110)

![o_cop640.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/37b5df82-0268-92c8-5139-d8e2fa5b6ff3.jpeg)



![o_cop638.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/76deba6d-64bb-5354-154f-0d5fdc3970bb.jpeg)

スペック

(RGB) 128 x 160

16ビットカラーの時は、2バイト

![o_cop639.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5733aae7-c6f8-df99-c97b-2d8ffc77cf96.jpeg)


![o_cop641.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/072c105b-0e34-49b7-6e39-784c436d6422.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
};


uint16_t *buffer;

//buffer = (uint16_t *)malloc(WIDTH * HEIGHT * 2);

#define WIDTH 128
#define HEIGHT 64

#define NA_ST7735_P_BLACK 0x0000
#define NA_ST7735_P_WHITE 0xffff

int16_t width(){return(WIDTH);}

int16_t height(){return(HEIGHT);}

int getRotation(){return(0);}

void NA_ST7735_P_swap(int x, int y){int a=x;x=y;y=a;}


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

//点の表示
void drawPixel(int16_t x, int16_t y, uint16_t color) {
  if ((x >= 0) && (x < width()) && (y >= 0) && (y < height())) {
    // Pixel is in-bounds. Rotate coordinates if needed.
    switch (getRotation()) {
    case 1:
      NA_ST7735_P_swap(x, y);
      x = WIDTH - x - 1;
      break;
    case 2:
      x = WIDTH - x - 1;
      y = HEIGHT - y - 1;
      break;
    case 3:
      NA_ST7735_P_swap(x, y);
      y = HEIGHT - y - 1;
      break;
    }//end switch

    //ドットのカラーの設定
    buffer[ x |  y_shift[y]  ] = color;

  }//if
}//drawPixel


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){

    //表示用の仮想VRAMのエリア確保
    
    buffer = (uint16_t *)malloc(WIDTH * HEIGHT * 2);

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


    //
    printf("\r\n");
    for(int x=0;x<40;x++){
      for(int y=0;y<40;y++){
	if(buffer[ x |  y_shift[y]  ] == 0x0000)
	{printf(" ");}else{printf("*");}
      }
      printf("\r\n");
    }

}//main



```