Python控制ST7735S全彩液晶屏
ST7735S是一块1.8英寸,采用SPI通信的TFT全彩液晶屏。
图形显示底层原理与黑白屏基本相同,但此处由于需要显示出不同的颜色则需要区分不同色号,常采用的编码格式为RGB565,共16bit编码(高五位为Red,中间六位为Green,低五位为Blue)。
由于ST7735S采用SPI通信,而CodPi的语音控制与其用到了几个相同的引脚,因此使用ST7735S时需要先关掉语音控制功能的使用,否则可能会出现屏幕花屏等现象。
动态正弦波绘制
- 像画笔一样,以不同绘制速度,在液晶屏上逐点画出幅度、频率、初相、颜色不同的正弦波。
def draw_sine_wave(self,amplitude, frequency, phase_shift, color, speed): for x in range(self.width): y = int((amplitude * math.sin(frequency * x + phase_shift)) + self.height // 2) self.pixel(x,y,color) self.show() time.sleep_ms(speed)
绘制结果:
彩色图片显示
由于原理相同,考虑将黑白屏的图片显示函数迁移过来,此处可以显示出相应图片,但由于没有指定颜色参数,这里函数默认将颜色设置为
c=1,在屏幕上显示为绿色。代码如下:def blit(self,x,y,res='code',dir='fonts/',invert=False,align='center'): # if not in os.listdir():return # if not res in os.listdir(dir):return try: with open(dir+res,'rb') as f: height = ord(f.read(1)) width = ord(f.read(1)) if align == 'center': x = x - int(width/2) y = y - int(height/2) for w in range(width): for h in range(height): code = ord(f.read(1)) for i in range(8): if code &(1 << i): self.pixel(x + w, y + i + h * 8, not invert) else: self.pixel(x + w, y + i + h * 8, invert) except: pass为了引入颜色参数,我们需要一种能够指定每个像素点的色号的图片数据文件,可以是.BMP,.jpeg等,此处以.BMP文件为例。对.BMP文件的解析显示函数如下所示(还未经过测试):
def rgb_to_rgb565(r, g, b): r = r >> 3 g = g >> 2 b = b >> 3 return (r << 11) | (g << 5) | bdef show_bmp(self,x,y,res='code',dir='fonts/',invert=False,align='center'): try: with open(dir+res,'rb') as f: # BMP文件头 14 Bytes bfType = unpack("<h", f.read(2))[0] # BMP bfSize = unpack("<i", f.read(4))[0] # 位图文件大小 bfReversed1 = unpack("<h", f.read(2))[0] # =0 bfReversed2 = unpack("<h", f.read(2))[0] # =0 bfOffBits = unpack("<i", f.read(4))[0] # 偏移量 # 位图信息头 40 Bytes biSize = unpack("<i",f.read(4))[0] # 所需字节数 biWidth = unpack("<i",f.read(4))[0] # 宽度 biHeight = unpack("<i",f.read(4))[0] # 高度 biPlanes = unpack("<h", f.read(2))[0] # 颜色平面数 biBitCount = unpack("<h", f.read(2))[0] # 比特数 biCompression = unpack("<i", f.read(4))[0] # 图像压缩的数据类型 biSizeImage = unpack("<i", f.read(4))[0] # 图像大小 biXPelsPerMeter = unpack("<i", f.read(4))[0]# 水平分辨率 biYPelsPerMeter = unpack("<i", f.read(4))[0]# 垂直分辨率 biClrUsed = unpack("<i", f.read(4))[0] # 实际使用的彩色表中的颜色索引数 biClrImportant = unpack("<i", f.read(4))[0] # 对图像显示有重要影响的颜色索引的数目 bmp_data = [] row_padded = (biWidth * 3 + 3) & ~3 for y in range(biHeight): for x in range(biWidth): b,g,r = unpack('BBB',f.read(3)) rgb = self.rgb_to_rgb565(r,g,b) self.pixel(x,y,rgb) f.read(row_padded - biWidth * 3) except: pass测试用.BMP文件下载地址如下:http://www.seafishpi.com/resources/tunapi/pic/baidu.bmp
作者:admin 创建时间:2024-03-20 15:21
最后编辑:zy.huang 更新时间:2024-07-17 11:01
最后编辑:zy.huang 更新时间:2024-07-17 11:01