admin管理员组

文章数量:1558102

文章目录

    • 1、屏幕驱动原理
    • 2、配置驱动
    • 3、源码

最近在b站上看到有这个,是国外的一个大佬做的,主控用的是f103,然后屏幕用的是ST7735的驱动IC,该大佬还做了播放视频做的真不错,就想着来复现下,不过大佬是用的ARDUINO写的代码,属实是太强了,然后我把他移植到了我的驱动这边来尝试下,效果如下所示:

1、屏幕驱动原理

我们常见的st7735屏幕大概这样的,可能有一点区别,但是区别不大,最起码的引脚都是有的,可以当成同一种使用。

接口说明:

序号引脚标号说明
1VCC5V/3.3V电源输入
2GND接地
3CS液晶屏片选信号,低电平使能
4RESET液晶屏复位信号,低电平复位
5A0液晶屏寄存器/数据选择信号,低电平:寄存器,高电平:数据
6SDASPI总线写数据信号
7SCKSPI总线时钟信号
8LED背光控制,高电平点亮,如无需控制则接3.3V常亮

屏幕数据手册太多了,建议需要的自己看: ST7735数据手册

2、配置驱动

首先我们配置SPI,这里可以尽量拉高,我这里应该是拉到最高了,SPI的最大通信速率取决于低速设备的通信速率。

这里我们可以来打开DMA,这样通过发送缓存数组就可以达到一个很快的刷新率:

之后配置一些相关的引脚,主要是复位引脚然后片选还有背光,这里背光是可以调节的,甚至如果不想设置背光,可以直接将他接到3.3v的输出引脚上!

下面就是我们要移植的驱动了,首先还是修改我们的宏定义,使宏定义符合要求

然后在cfg文件中有是否开启DMA的选项,这里我们通过改变宏参数就可以选择是否使用DMA

下面就可以编写屏幕测试函数了,这个测试也是一个github上大佬写的,使用了各种图形,还是很不错的!

最后我们就可以把程序下载到开发板来测试了:

这里我展示下使用字符串来测试,初始化代码如下所示:

将程序下载到开发板,就可以看到屏幕上已经显示出我们的数据了:

下面来试下图片,首先我们需要把图片提取每个像素点的RGB565的数值,这里提供了python的程序,可以参考使用这个程序来设计:

from PIL import Image
import sys
import os


if len(sys.argv) != 4:
    print("Usage: {} <image-file> <width> <height>".format(sys.argv[0]))
    sys.exit(1)

fname = sys.argv[1]

W = sys.argv[2]
print("\r\n")
print("<width> " + str(W))

H = sys.argv[3]
print("<height> " + str(H))

img = Image.open(fname)

if img.width != int(W) or img.height != int(H):
    print("Error: 图片尺寸输入错误 )!!!");
    sys.exit(2)

f = open("picFile.txt", "a")

f.write("// size " + str(W) + " x " + str(H) + " \n");
f.write("const unsigned short img[] = { \n ");

for y in range(0, img.height):
    s = ""
    for x in range(0, img.width):
        (r, g, b) = img.getpixel((x, y))
        color565 = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3)
        color565 = ((color565 & 0xFF00) >> 8) | ((color565 & 0xFF) << 8)
        s += "0x{:04X},".format(color565)
    s += "  \n"
    f.write(s)

f.write("}; \r\n")
f.close()
print("\r\n转换完成\r\n")

该程序如果使用的是pycharm这类的ide是无法实用的,需要我们在命令行中进行调用,调用方法如下所示:

最后我们将转换好的数据填充到我们准备好的数组中:

将程序下载到开发板就可以看到现象了:

3、源码

本次文件过大,包括复现的大佬的代码,这里就不贴了,直接放到我的gitee上,需要的可以去查看:源码

本文标签: 屏幕图片高清