资料:
前面讲了很多理论,现在来点干的,步骤实践
1.使用图片取模软件获取图像点阵数据
https://docs.singtown.com/micropython/zh/latest/openmvcam/library/framebuf.html
但是pico的内存过于小,单色的240*240的图片都不能一次性全部加载进去。
一张单色图片都要有37k的缓存消耗,而micropico的缓存仅剩19k 芯片缓存在256k左右其余内存应该被c程序和解释器消耗掉了,所以将图片大小改为了90*90,这样刷新速度快。
本次使用的事将图片生成点阵数据,并将点阵数据存放到内部程序缓存中,由于内部缓存空间限制所以彩色图片进一步缩小尺寸。
此工具软件生成的十六进制点阵数据存放到内部缓存既可以。
主要代码指的是除了LCDdome外的必要代码
Pattern =[ ] #括号内将生成的点阵数据存放其中
#下面32,32 是图片的x,y大小 RGB565编码方式
buf = framebuf.FrameBuffer(bytearray(pattern), 32, 32, framebuf.RGB565)# RGB565
# MONO_HLSB MONO_VLSB
# 将处理后的像素点进行加载
LCD.blit(buf,90 ,90,LCD.white)
#print(byteModehex)
#显示加载的数据
LCD.show()
在此设置了两张图片,因为像素色彩饱和度关系,第一张图片显示的效果不好。
由于内部缓存空间有限而且读出的点阵数据还需要解码重新编码所以刷新速度很慢。如果使用c语言开发刷新速度回成倍加快,因为c语言不用更多的负责操作。就像最后面的图像显示一样流畅。
4.1.img2LCD软件生成的代码是C语言使用的,生成的点阵数据如下
4.2.micropython的程序在使用 file = open("huawei.txt",'r');读取txt文件时,获取到的是字符串,并且获得到的字符串包含回车换行 \r\n 。所以为了操作方便我是用vscode将点阵数据进行了重新的编辑,去掉了,0x 。并且要新建。Txt文档,将处理好的点阵代码存入其中。如图所示
5.将。Txt文档传入到pico当中
#LCD.fill_rect(0,0,240,240,0)
file = open("huawei.txt",'r');
#file = open("maliao.txt",'r');
j = 0
while j<19:
# 因为缓存空间限制,不能一次全部加载到缓存中,所以当前设计一次加载5行点阵数据扫描19次将图片显示出来
byteModehex = bytearray(960)
#新建 十六进制缓存数组并申请空间
offset = 2040*j
#偏移 图片一次显示五行 96*5 因为RGB565占2字节 所以5行需要96*5*2 主要点阵数据就是960byte
# 又因为由来txt文件存在的数据是字符行 实际就是两个字符拼成一个十六进制 所以96*5*2*2=1920 这是实际需要从txt得到的有效数据
# 但是读取txt文件时,内部有回车换行字符,一行有32个字符另外每一行后边都有2个字符(\r\n) 所以1920/32*34 = 2040
file.seek(offset,0)
i = 0
huan = 0
#file.seek(960,0)
while i<960: # 点阵有效数据 960byte
#图像显示的满主要原因再次,判断和计算太多消耗芯片运行周期
patten = file.read(2) # readline # read # readlines
if patten[0] =='\r' or patten[0] =='\n': # 防止缓存数据得到\r\n影响点阵错位
#print('换行')
huan = huan+1
else :
#字符转十六进制 高4位
if patten[0] >='A' or patten[0] <='F':
num = ord(patten[0]) - ord('A') +10
elif patten[0] >='0' or patten[0] <='9':
num = ord(patten[0]) - ord('0') +10
#字符转十六进制 低4位
if patten[1] >='A'or patten[1] <='F':
num1 = ord(patten[1]) - ord('A') +10
elif patten[1] >='0'or patten[1] <='9':
num1 = ord(patten[1]) - ord('0') +10
#高四位第四位组合一个字节
number = num*16+num1
#依次将有效数据存入缓存数组
byteModehex = number
i = i+1
#patbuf = patten.strip().split()
#time.sleep(0.01) # 延时
#print(byteModehex)
#print(pattern)
#print("huan",huan)
#print(offset)
#y轴逐渐向下刷新
y = 70 + j*5
#将点阵数据使用帧缓存的方式一一准化RGB显示像素
buf = framebuf.FrameBuffer(bytearray(byteModehex), 96, 5, framebuf.RGB565)# RGB565 # MONO_HLSB MONO_VLSB
LCD.blit(buf, 70, y,LCD.white)
#print(byteModehex)
#LCD.show() # 此位置位5行一刷新 跟视频的现象一直
j = j+1
LCD.show() #在此位置刷新,为多次数据传入LCD中,不显示,最初传完统一刷新,数据加载仍消耗实践但刷新不卡顿秒刷新,是LCD显示的惯用方法
file.close() #第三步,把冰箱门关上,否则大象可能会跑掉
https://bbs.eeworld.com.cn/thread-1227388-1-1.html 详情参考此链接写的更细更好
https://github.com/russhughes/gc9a01py 固件代码下载链接
首先更新下固件,因为微雪的固件当中没有图片显示功能,仅有基础功能的LCD显示。
图片使用的是。Bmp 图片像素大小为240*240 任何图片都可以
3.实例代码 显示效果很棒
'''
jpg.py
Draw a full screen jpg using the slower but less memory intensive method
of blitting each Minimum Coded Unit (MCU) block. Usually 8×8 pixels but can
be other multiples of 8.
GC9A01 display connected to a Raspberry Pi Pico.
Pico Pin Display
========= =======
14 (GP10) BL
15 (GP11) RST
16 (GP12) DC
17 (GP13) CS
18 (GND) GND
19 (GP14) CLK
20 (GP15) DIN
bigbuckbunny.jpg (c) copyright 2008, Blender Foundation / www.bigbuckbunny.org
'''
import gc
import time
from machine import Pin, SPI
import gc9a01
gc.enable()
gc.collect()
def main():
'''
Decode and draw jpg on display
'''
spi = SPI(1, baudrate=60000000, sck=Pin(10), mosi=Pin(11))
tft = gc9a01.GC9A01(
spi,
240,
240,
reset=Pin(12, Pin.OUT),
cs=Pin(9, Pin.OUT),
dc=Pin(8, Pin.OUT),
backlight=Pin(25, Pin.OUT),
rotation=0)
# enable display and clear screen
tft.init()
# cycle thru jpg's
while True:
for image in ["bigbuckbunny.jpg", "bluemarble.jpg"]:
tft.jpg(image, 0, 0, gc9a01.SLOW)
time.sleep(5)
main()
万物都是用C写的~所以C语言运行最快~
引用: 吾妻思萌 发表于 2023-1-12 15:08 华孝子 看了帖子 敬了个礼
啥意思 不是很懂
引用: wangerxian 发表于 2023-1-12 15:28 万物都是用C写的~所以C语言运行最快~
对对对