屏幕链接

void WriteComm(uint8_t cmd) {
    GC9107_DC_LOW();
    GC9107_CS_LOW();
    HAL_SPI_Transmit(&hspi2, &cmd, 1, HAL_MAX_DELAY);
    GC9107_CS_HIGH();
}
void WriteData(uint8_t data) {
    GC9107_DC_HIGH();
    GC9107_CS_LOW();
    HAL_SPI_Transmit(&hspi2, &data, 1, HAL_MAX_DELAY);
    GC9107_CS_HIGH();
}
void spisd_8(uint8_t data)
{
	HAL_SPI_Transmit(&hspi2, &data, 1, HAL_MAX_DELAY);
}
void spisd_16(uint16_t data)
{
	uint8_t data1 = (data>>8)& 0xFF;
	uint8_t data2 = data& 0xFF;
	HAL_SPI_Transmit(&hspi2, &data1, 1, HAL_MAX_DELAY);
	HAL_SPI_Transmit(&hspi2, &data2, 1, HAL_MAX_DELAY);
}

void WriteData_16(uint16_t data) {
		uint8_t data1 = data>>8;
		uint8_t data2 = data;
    GC9107_DC_HIGH();
    GC9107_CS_LOW();
		HAL_SPI_Transmit(&hspi2, &data1, 1, HAL_MAX_DELAY);
		HAL_SPI_Transmit(&hspi2, &data2, 1, HAL_MAX_DELAY);
    GC9107_CS_HIGH();
}
void GC9107_Init(void)
{
	GC9107_RST_HIGH(); 
	rt_thread_mdelay(80);

	GC9107_RST_LOW();
	rt_thread_mdelay(80);

	GC9107_RST_HIGH();
	rt_thread_mdelay(200);

	

	WriteComm(0xFE);		
	WriteComm(0xFE);			
	WriteComm(0xEF);

	WriteComm(0xB0);		
	WriteData(0xC0); 

	WriteComm(0xB1);
	WriteData(0x80);

	WriteComm(0xB2);		
	WriteData(0x27); 

	WriteComm(0xB3);			
	WriteData(0x13);

	WriteComm(0xB6);		
	WriteData(0x19); 

	WriteComm(0xB7);		
	WriteData(0x05);  

	WriteComm(0xAC);
	WriteData(0xC8);

	WriteComm(0xAB);
	WriteData(0x0f);

	WriteComm(0x3A);		
	WriteData(0x05);

	WriteComm(0xB4);	
	WriteData(0x04);

	WriteComm(0xA8);
	WriteData(0x0a);

	WriteComm(0xB8);
	WriteData(0x08);

	WriteComm(0xEA);
	WriteData(0x02);

	WriteComm(0xE8);	
	WriteData(0x2A); 

	WriteComm(0xE9);	
	WriteData(0x47); 

	WriteComm(0xE7);
	WriteData(0x5F);

	WriteComm(0xC6);   
	WriteData(0x21); 

	WriteComm(0xC7);   
	WriteData(0x13);

	WriteComm(0xF0);	
	WriteData(0x1D);
	WriteData(0x38);
	WriteData(0x09);
	WriteData(0x4D);
	WriteData(0x92);
	WriteData(0x2F);
	WriteData(0x35);
	WriteData(0x52);
	WriteData(0x1E);
	WriteData(0x0C);
	WriteData(0x04);
	WriteData(0x12);
	WriteData(0x14);
	WriteData(0x1F);

	WriteComm(0xF1);
	WriteData(0x16);
	WriteData(0x40);
	WriteData(0x1C);
	WriteData(0x54);
	WriteData(0xA9);
	WriteData(0x2D);
	WriteData(0x2E);
	WriteData(0x56);
	WriteData(0x10);
	WriteData(0x0D);
	WriteData(0x0C);
	WriteData(0x1A);
	WriteData(0x14);
	WriteData(0x1E);

	WriteComm(0xF4);
	WriteData(0x00);
	WriteData(0x00);
	WriteData(0xFF);

	WriteComm(0xBA);
	WriteData(0xFF);
	WriteData(0xFF);

	WriteComm(0x11);
	rt_thread_mdelay(120);
	
	GC9107_Clear(0);//防止花屏,在启动屏幕前清屏
	WriteComm(0x29);

}

void GC9107_SetAddressWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) 
{
//		x0 = x0+1;
//		y0 = y0+1;
//		x1 = x1+2;
//		y1 = y1+2;
    WriteComm(0x2A); // Column Address Set
	WriteData_16(x0);
	WriteData_16(x1);


    WriteComm(0x2B); // Row Address Set
	WriteData_16(y0);
	WriteData_16(y1);
    WriteComm(0x2C); // Memory Write
}

void GC9107_DrawPaint(uint16_t x, uint16_t y, uint16_t Color)
{
	GC9107_SetAddressWindow(x,y,x,y);
	GC9107_DC_HIGH();
	WriteData_16(Color); 	
}

void GC9107_Clear(uint16_t color) {
    GC9107_SetAddressWindow(x_start, y_start, x_end, y_end);
		GC9107_DC_HIGH();
		GC9107_CS_LOW();
		for(int i = 0; i < x_end; i++){
			for(int j = 0; j < y_end; j++){
				spisd_16(color);
		}
	 }
		GC9107_CS_HIGH();
}

void GC9107_Clear2(uint16_t color) {
//    GC9107_SetAddressWindow(x_start, y_start, x_end, y_end);
//		GC9107_DC_HIGH();
//		GC9107_CS_LOW();
		for(int i = 0; i < x_end; i++){
			for(int j = 0; j < y_end; j++){
				GC9107_DrawPaint(i,j,0xffff);
		}
	 }
}

void GC9107_DrawImage(const uint8_t *Image, uint16_t xStart, uint16_t yStart, uint16_t W_Image, uint16_t H_Image) 
{
		uint16_t color;
		uint16_t k=0;
    for(int i = 0; i < W_Image; i++){
      for(int j = 0; j < H_Image; j++)
			{
				color = (Image[2*k]<<8)|Image[2*k+1];
//				color = 0xffff;
				GC9107_DrawPaint(xStart+i, yStart+j, color);
				k++;
      }
    }
}



void GC9107_Display(const uint16_t *Image)
{
    GC9107_SetAddressWindow(x_start, y_start, x_end, y_end);
		GC9107_DC_HIGH();
		GC9107_CS_LOW();
    for(int i = 0; i < x_end; i++){
      for(int j = 0; j < y_end; j++){
				spisd_16(*(Image+i*x_end+j));
      }
    }
		GC9107_CS_HIGH();
}

void GC9107_Display2(const uint16_t *Image, uint16_t xStart, uint16_t yStart, uint16_t W_Image, uint16_t H_Image)
{
    GC9107_SetAddressWindow(x_start, y_start, x_start+W_Image, y_start+H_Image);
		GC9107_DC_HIGH();
		GC9107_CS_LOW();
    for(int i = 0; i < W_Image; i++){
      for(int j = 0; j < H_Image; j++){
				spisd_16(*(Image+i*W_Image+j));
      }
    }
		GC9107_CS_HIGH();
}
void GC9107_Display3(const uint8_t *Image, uint16_t xStart, uint16_t yStart, uint16_t W_Image, uint16_t H_Image)//W_IMAGE与H_IMAGE都要比实际值小1(0~79的宽度是80);W_Image=W_Image-1
{
		uint32_t k=0;
    GC9107_SetAddressWindow(xStart, yStart, xStart+W_Image, yStart+H_Image);
		GC9107_DC_HIGH();
		GC9107_CS_LOW();
    for(int i = 0; i < W_Image; i++){
      for(int j = 0; j < H_Image; j++){
				spisd_8(Image[k*2]);
				spisd_8(Image[k*2+1]);
				k++;
      }
    }
		GC9107_CS_HIGH();
}

上面是所有的代码,出现过问题的是画点函数

void GC9107_DrawPaint(uint16_t x, uint16_t y, uint16_t Color)
{
	GC9107_SetAddressWindow(x,y,x,y);
	GC9107_DC_HIGH();
	WriteData_16(Color); 	
}

以前在调试画点函数时,可能出过问题,于是我认为要把设置窗口放大一点,每次只画该窗口的第一个点,有问题的函数如下

void GC9107_DrawPaint(uint16_t x, uint16_t y, uint16_t Color)
{
	GC9107_SetAddressWindow(x,y,x+1,y+1);
	GC9107_DC_HIGH();
	WriteData_16(Color); 	
}

后来发现,设置窗口只有一个点时,可以写一个点就行

当窗口设置大了,如2个,写一个点则无法让数据写入,需要写很多次,如下需要写入三次,才能将数据写入

void GC9107_DrawPaint(uint16_t x, uint16_t y, uint16_t Color)
{
	GC9107_SetAddressWindow(x,y,x+1,y+1);
	GC9107_DC_HIGH();
	GC9107_CS_LOW();
	spisd_16(Color);
	for(int i=0;i<2;i++)
	{
		spisd_8(0xff);
				spisd_8(0xff);
	}
	
	GC9107_CS_HIGH();
//	WriteData_16(Color); 	
}

且显示效果并不好

后两次传输的不清楚是有什么用

但是传输更多参数时,未发现该问题,但未仔细查看,可能有丢失但参数太多看不出

void GC9107_Display3(const uint8_t *Image, uint16_t xStart, uint16_t yStart, uint16_t W_Image, uint16_t H_Image)//W_IMAGE与H_IMAGE都要比实际值小1(0~79的宽度是80);W_Image=W_Image-1
{
		uint32_t k=0;
    GC9107_SetAddressWindow(xStart, yStart, xStart+W_Image, yStart+H_Image);
		GC9107_DC_HIGH();
		GC9107_CS_LOW();
    for(int i = 0; i < W_Image; i++){
      for(int j = 0; j < H_Image; j++){
				spisd_8(Image[k*2]);
				spisd_8(Image[k*2+1]);
				k++;
      }
    }
		GC9107_CS_HIGH();
}