Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python .睡眠(0.500) 定义初始化(自): #初始化显示。作为一个单独的函数进行分解,以便 #将来将被其他显示覆盖。 自我命令(ST7735#U SWRESET)#软件重置 时间。睡眠(0.150)#延迟150毫秒 自我命令(ST7735_SLPOUT)#脱离睡眠模式 睡眠时间(0.500)#延迟500毫秒 self.command(ST7735_FRMCTR1)#帧速率控制-正常模式 自身数据(0x01)#速率=fosc/(1x2+40)*(直线+2C+2D) 自身数据(0x2C) self.data(0x2D) self.command(ST7735_FRMCTR2)#帧速率控制-空闲模式 自身数据(0x01)#速率=fosc/(1x2+40)*(直线+2C+2D) 自身数据(0x2C) self.data(0x2D) self.command(ST7735_FRMCTR3)#帧速率控制-部分模式 自身数据(0x01)#点反转模式 自身数据(0x2C) self.data(0x2D) 自数据(0x01)#线反转模式 自身数据(0x2C) self.data(0x2D) self.command(ST7735_INVCTR)#Display inversion ctrl 自身数据(0x07)#无反转 自我命令(ST7735_PWCTR1)#电源控制 self.data(0xA2) 自身数据(0x02)#-4.6V 自数据(0x84)#自动模式 自我命令(ST7735_PWCTR2)#电源控制 自身数据(0x0A)#运算放大器电流小 自数据(0x00)#升压频率 自我命令(ST7735_PWCTR4)#电源控制 自身数据(0x8A)#BCLK/2,运算放大器电流中小型低 自身数据(0x2A) 自我命令(ST7735_PWCTR5)#电源控制 自身数据(0x8A) self.data(0xEE) 自我命令(ST7735_VMCTR1)#电源控制 自身数据(0x0E) self.command(ST7735_INVOFF)#不反转显示 自我命令(ST7735_MADCTL)#内存访问控制(方向) self.data(0xC8)#行地址/列地址,从下到上刷新 self.command(ST7735_COLMOD)#设置颜色模式 自身数据(0x05)#16位颜色 # 自我命令(ST7735_CASET)#列地址集 self.data(0x00)#XSTART=0 自身数据(0x00) self.data(0x00)#XEND=127 自身数据(0x7F) self.command(ST7735_RASET)#Row addr set self.data(0x00)#XSTART=0 自身数据(0x00) 自身数据(0x00)#XEND=159 自身数据(0x9F) # 自我命令(ST7735_GMCTRP1)#设置伽马 self.data(0x02) 自身数据(0x1c) 自身数据(0x07) self.data(0x12) self.data(0x37) self.data(0x32) self.data(0x29) self.data(0x2d) self.data(0x29) self.data(0x25) 自身数据(0x2B) self.data(0x39) 自身数据(0x00) self.data(0x01) 自身数据(0x03) self.data(0x10) 自我命令(ST7735_GMCTRN1)#设置伽马 自身数据(0x03) 自身数据(0x1d) 自身数据(0x07) 自身数据(0x06) 自我数据(0x2E) 自身数据(0x2C) self.data(0x29) self.data(0x2D) 自我数据(0x2E) 自我数据(0x2E) self.data(0x37) 自我数据(0x3F) 自身数据(0x00) 自身数据(0x00) self.data(0x02) self.data(0x10) 自我命令(ST7735_NORON)#正常显示打开 时间。睡眠(0.10)#10毫秒 自我命令(ST7735_DISPON)#显示打开 睡眠时间(0.100)#100毫秒 def begin(自我): “”“初始化显示。应在调用其他调用之前调用一次 与显示器交互称为。 """ self.reset() self._init() def set_窗口(自身,x0=0,y0=0,x1=None,y1=None): “”“为继续绘图命令设置像素地址窗口。x0和 x1应定义最小和最大x像素边界。y0和y1 应定义最小和最大y像素边界。如果没有参数 如果指定,则默认情况下将从0,0更新整个显示 到宽度-1,高度-1。 """ 如果x1为无: x1=自身宽度-1 如果y1为无: y1=自身高度-1 自我命令(ST7735_CASET)#列地址集 self.data(x0>>8) self.data(x0)#XSTART 自我数据(x1>>8) 自我数据(x1)#XEND self.command(ST7735_RASET)#Row addr set 自我数据(y0>>8) 自我数据(y0)#开始 自我数据(y1>>8) 自我数据(y1)#是 self.command(ST7735#u RAMWR)#写入RAM def显示(自身,图像=无): “”“将显示缓冲区或提供的映像写入硬件。如果否 如果提供图像参数,则显示缓冲区将写入 硬件。如果提供图像,则应为RGB格式,并且 与显示硬件尺寸相同。 """ #默认情况下,将内部缓冲区写入显示器。 如果图像为无: image=self.buffer #将地址边界设置为整个显示。 self.set_window() #将图像转换为16位565 RGB数据字节的数组。 #不幸的是,这个拷贝必须发生,但是SPI字节写入 #函数需要获取一个字节数组,而PIL不是本机生成的 #以16位565 RGB格式存储图像。 像素字节=列表(图像到数据(图像)) #将数据写入硬件。 self.data(像素字节) def清除(自身,颜色=(0,0,0)): “”“将图像缓冲区清除为指定的RGB颜色(默认黑色)。” 宽度、高度=self.buffer.size self.buffer.putdata([颜色]*(宽度*高度)) def牵引(自): “”“返回图像缓冲区上2D绘图的PIL ImageDraw实例。”“” 返回ImageDraw.Draw(self.buffer)_Python_Numpy_Raspberry Pi2_Display - Fatal编程技术网 >8) self.data(x0)#XSTART 自我数据(x1>>8) 自我数据(x1)#XEND self.command(ST7735_RASET)#Row addr set 自我数据(y0>>8) 自我数据(y0)#开始 自我数据(y1>>8) 自我数据(y1)#是 self.command(ST7735#u RAMWR)#写入RAM def显示(自身,图像=无): “”“将显示缓冲区或提供的映像写入硬件。如果否 如果提供图像参数,则显示缓冲区将写入 硬件。如果提供图像,则应为RGB格式,并且 与显示硬件尺寸相同。 """ #默认情况下,将内部缓冲区写入显示器。 如果图像为无: image=self.buffer #将地址边界设置为整个显示。 self.set_window() #将图像转换为16位565 RGB数据字节的数组。 #不幸的是,这个拷贝必须发生,但是SPI字节写入 #函数需要获取一个字节数组,而PIL不是本机生成的 #以16位565 RGB格式存储图像。 像素字节=列表(图像到数据(图像)) #将数据写入硬件。 self.data(像素字节) def清除(自身,颜色=(0,0,0)): “”“将图像缓冲区清除为指定的RGB颜色(默认黑色)。” 宽度、高度=self.buffer.size self.buffer.putdata([颜色]*(宽度*高度)) def牵引(自): “”“返回图像缓冲区上2D绘图的PIL ImageDraw实例。”“” 返回ImageDraw.Draw(self.buffer),python,numpy,raspberry-pi2,display,Python,Numpy,Raspberry Pi2,Display" /> >8) self.data(x0)#XSTART 自我数据(x1>>8) 自我数据(x1)#XEND self.command(ST7735_RASET)#Row addr set 自我数据(y0>>8) 自我数据(y0)#开始 自我数据(y1>>8) 自我数据(y1)#是 self.command(ST7735#u RAMWR)#写入RAM def显示(自身,图像=无): “”“将显示缓冲区或提供的映像写入硬件。如果否 如果提供图像参数,则显示缓冲区将写入 硬件。如果提供图像,则应为RGB格式,并且 与显示硬件尺寸相同。 """ #默认情况下,将内部缓冲区写入显示器。 如果图像为无: image=self.buffer #将地址边界设置为整个显示。 self.set_window() #将图像转换为16位565 RGB数据字节的数组。 #不幸的是,这个拷贝必须发生,但是SPI字节写入 #函数需要获取一个字节数组,而PIL不是本机生成的 #以16位565 RGB格式存储图像。 像素字节=列表(图像到数据(图像)) #将数据写入硬件。 self.data(像素字节) def清除(自身,颜色=(0,0,0)): “”“将图像缓冲区清除为指定的RGB颜色(默认黑色)。” 宽度、高度=self.buffer.size self.buffer.putdata([颜色]*(宽度*高度)) def牵引(自): “”“返回图像缓冲区上2D绘图的PIL ImageDraw实例。”“” 返回ImageDraw.Draw(self.buffer),python,numpy,raspberry-pi2,display,Python,Numpy,Raspberry Pi2,Display" />

Python .睡眠(0.500) 定义初始化(自): #初始化显示。作为一个单独的函数进行分解,以便 #将来将被其他显示覆盖。 自我命令(ST7735#U SWRESET)#软件重置 时间。睡眠(0.150)#延迟150毫秒 自我命令(ST7735_SLPOUT)#脱离睡眠模式 睡眠时间(0.500)#延迟500毫秒 self.command(ST7735_FRMCTR1)#帧速率控制-正常模式 自身数据(0x01)#速率=fosc/(1x2+40)*(直线+2C+2D) 自身数据(0x2C) self.data(0x2D) self.command(ST7735_FRMCTR2)#帧速率控制-空闲模式 自身数据(0x01)#速率=fosc/(1x2+40)*(直线+2C+2D) 自身数据(0x2C) self.data(0x2D) self.command(ST7735_FRMCTR3)#帧速率控制-部分模式 自身数据(0x01)#点反转模式 自身数据(0x2C) self.data(0x2D) 自数据(0x01)#线反转模式 自身数据(0x2C) self.data(0x2D) self.command(ST7735_INVCTR)#Display inversion ctrl 自身数据(0x07)#无反转 自我命令(ST7735_PWCTR1)#电源控制 self.data(0xA2) 自身数据(0x02)#-4.6V 自数据(0x84)#自动模式 自我命令(ST7735_PWCTR2)#电源控制 自身数据(0x0A)#运算放大器电流小 自数据(0x00)#升压频率 自我命令(ST7735_PWCTR4)#电源控制 自身数据(0x8A)#BCLK/2,运算放大器电流中小型低 自身数据(0x2A) 自我命令(ST7735_PWCTR5)#电源控制 自身数据(0x8A) self.data(0xEE) 自我命令(ST7735_VMCTR1)#电源控制 自身数据(0x0E) self.command(ST7735_INVOFF)#不反转显示 自我命令(ST7735_MADCTL)#内存访问控制(方向) self.data(0xC8)#行地址/列地址,从下到上刷新 self.command(ST7735_COLMOD)#设置颜色模式 自身数据(0x05)#16位颜色 # 自我命令(ST7735_CASET)#列地址集 self.data(0x00)#XSTART=0 自身数据(0x00) self.data(0x00)#XEND=127 自身数据(0x7F) self.command(ST7735_RASET)#Row addr set self.data(0x00)#XSTART=0 自身数据(0x00) 自身数据(0x00)#XEND=159 自身数据(0x9F) # 自我命令(ST7735_GMCTRP1)#设置伽马 self.data(0x02) 自身数据(0x1c) 自身数据(0x07) self.data(0x12) self.data(0x37) self.data(0x32) self.data(0x29) self.data(0x2d) self.data(0x29) self.data(0x25) 自身数据(0x2B) self.data(0x39) 自身数据(0x00) self.data(0x01) 自身数据(0x03) self.data(0x10) 自我命令(ST7735_GMCTRN1)#设置伽马 自身数据(0x03) 自身数据(0x1d) 自身数据(0x07) 自身数据(0x06) 自我数据(0x2E) 自身数据(0x2C) self.data(0x29) self.data(0x2D) 自我数据(0x2E) 自我数据(0x2E) self.data(0x37) 自我数据(0x3F) 自身数据(0x00) 自身数据(0x00) self.data(0x02) self.data(0x10) 自我命令(ST7735_NORON)#正常显示打开 时间。睡眠(0.10)#10毫秒 自我命令(ST7735_DISPON)#显示打开 睡眠时间(0.100)#100毫秒 def begin(自我): “”“初始化显示。应在调用其他调用之前调用一次 与显示器交互称为。 """ self.reset() self._init() def set_窗口(自身,x0=0,y0=0,x1=None,y1=None): “”“为继续绘图命令设置像素地址窗口。x0和 x1应定义最小和最大x像素边界。y0和y1 应定义最小和最大y像素边界。如果没有参数 如果指定,则默认情况下将从0,0更新整个显示 到宽度-1,高度-1。 """ 如果x1为无: x1=自身宽度-1 如果y1为无: y1=自身高度-1 自我命令(ST7735_CASET)#列地址集 self.data(x0>>8) self.data(x0)#XSTART 自我数据(x1>>8) 自我数据(x1)#XEND self.command(ST7735_RASET)#Row addr set 自我数据(y0>>8) 自我数据(y0)#开始 自我数据(y1>>8) 自我数据(y1)#是 self.command(ST7735#u RAMWR)#写入RAM def显示(自身,图像=无): “”“将显示缓冲区或提供的映像写入硬件。如果否 如果提供图像参数,则显示缓冲区将写入 硬件。如果提供图像,则应为RGB格式,并且 与显示硬件尺寸相同。 """ #默认情况下,将内部缓冲区写入显示器。 如果图像为无: image=self.buffer #将地址边界设置为整个显示。 self.set_window() #将图像转换为16位565 RGB数据字节的数组。 #不幸的是,这个拷贝必须发生,但是SPI字节写入 #函数需要获取一个字节数组,而PIL不是本机生成的 #以16位565 RGB格式存储图像。 像素字节=列表(图像到数据(图像)) #将数据写入硬件。 self.data(像素字节) def清除(自身,颜色=(0,0,0)): “”“将图像缓冲区清除为指定的RGB颜色(默认黑色)。” 宽度、高度=self.buffer.size self.buffer.putdata([颜色]*(宽度*高度)) def牵引(自): “”“返回图像缓冲区上2D绘图的PIL ImageDraw实例。”“” 返回ImageDraw.Draw(self.buffer)

Python .睡眠(0.500) 定义初始化(自): #初始化显示。作为一个单独的函数进行分解,以便 #将来将被其他显示覆盖。 自我命令(ST7735#U SWRESET)#软件重置 时间。睡眠(0.150)#延迟150毫秒 自我命令(ST7735_SLPOUT)#脱离睡眠模式 睡眠时间(0.500)#延迟500毫秒 self.command(ST7735_FRMCTR1)#帧速率控制-正常模式 自身数据(0x01)#速率=fosc/(1x2+40)*(直线+2C+2D) 自身数据(0x2C) self.data(0x2D) self.command(ST7735_FRMCTR2)#帧速率控制-空闲模式 自身数据(0x01)#速率=fosc/(1x2+40)*(直线+2C+2D) 自身数据(0x2C) self.data(0x2D) self.command(ST7735_FRMCTR3)#帧速率控制-部分模式 自身数据(0x01)#点反转模式 自身数据(0x2C) self.data(0x2D) 自数据(0x01)#线反转模式 自身数据(0x2C) self.data(0x2D) self.command(ST7735_INVCTR)#Display inversion ctrl 自身数据(0x07)#无反转 自我命令(ST7735_PWCTR1)#电源控制 self.data(0xA2) 自身数据(0x02)#-4.6V 自数据(0x84)#自动模式 自我命令(ST7735_PWCTR2)#电源控制 自身数据(0x0A)#运算放大器电流小 自数据(0x00)#升压频率 自我命令(ST7735_PWCTR4)#电源控制 自身数据(0x8A)#BCLK/2,运算放大器电流中小型低 自身数据(0x2A) 自我命令(ST7735_PWCTR5)#电源控制 自身数据(0x8A) self.data(0xEE) 自我命令(ST7735_VMCTR1)#电源控制 自身数据(0x0E) self.command(ST7735_INVOFF)#不反转显示 自我命令(ST7735_MADCTL)#内存访问控制(方向) self.data(0xC8)#行地址/列地址,从下到上刷新 self.command(ST7735_COLMOD)#设置颜色模式 自身数据(0x05)#16位颜色 # 自我命令(ST7735_CASET)#列地址集 self.data(0x00)#XSTART=0 自身数据(0x00) self.data(0x00)#XEND=127 自身数据(0x7F) self.command(ST7735_RASET)#Row addr set self.data(0x00)#XSTART=0 自身数据(0x00) 自身数据(0x00)#XEND=159 自身数据(0x9F) # 自我命令(ST7735_GMCTRP1)#设置伽马 self.data(0x02) 自身数据(0x1c) 自身数据(0x07) self.data(0x12) self.data(0x37) self.data(0x32) self.data(0x29) self.data(0x2d) self.data(0x29) self.data(0x25) 自身数据(0x2B) self.data(0x39) 自身数据(0x00) self.data(0x01) 自身数据(0x03) self.data(0x10) 自我命令(ST7735_GMCTRN1)#设置伽马 自身数据(0x03) 自身数据(0x1d) 自身数据(0x07) 自身数据(0x06) 自我数据(0x2E) 自身数据(0x2C) self.data(0x29) self.data(0x2D) 自我数据(0x2E) 自我数据(0x2E) self.data(0x37) 自我数据(0x3F) 自身数据(0x00) 自身数据(0x00) self.data(0x02) self.data(0x10) 自我命令(ST7735_NORON)#正常显示打开 时间。睡眠(0.10)#10毫秒 自我命令(ST7735_DISPON)#显示打开 睡眠时间(0.100)#100毫秒 def begin(自我): “”“初始化显示。应在调用其他调用之前调用一次 与显示器交互称为。 """ self.reset() self._init() def set_窗口(自身,x0=0,y0=0,x1=None,y1=None): “”“为继续绘图命令设置像素地址窗口。x0和 x1应定义最小和最大x像素边界。y0和y1 应定义最小和最大y像素边界。如果没有参数 如果指定,则默认情况下将从0,0更新整个显示 到宽度-1,高度-1。 """ 如果x1为无: x1=自身宽度-1 如果y1为无: y1=自身高度-1 自我命令(ST7735_CASET)#列地址集 self.data(x0>>8) self.data(x0)#XSTART 自我数据(x1>>8) 自我数据(x1)#XEND self.command(ST7735_RASET)#Row addr set 自我数据(y0>>8) 自我数据(y0)#开始 自我数据(y1>>8) 自我数据(y1)#是 self.command(ST7735#u RAMWR)#写入RAM def显示(自身,图像=无): “”“将显示缓冲区或提供的映像写入硬件。如果否 如果提供图像参数,则显示缓冲区将写入 硬件。如果提供图像,则应为RGB格式,并且 与显示硬件尺寸相同。 """ #默认情况下,将内部缓冲区写入显示器。 如果图像为无: image=self.buffer #将地址边界设置为整个显示。 self.set_window() #将图像转换为16位565 RGB数据字节的数组。 #不幸的是,这个拷贝必须发生,但是SPI字节写入 #函数需要获取一个字节数组,而PIL不是本机生成的 #以16位565 RGB格式存储图像。 像素字节=列表(图像到数据(图像)) #将数据写入硬件。 self.data(像素字节) def清除(自身,颜色=(0,0,0)): “”“将图像缓冲区清除为指定的RGB颜色(默认黑色)。” 宽度、高度=self.buffer.size self.buffer.putdata([颜色]*(宽度*高度)) def牵引(自): “”“返回图像缓冲区上2D绘图的PIL ImageDraw实例。”“” 返回ImageDraw.Draw(self.buffer),python,numpy,raspberry-pi2,display,Python,Numpy,Raspberry Pi2,Display,这是我的问题:显示器边缘有一个死像素带,右边是2像素宽,底部是3像素宽。我试着修补一下 from PIL import Image import ST7735 as TFT import Adafruit_GPIO as GPIO import Adafruit_GPIO.SPI as SPI import time import os WIDTH = 128 HEIGHT = 128 SPEED_HZ = 32000000 # Raspberry Pi configuration. DC

这是我的问题:显示器边缘有一个死像素带,右边是2像素宽,底部是3像素宽。我试着修补一下
from PIL import Image
import ST7735 as TFT
import Adafruit_GPIO as GPIO
import Adafruit_GPIO.SPI as SPI
import time
import os

WIDTH = 128
HEIGHT = 128
SPEED_HZ = 32000000

# Raspberry Pi configuration.
DC = 24
RST = 25
SPI_PORT = 0
SPI_DEVICE = 0

# Create TFT LCD display class.
disp = TFT.ST7735(
    DC,
    rst=RST,
    spi=SPI.SpiDev(
        SPI_PORT,
        SPI_DEVICE,
        max_speed_hz=SPEED_HZ))

# Initialize display.
disp.begin()

image =Image.open('image1.GIF')
try:
    while 1:
        image.seek(image.tell()+1)
        disp.display(image)
        if(image.tell()==242):
            image.seek(0)
            time.sleep(2)
except EOFError:
    pass
import numbers
import time
import numpy as np

from PIL import Image
from PIL import ImageDraw

import Adafruit_GPIO as GPIO
import Adafruit_GPIO.SPI as SPI


# SPI_CLOCK_HZ = 64000000 # 64 MHz
SPI_CLOCK_HZ = 32000000 # 32 MHz


# Constants for interacting with display registers.
ST7735_TFTWIDTH    = 128
ST7735_TFTHEIGHT   = 160

ST7735_NOP         = 0x00
ST7735_SWRESET     = 0x01
ST7735_RDDID       = 0x04
ST7735_RDDST       = 0x09

ST7735_SLPIN       = 0x10
ST7735_SLPOUT      = 0x11
ST7735_PTLON       = 0x12
ST7735_NORON       = 0x13

# ILI9341_RDMODE      = 0x0A
# ILI9341_RDMADCTL    = 0x0B
# ILI9341_RDPIXFMT    = 0x0C
# ILI9341_RDIMGFMT    = 0x0A
# ILI9341_RDSELFDIAG  = 0x0F

ST7735_INVOFF      = 0x20
ST7735_INVON       = 0x21
# ILI9341_GAMMASET    = 0x26
ST7735_DISPOFF     = 0x28
ST7735_DISPON      = 0x29

ST7735_CASET       = 0x2A
ST7735_RASET       = 0x2B
ST7735_RAMWR       = 0x2C
ST7735_RAMRD       = 0x2E

ST7735_PTLAR       = 0x30
ST7735_MADCTL      = 0x36
# ST7735_PIXFMT      = 0x3A
ST7735_COLMOD       = 0x3A

ST7735_FRMCTR1     = 0xB1
ST7735_FRMCTR2     = 0xB2
ST7735_FRMCTR3     = 0xB3
ST7735_INVCTR      = 0xB4
# ILI9341_DFUNCTR     = 0xB6
ST7735_DISSET5      = 0xB6


ST7735_PWCTR1      = 0xC0
ST7735_PWCTR2      = 0xC1
ST7735_PWCTR3      = 0xC2
ST7735_PWCTR4      = 0xC3
ST7735_PWCTR5      = 0xC4
ST7735_VMCTR1      = 0xC5
# ILI9341_VMCTR2      = 0xC7

ST7735_RDID1       = 0xDA
ST7735_RDID2       = 0xDB
ST7735_RDID3       = 0xDC
ST7735_RDID4       = 0xDD

ST7735_GMCTRP1     = 0xE0
ST7735_GMCTRN1     = 0xE1

ST7735_PWCTR6      = 0xFC

# Colours for convenience
ST7735_BLACK       = 0x0000 # 0b 00000 000000 00000
ST7735_BLUE        = 0x001F # 0b 00000 000000 11111
ST7735_GREEN       = 0x07E0 # 0b 00000 111111 00000
ST7735_RED         = 0xF800 # 0b 11111 000000 00000
ST7735_CYAN        = 0x07FF # 0b 00000 111111 11111
ST7735_MAGENTA     = 0xF81F # 0b 11111 000000 11111
ST7735_YELLOW      = 0xFFE0 # 0b 11111 111111 00000
ST7735_WHITE       = 0xFFFF # 0b 11111 111111 11111


def color565(r, g, b):
    """Convert red, green, blue components to a 16-bit 565 RGB value. Components
    should be values 0 to 255.
    """
    return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)

def image_to_data(image):
    """Generator function to convert a PIL image to 16-bit 565 RGB bytes."""
    # NumPy is much faster at doing this. NumPy code provided by:
    # Keith (https://www.blogger.com/profile/02555547344016007163)
    pb = np.array(image.convert('RGB')).astype('uint16')
    color = ((pb[:,:,0] & 0xF8) << 8) | ((pb[:,:,1] & 0xFC) << 3) | (pb[:,:,2] >> 3)
    return np.dstack(((color >> 8) & 0xFF, color & 0xFF)).flatten().tolist()

class ST7735(object):
    """Representation of an ST7735 TFT LCD."""

    def __init__(self, dc, spi, rst=None, gpio=None, width=ST7735_TFTWIDTH,
        height=ST7735_TFTHEIGHT):
        """Create an instance of the display using SPI communication.  Must
        provide the GPIO pin number for the D/C pin and the SPI driver.  Can
        optionally provide the GPIO pin number for the reset pin as the rst
        parameter.
        """
        self._dc = dc
        self._rst = rst
        self._spi = spi
        self._gpio = gpio
        self.width = width
        self.height = height
        if self._gpio is None:
            self._gpio = GPIO.get_platform_gpio()
        # Set DC as output.
        self._gpio.setup(dc, GPIO.OUT)
        # Setup reset as output (if provided).
        if rst is not None:
            self._gpio.setup(rst, GPIO.OUT)
        # Set SPI to mode 0, MSB first.
        spi.set_mode(0)
        spi.set_bit_order(SPI.MSBFIRST)
        spi.set_clock_hz(SPI_CLOCK_HZ)
        # Create an image buffer.
        self.buffer = Image.new('RGB', (width, height))

    def send(self, data, is_data=True, chunk_size=4096):
        """Write a byte or array of bytes to the display. Is_data parameter
        controls if byte should be interpreted as display data (True) or command
        data (False).  Chunk_size is an optional size of bytes to write in a
        single SPI transaction, with a default of 4096.
        """
        # Set DC low for command, high for data.
        self._gpio.output(self._dc, is_data)
        # Convert scalar argument to list so either can be passed as parameter.
        if isinstance(data, numbers.Number):
            data = [data & 0xFF]
        # Write data a chunk at a time.
        for start in range(0, len(data), chunk_size):
            end = min(start+chunk_size, len(data))
            self._spi.write(data[start:end])

    def command(self, data):
        """Write a byte or array of bytes to the display as command data."""
        self.send(data, False)

    def data(self, data):
        """Write a byte or array of bytes to the display as display data."""
        self.send(data, True)

    def reset(self):
        """Reset the display, if reset pin is connected."""
        if self._rst is not None:
            self._gpio.set_high(self._rst)
            time.sleep(0.500)
            self._gpio.set_low(self._rst)
            time.sleep(0.500)
            self._gpio.set_high(self._rst)
            time.sleep(0.500)

    def _init(self):
        # Initialize the display.  Broken out as a separate function so it can
        # be overridden by other displays in the future.

        self.command(ST7735_SWRESET) # Software reset
        time.sleep(0.150) # delay 150 ms

        self.command(ST7735_SLPOUT) # Out of sleep mode
        time.sleep(0.500) # delay 500 ms

        self.command(ST7735_FRMCTR1) # Frame rate ctrl - normal mode
        self.data(0x01) # Rate = fosc/(1x2+40) * (LINE+2C+2D)
        self.data(0x2C)
        self.data(0x2D)

        self.command(ST7735_FRMCTR2) # Frame rate ctrl - idle mode
        self.data(0x01) # Rate = fosc/(1x2+40) * (LINE+2C+2D)
        self.data(0x2C)
        self.data(0x2D)

        self.command(ST7735_FRMCTR3) # Frame rate ctrl - partial mode
        self.data(0x01) # Dot inversion mode
        self.data(0x2C)
        self.data(0x2D)
        self.data(0x01) # Line inversion mode
        self.data(0x2C)
        self.data(0x2D)

        self.command(ST7735_INVCTR) # Display inversion ctrl
        self.data(0x07) # No inversion

        self.command(ST7735_PWCTR1) # Power control
        self.data(0xA2)
        self.data(0x02) # -4.6V
        self.data(0x84) # auto mode

        self.command(ST7735_PWCTR2) # Power control
        self.data(0x0A) # Opamp current small
        self.data(0x00) # Boost frequency

        self.command(ST7735_PWCTR4) # Power control
        self.data(0x8A) # BCLK/2, Opamp current small & Medium low
        self.data(0x2A)

        self.command(ST7735_PWCTR5) # Power control
        self.data(0x8A)
        self.data(0xEE)

        self.command(ST7735_VMCTR1) # Power control
        self.data(0x0E)

        self.command(ST7735_INVOFF) # Don't invert display

        self.command(ST7735_MADCTL) # Memory access control (directions)
        self.data(0xC8) # row addr/col addr, bottom to top refresh

        self.command(ST7735_COLMOD) # set color mode
        self.data(0x05) # 16-bit color

        #

        self.command(ST7735_CASET) # Column addr set
        self.data(0x00) # XSTART = 0
        self.data(0x00)
        self.data(0x00) # XEND = 127
        self.data(0x7F)

        self.command(ST7735_RASET) # Row addr set
        self.data(0x00) # XSTART = 0
        self.data(0x00)
        self.data(0x00) # XEND = 159
        self.data(0x9F)

        #

        self.command(ST7735_GMCTRP1) # Set Gamma
        self.data(0x02)
        self.data(0x1c)
        self.data(0x07)
        self.data(0x12)
        self.data(0x37)
        self.data(0x32)
        self.data(0x29)
        self.data(0x2d)
        self.data(0x29)
        self.data(0x25)
        self.data(0x2B)
        self.data(0x39)
        self.data(0x00)
        self.data(0x01)
        self.data(0x03)
        self.data(0x10)

        self.command(ST7735_GMCTRN1) # Set Gamma
        self.data(0x03)
        self.data(0x1d)
        self.data(0x07)
        self.data(0x06)
        self.data(0x2E)
        self.data(0x2C)
        self.data(0x29)
        self.data(0x2D)
        self.data(0x2E)
        self.data(0x2E)
        self.data(0x37)
        self.data(0x3F)
        self.data(0x00)
        self.data(0x00)
        self.data(0x02)
        self.data(0x10)

        self.command(ST7735_NORON) # Normal display on
        time.sleep(0.10) # 10 ms

        self.command(ST7735_DISPON) # Display on
        time.sleep(0.100) # 100 ms

    def begin(self):
        """Initialize the display.  Should be called once before other calls that
        interact with the display are called.
        """
        self.reset()
        self._init()

    def set_window(self, x0=0, y0=0, x1=None, y1=None):
        """Set the pixel address window for proceeding drawing commands. x0 and
        x1 should define the minimum and maximum x pixel bounds.  y0 and y1
        should define the minimum and maximum y pixel bound.  If no parameters
        are specified the default will be to update the entire display from 0,0
        to width-1,height-1.
        """
        if x1 is None:
            x1 = self.width-1
        if y1 is None:
            y1 = self.height-1
        self.command(ST7735_CASET)        # Column addr set
        self.data(x0 >> 8)
        self.data(x0)                    # XSTART
        self.data(x1 >> 8)
        self.data(x1)                    # XEND
        self.command(ST7735_RASET)        # Row addr set
        self.data(y0 >> 8)
        self.data(y0)                    # YSTART
        self.data(y1 >> 8)
        self.data(y1)                    # YEND
        self.command(ST7735_RAMWR)        # write to RAM

    def display(self, image=None):
        """Write the display buffer or provided image to the hardware.  If no
        image parameter is provided the display buffer will be written to the
        hardware.  If an image is provided, it should be RGB format and the
        same dimensions as the display hardware.
        """
        # By default write the internal buffer to the display.
        if image is None:
            image = self.buffer
        # Set address bounds to entire display.
        self.set_window()
        # Convert image to array of 16bit 565 RGB data bytes.
        # Unfortunate that this copy has to occur, but the SPI byte writing
        # function needs to take an array of bytes and PIL doesn't natively
        # store images in 16-bit 565 RGB format.
        pixelbytes = list(image_to_data(image))
        # Write data to hardware.
        self.data(pixelbytes)

    def clear(self, color=(0,0,0)):
        """Clear the image buffer to the specified RGB color (default black)."""
        width, height = self.buffer.size
        self.buffer.putdata([color]*(width*height))

    def draw(self):
        """Return a PIL ImageDraw instance for 2D drawing on the image buffer."""
        return ImageDraw.Draw(self.buffer)