[其他ST产品] ESP32实验03:0.96tft液晶显示屏驱动

[复制链接]
 楼主| 范德萨发额 发表于 2023-12-27 19:48 | 显示全部楼层
如图数码管,假设地址(0,0)在左上角。如果要显示“生”字最上面的一个点
逆向:写入顺序(0,0)(1,0)(2,0)(3,0)(4,0)(5,0)… (7,0)
顺向:写入顺序(7,0)(6,0)… (2,0)(1,0)(0,0)
都是在(7,0)坐标写入1,其他未写入0,则点亮了“生”字最上面的一个点。对应到tft屏幕写入的就是颜色需要点亮就写入前景色,需要灭的就写入背景色。
 楼主| 范德萨发额 发表于 2023-12-27 19:48 | 显示全部楼层
这里要注意:在写代码向st7735的2c寄存器写入的时候,逆向时要先判断bit0的值,如果是1则写入前景,0背景,然后是bit1,bit2…。顺向的时候,则要先判断bit7的值,然后bit6,bit5…
 楼主| 范德萨发额 发表于 2023-12-27 19:48 | 显示全部楼层
当设置逐列时,则写入顺序为
逆向:(0,0)(0,1)(0,2)… (0,7)
顺向:(0,7)(0,6)…(0,1) (0,0)
再此就不在进行二进制转换分析了。感兴趣的可以自行研究下

从上述取模方式来看,由于st7735我们推荐的扫描方式是从左到右从上到小,这对应的取模顺序是逐行,逆向。所以只要任何屏幕我们都采用这种方式的时候,取模时就可以固定逐行+逆向
 楼主| 范德萨发额 发表于 2023-12-27 19:48 | 显示全部楼层
3.2图片取模软件
图片取模软件通常使用的是Image2Lcd V2.9版本。其机密如下图所示 49533658c0f24b29c7.png
 楼主| 范德萨发额 发表于 2023-12-27 19:49 | 显示全部楼层
扫描模式与文字取模一致,16位真彩色,取出来的数组一共是3200个,40402。每个像素点颜色占2个字节。
这里的高位在前,是色彩的高8字节在前。正常颜色0xfbba,正常生成的数组是,0xba,0xfb。高位在前则为:0xfb,0xba。
这与文字取模里的顺向和逆向是有区别的。

正常情况下建议,采用默认的低位在前的方式。
 楼主| 范德萨发额 发表于 2023-12-27 19:49 | 显示全部楼层
3.3图片取单色模
如果要将上述的qq图片成为40*40单色显示,直接用Image2Lcd设置为单色是不行的。经过多次测试,这种方法取出模,数组是错误的。 56112658c0f3a850bc.png

 楼主| 范德萨发额 发表于 2023-12-27 19:49 | 显示全部楼层
正确的方式是:
1、先用Image2Lcd将图片保存为单色图片 28562658c0f480fd17.png
 楼主| 范德萨发额 发表于 2023-12-27 19:49 | 显示全部楼层
2、再将单色图片导入到文字取模软件PCtoLcd2002中, 1405658c0f5516d6d.png
 楼主| 范德萨发额 发表于 2023-12-27 19:49 | 显示全部楼层
3、生成数组。阴码,逐行式,逆向

单色qq图片文字取模软件取模结果如下。共有200个字节,40*40/8 每8个像素点占用一个字节
  1. 0x00,0x00,0x30,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x80,0xFF,0x0F,0x00,0x00,
  2. 0x60,0xFE,0x1F,0x00,0x00,0xB0,0xFF,0x7F,0x00,0x00,0xF8,0xFF,0x7F,0x00,0x00,0xFC,
  3. 0xFF,0xFF,0x00,0x00,0xFC,0xF1,0xFC,0x01,0x00,0xFE,0xF3,0xF9,0x01,0x00,0xFE,0xF0,
  4. 0xF9,0x03,0x00,0xFF,0xB0,0xF8,0x03,0x08,0xFF,0x30,0xF8,0x03,0x1F,0xFF,0x70,0xF8,
  5. 0x03,0x3E,0xFF,0xFF,0xFC,0x03,0x7E,0xFF,0xFF,0xFF,0x07,0xFC,0x7F,0x00,0xFC,0x07,
  6. 0xF8,0x1F,0x00,0xF0,0x0F,0xF8,0x5F,0x00,0xEC,0x0F,0xF0,0xFF,0x01,0xFE,0x0F,0xE0,
  7. 0xFF,0xFF,0xFF,0x0F,0xC0,0xDF,0xFF,0xFF,0x1F,0x80,0x7F,0xFC,0xFF,0x3F,0x80,0xFF,
  8. 0xE7,0xFF,0x3F,0x80,0xF9,0xFF,0xFF,0x7E,0x80,0xE1,0xFF,0x7F,0x7C,0x80,0x01,0xFE,
  9. 0x7F,0xFC,0x80,0x01,0x00,0x7E,0xFC,0x80,0x01,0x00,0x7E,0xFC,0x80,0x01,0x00,0x7E,
  10. 0xFC,0x00,0x01,0x00,0x7E,0xEE,0x00,0x03,0x00,0x3C,0xC6,0x00,0x02,0x00,0x00,0x07,
  11. 0x00,0x06,0x00,0x00,0x03,0x00,0x0C,0x00,0x80,0x03,0x00,0x19,0x00,0xC0,0x04,0x80,
  12. 0x30,0x00,0x70,0x08,0x80,0xC0,0x01,0x3C,0x08,0x80,0x00,0xDF,0x0F,0x08,0x00,0x03,
  13. 0x8C,0x01,0x04,0x00,0xFC,0x03,0xFE,0x03,/*"C:\Users\yp\Downloads\0.96TFT测试程序\0.96TFT测试程序\图片取模软件(赠送)\单色qq.bmp",0*/
  14. /* (40 X 40 )*/

复制代码
 楼主| 范德萨发额 发表于 2023-12-27 19:50 | 显示全部楼层
经测试能正常显示。

而直接用图片取模软件,生成的数组如下:
  1. 0X00,0X00,0X0C,0X00,0X00,0X00,0X00,0X7F,0XC0,0X00,0X00,0X01,0XFF,0XF0,0X00,0X00,
  2. 0X06,0X7F,0XF8,0X00,0X00,0X0D,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFE,0X00,0X00,0X3F,
  3. 0XFF,0XFF,0X00,0X00,0X3F,0X8F,0X3F,0X80,0X00,0X7F,0XCF,0X9F,0X80,0X00,0X7F,0X0F,
  4. 0X9F,0XC0,0X00,0XFF,0X0D,0X1F,0XC0,0X10,0XFF,0X0C,0X1F,0XC0,0XF8,0XFF,0X0E,0X1F,
  5. 0XC0,0X7C,0XFF,0XFF,0X3F,0XC0,0X7E,0XFF,0XFF,0XFF,0XE0,0X3F,0XFE,0X00,0X3F,0XE0,
  6. 0X3F,0XF8,0X00,0X0F,0XF0,0X1F,0XFA,0X00,0X37,0XF0,0X0F,0XFF,0X80,0X7F,0XF0,0X07,
  7. 0XFF,0XFF,0XFF,0XF0,0X03,0XFB,0XFF,0XFF,0XF8,0X01,0XFE,0X3F,0XFF,0XFC,0X01,0XFF,
  8. 0XC3,0XFF,0XFC,0X01,0X9F,0XFF,0XFF,0X7E,0X01,0X87,0XFF,0XFE,0X3E,0X01,0X80,0X7F,
  9. 0XFE,0X3F,0X01,0X80,0X00,0X7E,0X3F,0X01,0X80,0X00,0X7E,0X3F,0X01,0X80,0X00,0X7E,
  10. 0X3F,0X01,0X80,0X00,0X7E,0X77,0X00,0XC0,0X00,0X3C,0X63,0X00,0X40,0X00,0X00,0XE0,
  11. 0X00,0X60,0X00,0X00,0XC0,0X00,0X30,0X00,0X01,0X80,0X00,0X98,0X00,0X03,0X80,0X01,
  12. 0X0C,0X00,0X0E,0X20,0X01,0X03,0X00,0X3C,0X10,0X01,0X01,0XFF,0XF0,0X10,0X00,0XC0,
  13. 0X71,0XC0,0X60,0X00,0X3F,0XC0,0X7F,0X80
复制代码
 楼主| 范德萨发额 发表于 2023-12-27 19:50 | 显示全部楼层
该数组显示不正常。

切记,单色图片取模要先用Imag2Lcd转成单色bmp图片,然后用PCtoLcd转成数组
 楼主| 范德萨发额 发表于 2023-12-27 19:50 | 显示全部楼层
4、重点部分代码展示
设置显示区域起始坐标和终点坐标。传送方式为大端模式,要先传送地址的高8位,然后再是低8位。
  1. void lcd_set_region(uint8_t  x_s,uint8_t y_s,uint8_t x_e,uint8_t y_e)
  2. {
  3.     /*in st7735 col address set regeister 2Ah ,first byte send high 8bit second byte send lou 8bit,row address 2Bh is same*/
  4.     uint8_t x_data[4]={0x00,x_s,0x00,x_e};
  5.     uint8_t y_data[4]={0x00,y_s+24,0x00,y_e+24};
  6.     lcd_cmd(my_spi,0x2A);
  7.     lcd_data(my_spi,x_data,4);

  8.     lcd_cmd(my_spi,0x2b);
  9.     lcd_data(my_spi,y_data,4);
  10.     lcd_cmd(my_spi,0x2c);
  11. }
复制代码
 楼主| 范德萨发额 发表于 2023-12-27 19:50 | 显示全部楼层
比较坑的是,这块0.96寸tft屏幕,像素不是从0开始的,所以y轴有一个24的偏移量,这一点太坑了,如果不知道,直接在(0,0)显示一个颜色,实际是没有的,因为这个点超出屏幕的显示范围。
 楼主| 范德萨发额 发表于 2023-12-27 19:51 | 显示全部楼层
画点函数,要先传送颜色的高8位,然后是低8位,采用的也是大端传输方式。

  1. void lcd_draw_point(uint8_t x ,uint8_t y,uint16_t color)
  2. {
  3.     uint8_t temp[2];
  4.     temp[0]=color>>8;
  5.     temp[1]=color;
  6.     lcd_set_region(x,y,x+1,y+1);
  7.     lcd_data(my_spi,temp,2);

  8. }
复制代码
 楼主| 范德萨发额 发表于 2023-12-27 19:51 | 显示全部楼层
显示单色图片,注意大端模式。另外取模时是逆向,则先要判断bit0的值 data>>0&0x01;如果是顺向。则先要判断bit7的值,data<<0&0x80
  1. void lcd_draw_pic(uint8_t x,uint8_t y,uint8_t x_pixel,uint8_t y_pixel, uint16_t fc,uint16_t bc,char *s)
  2. {
  3.         uint16_t i,j,k;
  4.         uint8_t  x_length = x_pixel/8;
  5.         uint8_t x_yu = x_pixel%8;
  6.         uint16_t fc_temp,bc_temp;
  7.         /*st7735 */
  8.         fc_temp =(fc <<8)|(fc>>8);
  9.         bc_temp =(bc <<8)|(bc>>8);
  10.         if(x_yu!=0)
  11.         {
  12.                 x_length = x_length +1;
  13.         }
  14.         lcd_set_region(x,y,x+x_pixel-1,y+y_pixel-1);
  15.         // lcd_set_region(x,y,x+39,y+39);
  16.         for(i=0;i<y_pixel;i++)
  17.         {
  18.                 for(j=0;j<x_length;j++)
  19.                 {
  20.                         for (k=0;k<8;k++)
  21.                         {
  22.                                 if(((*(s+j+i*x_length))>>k)&0x01)
  23.                                 {
  24.                                         lcd_write_data16bit(fc_temp);
  25.                                 }
  26.                                 else
  27.                                 {
  28.                                         lcd_write_data16bit(bc_temp);
  29.                                 }
  30.                                 /*check the last none 8bit byte of one row*/
  31.                                 if (x_yu!=0 && j==(x_length-1) && k==(x_yu-1))
  32.                                 {
  33.                                         printf("break \r\n");
  34.                                         break;
  35.                                 }
  36.                         }
  37.                 }
  38.         }
  39. }
复制代码
 楼主| 范德萨发额 发表于 2023-12-27 19:51 | 显示全部楼层
具体代码链接如下
https://gitee.com/yvany/esp32projects.git 85598658c0fc474bd3.png
wangshujun 发表于 2024-2-26 09:47 | 显示全部楼层
范德萨发额 发表于 2023-12-27 19:43
所以不要妄想将买到的并口屏幕改为spi串行通信,除非将整个屏幕拆开,重新连线,这基本是不现实的。 ...

很多并口版本im其实是引出的,有些在排线上用锡桥进行切换,不过并口的贵不少,调整到串口很不划算
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部