树莓派 java 驱动 lcd tft spi 1.8寸 ST7735S

  • Post author:
  • Post category:java




结果展示

  1. 显示效果:

    在这里插入图片描述



本人相关视频指导链接

B站视频指导:

链接地址


https://www.bilibili.com/video/BV1up4y187i2



接线说明

  1. 以树莓派的BCM引脚模式进行接线,好处是java定义树莓派引脚的时候,直接使用BCM引脚号即可。

  2. 可以使用指令

    gpio readall

    查看引脚,最靠左右两边的即是BCM模式的引脚读数
    在这里插入图片描述

  3. 我买的这个屏幕是1.8寸的128×160的屏幕,共8个引脚,与树莓派的连接见上图,以及下方说明

    GND->接地

    blk(屏幕背景灯,这个引脚单独搞出来,可能是给我们控制亮度用的,比如pwm)+VDD -> ST7735S直接接入3.3v是可以的

    SDA -> SPI数据,接MOSI(BCM10)

    SCL -> SPI时钟,接SCLK(BCM11引脚)

    CS -> 千万不能接地,因为后续传指令,传数据,都需要CS低电平变高电平来结束一个读数周期。(BCM5)

    RET -> 复位,低电平转高电平进行复位(BCM23)

    RS(DC) -> 指令控制口(BCM8)

  4. 实际上,买1.3寸的屏幕,有240×240的分辨率,还更便宜。不过1.8寸屏幕既买之,则驱动之。



代码参考说明

  1. 代码,主要是参考

    shengDay

    的《

    树莓派GPIO入门11-驱动液晶屏幕(一)

    》,这个博主也是用的ST7735S,借鉴意义非常大,讲解的也非常好。

    1. 但是也有一个诡异的地方,为啥我的这个ST7735S的16Bit的色彩,传数据的排序是Blue-Green-Red,而不是Red-Green-Blue呢?如果谁知道的请不吝赐教。
    2. 原来我以为是我java代码写反了,使用作者的代码跑。也是一样的结果,真实的数据排序是Blue-Green-Red
  2. 这篇

    DevinTT

    的内容《

    树莓派使用上spi tft!(fbtft的使用)

    》,也可以作为参考,但是ST7735S和ST7735R的驱动,应该是有些不同的,我最初就是按这篇内容的搞法,搞半天不灵。
  3. 我的java驱动代码已经提交,关键看这个路径下的代码:com.chenqi.tft.st7735s。

    github代码地址在这
  4. 关键java代码见下,入参要求为128×160的RGB的bufferedImage:

     /**
     * 画图(16bit的色彩)
     *
     * @param bufferedImage
     * @throws IOException
     */
    public void drawImg16BitColor(BufferedImage bufferedImage) throws IOException {
        System.out.println("start to write Lcd Img");
        init();
        for (int y = 0; y < HEIGHT; y++) {
            for (int x = 0; x < WIDTH; x++) {
                int rgb = bufferedImage.getRGB(x, y);
                int red = (rgb >> 16) & 0xff; //获取红色的色值
                int green = (rgb >> 8) & 0xff;
                int blue = rgb & 0xff;
                red = red * 0x1f / 0xff; //st7735s的红色占5位,即0x1f
                green = green * 0x3f / 0xff; //st7735s的绿色占6位,即0x3f
                blue = blue * 0x1f / 0xff; //st7735s的蓝色占5位,即0x1f
    
                int highBit = 0x00;
                int lowBit = 0x00;
                highBit = highBit | (blue << 3) | (green >> 3);
                lowBit = lowBit | (green << 5) | red ;
                writeEveryPixel16Bit(highBit, lowBit);
            }
        }
    }
    



自我答疑

  1. n天后,偶然看过一些资料,对上边自己提出的一个问题,进行解答。问题是:

    有一个诡异的地方,为啥我的这个ST7735S的16Bit的色彩,传数据的排序是Blue-Green-Red,而不是Red-Green-Blue呢?如果谁知道的请不吝赐教。


    解答:指令Display inversion on(21h)以及指令Display inversion off(20h),使用来控制色彩的反转的。我这边实验的情况如下,指令Display inversion off(20h)对应BGR,指令Display inversion on(21h)对应RGB。无语,怎么同这个指令的含义是相反的,算了,就这个意思,大家理解一下就行了。

    多说一句,init方法中,对指令的写入,一定要在这个

    sendCommand(0x29)

    代码之前,如以下代码顺序

    
        sendCommand(0x21); //一定要显式指定Display Inversion On,16bit彩色的格式才是rgb。
        //不指定0x21的话,16bit彩色的格式为bgr。这是一个坑点。。特别注意
    
        sendCommand(0x29); //Display On
        sendCommand(0x2C);
    



版权声明:本文为chenqide163原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。