发新帖我要提问
123
返回列表
打印
[其他ST产品]

ESP32实验03:0.96tft液晶显示屏驱动

[复制链接]
楼主: 范德萨发额
手机看帖
扫描二维码
随时随地手机跟帖
41
范德萨发额|  楼主 | 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屏幕写入的就是颜色需要点亮就写入前景色,需要灭的就写入背景色。

使用特权

评论回复
42
范德萨发额|  楼主 | 2023-12-27 19:48 | 只看该作者
这里要注意:在写代码向st7735的2c寄存器写入的时候,逆向时要先判断bit0的值,如果是1则写入前景,0背景,然后是bit1,bit2…。顺向的时候,则要先判断bit7的值,然后bit6,bit5…

使用特权

评论回复
43
范德萨发额|  楼主 | 2023-12-27 19:48 | 只看该作者
当设置逐列时,则写入顺序为
逆向:(0,0)(0,1)(0,2)… (0,7)
顺向:(0,7)(0,6)…(0,1) (0,0)
再此就不在进行二进制转换分析了。感兴趣的可以自行研究下

从上述取模方式来看,由于st7735我们推荐的扫描方式是从左到右从上到小,这对应的取模顺序是逐行,逆向。所以只要任何屏幕我们都采用这种方式的时候,取模时就可以固定逐行+逆向

使用特权

评论回复
44
范德萨发额|  楼主 | 2023-12-27 19:48 | 只看该作者
3.2图片取模软件
图片取模软件通常使用的是Image2Lcd V2.9版本。其机密如下图所示

使用特权

评论回复
45
范德萨发额|  楼主 | 2023-12-27 19:49 | 只看该作者
扫描模式与文字取模一致,16位真彩色,取出来的数组一共是3200个,40402。每个像素点颜色占2个字节。
这里的高位在前,是色彩的高8字节在前。正常颜色0xfbba,正常生成的数组是,0xba,0xfb。高位在前则为:0xfb,0xba。
这与文字取模里的顺向和逆向是有区别的。

正常情况下建议,采用默认的低位在前的方式。

使用特权

评论回复
46
范德萨发额|  楼主 | 2023-12-27 19:49 | 只看该作者
3.3图片取单色模
如果要将上述的qq图片成为40*40单色显示,直接用Image2Lcd设置为单色是不行的。经过多次测试,这种方法取出模,数组是错误的。

使用特权

评论回复
47
范德萨发额|  楼主 | 2023-12-27 19:49 | 只看该作者
正确的方式是:
1、先用Image2Lcd将图片保存为单色图片

使用特权

评论回复
48
范德萨发额|  楼主 | 2023-12-27 19:49 | 只看该作者
2、再将单色图片导入到文字取模软件PCtoLcd2002中,

使用特权

评论回复
49
范德萨发额|  楼主 | 2023-12-27 19:49 | 只看该作者
3、生成数组。阴码,逐行式,逆向

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

使用特权

评论回复
50
范德萨发额|  楼主 | 2023-12-27 19:50 | 只看该作者
经测试能正常显示。

而直接用图片取模软件,生成的数组如下:
0X00,0X00,0X0C,0X00,0X00,0X00,0X00,0X7F,0XC0,0X00,0X00,0X01,0XFF,0XF0,0X00,0X00,
0X06,0X7F,0XF8,0X00,0X00,0X0D,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFE,0X00,0X00,0X3F,
0XFF,0XFF,0X00,0X00,0X3F,0X8F,0X3F,0X80,0X00,0X7F,0XCF,0X9F,0X80,0X00,0X7F,0X0F,
0X9F,0XC0,0X00,0XFF,0X0D,0X1F,0XC0,0X10,0XFF,0X0C,0X1F,0XC0,0XF8,0XFF,0X0E,0X1F,
0XC0,0X7C,0XFF,0XFF,0X3F,0XC0,0X7E,0XFF,0XFF,0XFF,0XE0,0X3F,0XFE,0X00,0X3F,0XE0,
0X3F,0XF8,0X00,0X0F,0XF0,0X1F,0XFA,0X00,0X37,0XF0,0X0F,0XFF,0X80,0X7F,0XF0,0X07,
0XFF,0XFF,0XFF,0XF0,0X03,0XFB,0XFF,0XFF,0XF8,0X01,0XFE,0X3F,0XFF,0XFC,0X01,0XFF,
0XC3,0XFF,0XFC,0X01,0X9F,0XFF,0XFF,0X7E,0X01,0X87,0XFF,0XFE,0X3E,0X01,0X80,0X7F,
0XFE,0X3F,0X01,0X80,0X00,0X7E,0X3F,0X01,0X80,0X00,0X7E,0X3F,0X01,0X80,0X00,0X7E,
0X3F,0X01,0X80,0X00,0X7E,0X77,0X00,0XC0,0X00,0X3C,0X63,0X00,0X40,0X00,0X00,0XE0,
0X00,0X60,0X00,0X00,0XC0,0X00,0X30,0X00,0X01,0X80,0X00,0X98,0X00,0X03,0X80,0X01,
0X0C,0X00,0X0E,0X20,0X01,0X03,0X00,0X3C,0X10,0X01,0X01,0XFF,0XF0,0X10,0X00,0XC0,
0X71,0XC0,0X60,0X00,0X3F,0XC0,0X7F,0X80

使用特权

评论回复
51
范德萨发额|  楼主 | 2023-12-27 19:50 | 只看该作者
该数组显示不正常。

切记,单色图片取模要先用Imag2Lcd转成单色bmp图片,然后用PCtoLcd转成数组

使用特权

评论回复
52
范德萨发额|  楼主 | 2023-12-27 19:50 | 只看该作者
4、重点部分代码展示
设置显示区域起始坐标和终点坐标。传送方式为大端模式,要先传送地址的高8位,然后再是低8位。
void lcd_set_region(uint8_t  x_s,uint8_t y_s,uint8_t x_e,uint8_t y_e)
{
    /*in st7735 col address set regeister 2Ah ,first byte send high 8bit second byte send lou 8bit,row address 2Bh is same*/
    uint8_t x_data[4]={0x00,x_s,0x00,x_e};
    uint8_t y_data[4]={0x00,y_s+24,0x00,y_e+24};
    lcd_cmd(my_spi,0x2A);
    lcd_data(my_spi,x_data,4);

    lcd_cmd(my_spi,0x2b);
    lcd_data(my_spi,y_data,4);
    lcd_cmd(my_spi,0x2c);
}

使用特权

评论回复
53
范德萨发额|  楼主 | 2023-12-27 19:50 | 只看该作者
比较坑的是,这块0.96寸tft屏幕,像素不是从0开始的,所以y轴有一个24的偏移量,这一点太坑了,如果不知道,直接在(0,0)显示一个颜色,实际是没有的,因为这个点超出屏幕的显示范围。

使用特权

评论回复
54
范德萨发额|  楼主 | 2023-12-27 19:51 | 只看该作者
画点函数,要先传送颜色的高8位,然后是低8位,采用的也是大端传输方式。

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

}

使用特权

评论回复
55
范德萨发额|  楼主 | 2023-12-27 19:51 | 只看该作者
显示单色图片,注意大端模式。另外取模时是逆向,则先要判断bit0的值 data>>0&0x01;如果是顺向。则先要判断bit7的值,data<<0&0x80
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)
{
        uint16_t i,j,k;
        uint8_t  x_length = x_pixel/8;
        uint8_t x_yu = x_pixel%8;
        uint16_t fc_temp,bc_temp;
        /*st7735 */
        fc_temp =(fc <<8)|(fc>>8);
        bc_temp =(bc <<8)|(bc>>8);
        if(x_yu!=0)
        {
                x_length = x_length +1;
        }
        lcd_set_region(x,y,x+x_pixel-1,y+y_pixel-1);
        // lcd_set_region(x,y,x+39,y+39);
        for(i=0;i<y_pixel;i++)
        {
                for(j=0;j<x_length;j++)
                {
                        for (k=0;k<8;k++)
                        {
                                if(((*(s+j+i*x_length))>>k)&0x01)
                                {
                                        lcd_write_data16bit(fc_temp);
                                }
                                else
                                {
                                        lcd_write_data16bit(bc_temp);
                                }
                                /*check the last none 8bit byte of one row*/
                                if (x_yu!=0 && j==(x_length-1) && k==(x_yu-1))
                                {
                                        printf("break \r\n");
                                        break;
                                }
                        }
                }
        }
}

使用特权

评论回复
56
范德萨发额|  楼主 | 2023-12-27 19:51 | 只看该作者
具体代码链接如下
https://gitee.com/yvany/esp32projects.git

使用特权

评论回复
57
wangshujun| | 2024-2-26 09:47 | 只看该作者
范德萨发额 发表于 2023-12-27 19:43
所以不要妄想将买到的并口屏幕改为spi串行通信,除非将整个屏幕拆开,重新连线,这基本是不现实的。 ...

很多并口版本im其实是引出的,有些在排线上用锡桥进行切换,不过并口的贵不少,调整到串口很不划算

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则