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();
}