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) | b
    def 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