上篇文章: 玩转RP2040之Python开发环境搭建,进行了RP2040的Python软件开发环境搭建与测试,本篇进行程序编写,测试LCD的基础显示功能。
RP2040用到Python环境,准确的讲是MicroPython,它是Python 3编程语言的精简高效实现 ,包括Python标准库的一小部分,并且经过优化,可在微控制器和受限环境中运行。
1 MicroPython画图介绍
MicroPython相比较Python,有一些专有的库,比如本篇要介绍的framebuf库,就是专有的库,可以看下MicroPython官方文档:https://docs.micropython.org/en/latest/library/framebuf.html
如果英文文档看着不习惯,国内有一些翻译文档,比如:
2 FrameBuffer绘制原始形状
在介绍FrameBuffer画图之前,先来看下绘图坐标系,微雪RP2040这块板子屏幕的分辨率是240x240,但这个屏幕是圆形的,因此圆形意外的位置是无法显示的,在绘制图形时,需要将绘图位置落在圆形的区域内。
圆形屏幕的有效显示范围如下图中的黄色亮部所示:
2.1 指定颜色填满整个帧缓冲区
#使用指定颜色填满整个帧缓冲区
FrameBuffer.fill(c)
2.2 画单个像素点
#若未给定c,则获取指定像素的色值。若给定c,将指定像素设置到给定颜色
FrameBuffer.pixel(x, y[, c])
测试程序:
from machine import Pin,I2C,SPI,PWM,ADC
import mylcd
import time
class LCDDraw:
#LCD
LCD = mylcd.LCD_GC9A01A()
LCD.set_bl_pwm(65535)
def __init__(self):
print('%s __init__' % self.__class__.__name__)
def __del__(self):
print('%s __del__' % self.__class__.__name__)
def draw_title(self):
self.LCD.fill_rect(0,0,240,35,self.LCD.red)
self.LCD.text("RP2040-LCD-1.28",60,20,self.LCD.white)
def draw_pixel_test(self, t = 2):
self.LCD.fill(self.LCD.white)
self.draw_title()
for i in range(1, 10):
for x in range(20, 220, i):
self.LCD.pixel(x, 80 + (i-1)*10, self.LCD.green)
self.LCD.show()
self.LCD.show()
time.sleep(t)
#主函数
if __name__=='__main__':
DrawTest = LCDDraw()
while(True):
DrawTest.draw_pixel_test()
time.sleep(1000)
实测结果:
2.3 画直线
#画水平直线
FrameBuffer.hline(x, y, w, c)
#画竖直直线
FrameBuffer.vline(x, y, h, c)
#画两点间的直线
FrameBuffer.line(x1, y1, x2, y2, c)
测试程序1:
def draw_line_test(self, t = 2):
self.LCD.fill(self.LCD.white)
self.draw_title()
self.LCD.hline(50, 80, 100, self.LCD.red)
self.LCD.vline(50, 80, 100, self.LCD.blue)
self.LCD.line(50, 80, 80, 100, self.LCD.green)
self.LCD.show()
time.sleep(t)
实测结果:
测试程序2:
def draw_line_test2(self, t = 2):
self.LCD.fill(self.LCD.white)
self.draw_title()
for y in range(35, 205+1, 10):
self.LCD.hline(35, y, 170, self.LCD.red)
self.LCD.show()
time.sleep(0.1)
for x in range(35, 205+1, 10):
self.LCD.vline(x, 35, 170, self.LCD.blue)
self.LCD.show()
time.sleep(0.1)
self.LCD.show()
time.sleep(t)
实测结果:
动图:
点击上图查看Gif动图
2.4 画矩形
#画矩形
FrameBuffer.rect(x, y, w, h, c)
#填充矩形
FrameBuffer.fill_rect(x, y, w, h, c)
测试程序1:
def draw_rect_test(self, t = 2):
self.LCD.fill(self.LCD.white)
self.draw_title()
self.LCD.rect(100, 100, 30, 10, self.LCD.blue)
self.LCD.fill_rect(100, 150, 30, 10, self.LCD.green)
self.LCD.show()
time.sleep(t)
实测结果:
测试程序2:
def draw_rect_test2(self, t = 2):
self.LCD.fill(self.LCD.white)
self.draw_title()
for i in range(1, 85, 3):
x = 120 - i
y = 120 - i
self.LCD.fill_rect(x, y, i*2, i*2, self.LCD.yellow)
time.sleep(0.1)
self.LCD.show()
self.LCD.fill(self.LCD.white)
self.draw_title()
for i in range(85, 1, -3):
x = 120 - i
y = 120 - i
self.LCD.rect(x, y, i*2, i*2, self.LCD.yellow)
time.sleep(0.1)
self.LCD.show()
self.LCD.show()
time.sleep(t)
实测结果:
点击上图查看Gif动图
3 FrameBuffer绘制文本与其它函数
3.1 绘制文本
使用坐标作为文本的左上角,将文本写入帧缓冲区。文本颜色可由任意参数定义,否则将保持其默认值1。所有字符都有8x8像素的尺寸,目前尚无办法改变字体。
FrameBuffer.text(s, x, y[, c])
测试程序:
def draw_time_test(self):
self.LCD.fill(self.LCD.white)
self.draw_title()
cnt = 0
minute = 0
second = 0
for i in range(1, 100):
cnt = cnt + 1
if cnt == 60:
minute = minute + 1
cnt = 0
second = cnt
timestr = "%02d:%02d" % (minute, second)
self.LCD.fill_rect(100, 125, 40, 8, self.LCD.white)
self.LCD.text(timestr,100,125,self.LCD.blue)
self.LCD.show()
time.sleep(1)
实测结果:
3.2 其他类函数
#使用给定向量转换帧缓冲区的内容。这可能会在帧缓冲区中留下之前颜色的覆盖区。
FrameBuffer.scroll(xstep, ystep)
#在当前帧缓冲区的顶部的给定坐标下绘制另外一个帧缓冲区。若指定key,则其应为一个颜色整数,且相应颜色被认为是透明的:所有具有该色值的像素都不会被绘制。
FrameBuffer.blit(fbuf, x, y[, key])
这些函数在绘制图片的时候会用到,绘制图片的功能还没研究透,下次介绍图片绘制时再详细介绍。
3.3 一些常量
-
framebuf.MONO_VLSB:单色(1位)颜色模式
此模式定义了一个映射,其中一个字节的位为垂直映射,而0位位于屏幕的最顶部。因此,每个字节占据8个垂直像素。 后续字节在连续的水平位置出现,直至到达最右侧的边缘。更多字节从最左边开始低8个像素显示。
-
framebuf.MONO_HLSB:单色(1位)颜色模式
此模式定义了一个映射,其中一个字节的位为水平映射。每个字节占据8个水平像素,0位位于最左边。 后续字节在连续的水平位置出现,直至到达最右侧的边缘。更多字节在下一行低1个像素显示。
-
framebuf.MONO_HMSB:单色(1位)颜色模式
此模式定义了一个映射,其中一个字节的位为水平映射。每个字节占据8个水平像素,而7位位于屏幕的最左边。 后续字节在连续的水平位置出现,直至到达最右侧的边缘。更多字节在下一行低1个像素显示。
-
framebuf.RGB565:RGB565彩色(16位,5+6+5)颜色模式
-
framebuf.GS2_HMSB:灰度(2位)颜色模式
-
framebuf.GS4_HMSB:灰度(4位)颜色模式
-
framebuf.GS8:灰度(8位)颜色模式
4 总结
本篇介绍了 MicroPython中使用FrameBuffer库进行基本功能的画图,包括画像素点、直线、矩形等,并在RP2040上进行了实测和演示。