| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- # -*- coding:UTF-8 -*-
- ##
- # | file : LCD_1IN44.py
- # | version : V2.0
- # | date : 2018-07-16
- # | function : On the ST7735S chip driver and clear screen, drawing lines, drawing, writing
- # and other functions to achieve
- #
- # Permission is hereby granted, free of charge, to any person obtaining a copy
- # of this software and associated documnetation files (the "Software"), to deal
- # in the Software without restriction, including without limitation the rights
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- # copies of the Software, and to permit persons to whom the Software is
- # furished to do so, subject to the following conditions:
- #
- # The above copyright notice and this permission notice shall be included in
- # all copies or substantial portions of the Software.
- #
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- # THE SOFTWARE.
- #
- import LCD_Config
- import RPi.GPIO as GPIO
- import time
- import numpy as np
- LCD_1IN44 = 1
- LCD_1IN8 = 0
- if LCD_1IN44 == 1:
- LCD_WIDTH = 128 #LCD width
- LCD_HEIGHT = 128 #LCD height
- LCD_X = 2
- LCD_Y = 1
- if LCD_1IN8 == 1:
- LCD_WIDTH = 160
- LCD_HEIGHT = 128
- LCD_X = 1
- LCD_Y = 2
- LCD_X_MAXPIXEL = 132 #LCD width maximum memory
- LCD_Y_MAXPIXEL = 162 #LCD height maximum memory
- #scanning method
- L2R_U2D = 1
- L2R_D2U = 2
- R2L_U2D = 3
- R2L_D2U = 4
- U2D_L2R = 5
- U2D_R2L = 6
- D2U_L2R = 7
- D2U_R2L = 8
- SCAN_DIR_DFT = U2D_R2L
- class LCD:
- def __init__(self):
- self.width = LCD_WIDTH
- self.height = LCD_HEIGHT
- self.LCD_Scan_Dir = SCAN_DIR_DFT
- self.LCD_X_Adjust = LCD_X
- self.LCD_Y_Adjust = LCD_Y
- """ Hardware reset """
- def LCD_Reset(self):
- GPIO.output(LCD_Config.LCD_RST_PIN, GPIO.HIGH)
- LCD_Config.Driver_Delay_ms(100)
- GPIO.output(LCD_Config.LCD_RST_PIN, GPIO.LOW)
- LCD_Config.Driver_Delay_ms(100)
- GPIO.output(LCD_Config.LCD_RST_PIN, GPIO.HIGH)
- LCD_Config.Driver_Delay_ms(100)
- """ Write register address and data """
- def LCD_WriteReg(self, Reg):
- GPIO.output(LCD_Config.LCD_DC_PIN, GPIO.LOW)
- LCD_Config.SPI_Write_Byte([Reg])
- def LCD_WriteData_8bit(self, Data):
- GPIO.output(LCD_Config.LCD_DC_PIN, GPIO.HIGH)
- LCD_Config.SPI_Write_Byte([Data])
- def LCD_WriteData_NLen16Bit(self, Data, DataLen):
- GPIO.output(LCD_Config.LCD_DC_PIN, GPIO.HIGH)
- for i in range(0, DataLen):
- LCD_Config.SPI_Write_Byte([Data >> 8])
- LCD_Config.SPI_Write_Byte([Data & 0xff])
-
- """ Common register initialization """
- def LCD_InitReg(self):
- #ST7735R Frame Rate
- self.LCD_WriteReg(0xB1)
- self.LCD_WriteData_8bit(0x01)
- self.LCD_WriteData_8bit(0x2C)
- self.LCD_WriteData_8bit(0x2D)
- self.LCD_WriteReg(0xB2)
- self.LCD_WriteData_8bit(0x01)
- self.LCD_WriteData_8bit(0x2C)
- self.LCD_WriteData_8bit(0x2D)
- self.LCD_WriteReg(0xB3)
- self.LCD_WriteData_8bit(0x01)
- self.LCD_WriteData_8bit(0x2C)
- self.LCD_WriteData_8bit(0x2D)
- self.LCD_WriteData_8bit(0x01)
- self.LCD_WriteData_8bit(0x2C)
- self.LCD_WriteData_8bit(0x2D)
-
- #Column inversion
- self.LCD_WriteReg(0xB4)
- self.LCD_WriteData_8bit(0x07)
-
- #ST7735R Power Sequence
- self.LCD_WriteReg(0xC0)
- self.LCD_WriteData_8bit(0xA2)
- self.LCD_WriteData_8bit(0x02)
- self.LCD_WriteData_8bit(0x84)
- self.LCD_WriteReg(0xC1)
- self.LCD_WriteData_8bit(0xC5)
- self.LCD_WriteReg(0xC2)
- self.LCD_WriteData_8bit(0x0A)
- self.LCD_WriteData_8bit(0x00)
- self.LCD_WriteReg(0xC3)
- self.LCD_WriteData_8bit(0x8A)
- self.LCD_WriteData_8bit(0x2A)
- self.LCD_WriteReg(0xC4)
- self.LCD_WriteData_8bit(0x8A)
- self.LCD_WriteData_8bit(0xEE)
-
- self.LCD_WriteReg(0xC5)#VCOM
- self.LCD_WriteData_8bit(0x0E)
-
- #ST7735R Gamma Sequence
- self.LCD_WriteReg(0xe0)
- self.LCD_WriteData_8bit(0x0f)
- self.LCD_WriteData_8bit(0x1a)
- self.LCD_WriteData_8bit(0x0f)
- self.LCD_WriteData_8bit(0x18)
- self.LCD_WriteData_8bit(0x2f)
- self.LCD_WriteData_8bit(0x28)
- self.LCD_WriteData_8bit(0x20)
- self.LCD_WriteData_8bit(0x22)
- self.LCD_WriteData_8bit(0x1f)
- self.LCD_WriteData_8bit(0x1b)
- self.LCD_WriteData_8bit(0x23)
- self.LCD_WriteData_8bit(0x37)
- self.LCD_WriteData_8bit(0x00)
- self.LCD_WriteData_8bit(0x07)
- self.LCD_WriteData_8bit(0x02)
- self.LCD_WriteData_8bit(0x10)
- self.LCD_WriteReg(0xe1)
- self.LCD_WriteData_8bit(0x0f)
- self.LCD_WriteData_8bit(0x1b)
- self.LCD_WriteData_8bit(0x0f)
- self.LCD_WriteData_8bit(0x17)
- self.LCD_WriteData_8bit(0x33)
- self.LCD_WriteData_8bit(0x2c)
- self.LCD_WriteData_8bit(0x29)
- self.LCD_WriteData_8bit(0x2e)
- self.LCD_WriteData_8bit(0x30)
- self.LCD_WriteData_8bit(0x30)
- self.LCD_WriteData_8bit(0x39)
- self.LCD_WriteData_8bit(0x3f)
- self.LCD_WriteData_8bit(0x00)
- self.LCD_WriteData_8bit(0x07)
- self.LCD_WriteData_8bit(0x03)
- self.LCD_WriteData_8bit(0x10)
-
- #Enable test command
- self.LCD_WriteReg(0xF0)
- self.LCD_WriteData_8bit(0x01)
-
- #Disable ram power save mode
- self.LCD_WriteReg(0xF6)
- self.LCD_WriteData_8bit(0x00)
-
- #65k mode
- self.LCD_WriteReg(0x3A)
- self.LCD_WriteData_8bit(0x05)
- #********************************************************************************
- #function: Set the display scan and color transfer modes
- #parameter:
- # Scan_dir : Scan direction
- # Colorchose : RGB or GBR color format
- #********************************************************************************
- def LCD_SetGramScanWay(self, Scan_dir):
- #Get the screen scan direction
- self.LCD_Scan_Dir = Scan_dir
-
- #Get GRAM and LCD width and height
- if (Scan_dir == L2R_U2D) or (Scan_dir == L2R_D2U) or (Scan_dir == R2L_U2D) or (Scan_dir == R2L_D2U) :
- self.width = LCD_HEIGHT
- self.height = LCD_WIDTH
- if Scan_dir == L2R_U2D:
- MemoryAccessReg_Data = 0X00 | 0x00
- elif Scan_dir == L2R_D2U:
- MemoryAccessReg_Data = 0X00 | 0x80
- elif Scan_dir == R2L_U2D:
- MemoryAccessReg_Data = 0x40 | 0x00
- else: #R2L_D2U:
- MemoryAccessReg_Data = 0x40 | 0x80
- else:
- self.width = LCD_WIDTH
- self.height = LCD_HEIGHT
- if Scan_dir == U2D_L2R:
- MemoryAccessReg_Data = 0X00 | 0x00 | 0x20
- elif Scan_dir == U2D_R2L:
- MemoryAccessReg_Data = 0X00 | 0x40 | 0x20
- elif Scan_dir == D2U_L2R:
- MemoryAccessReg_Data = 0x80 | 0x00 | 0x20
- else: #R2L_D2U
- MemoryAccessReg_Data = 0x40 | 0x80 | 0x20
-
- #please set (MemoryAccessReg_Data & 0x10) != 1
- if (MemoryAccessReg_Data & 0x10) != 1:
- self.LCD_X_Adjust = LCD_Y
- self.LCD_Y_Adjust = LCD_X
- else:
- self.LCD_X_Adjust = LCD_X
- self.LCD_Y_Adjust = LCD_Y
-
- # Set the read / write scan direction of the frame memory
- self.LCD_WriteReg(0x36) #MX, MY, RGB mode
- if LCD_1IN44 == 1:
- self.LCD_WriteData_8bit( MemoryAccessReg_Data | 0x08) #0x08 set RGB
- else:
- self.LCD_WriteData_8bit( MemoryAccessReg_Data & 0xf7) #RGB color filter panel
- #/********************************************************************************
- #function:
- # initialization
- #********************************************************************************/
- def LCD_Init(self, Lcd_ScanDir):
- if (LCD_Config.GPIO_Init() != 0):
- return -1
-
- #Turn on the backlight
- GPIO.output(LCD_Config.LCD_BL_PIN,GPIO.HIGH)
-
- #Hardware reset
- self.LCD_Reset()
-
- #Set the initialization register
- self.LCD_InitReg()
-
- #Set the display scan and color transfer modes
- self.LCD_SetGramScanWay(Lcd_ScanDir)
- LCD_Config.Driver_Delay_ms(200)
-
- #sleep out
- self.LCD_WriteReg(0x11)
- LCD_Config.Driver_Delay_ms(120)
-
- #Turn on the LCD display
- self.LCD_WriteReg(0x29)
- def LCD_Backlight(self, on):
- if on==True:
- GPIO.output(LCD_Config.LCD_BL_PIN,GPIO.HIGH)
- #GPIO.output(LCD_Config.LCD_DC_PIN,GPIO.HIGH)
- else:
- GPIO.output(LCD_Config.LCD_BL_PIN,GPIO.LOW)
- #GPIO.output(LCD_Config.LCD_DC_PIN,GPIO.LOW)
-
- #/********************************************************************************
- #function: Sets the start position and size of the display area
- #parameter:
- # Xstart : X direction Start coordinates
- # Ystart : Y direction Start coordinates
- # Xend : X direction end coordinates
- # Yend : Y direction end coordinates
- #********************************************************************************/
- def LCD_SetWindows(self, Xstart, Ystart, Xend, Yend):
- #set the X coordinates
- self.LCD_WriteReg(0x2A)
- self.LCD_WriteData_8bit(0x00)
- self.LCD_WriteData_8bit((Xstart & 0xff) + self.LCD_X_Adjust)
- self.LCD_WriteData_8bit(0x00)
- self.LCD_WriteData_8bit(((Xend - 1) & 0xff) + self.LCD_X_Adjust)
- #set the Y coordinates
- self.LCD_WriteReg (0x2B)
- self.LCD_WriteData_8bit(0x00)
- self.LCD_WriteData_8bit((Ystart & 0xff) + self.LCD_Y_Adjust)
- self.LCD_WriteData_8bit(0x00)
- self.LCD_WriteData_8bit(((Yend - 1) & 0xff )+ self.LCD_Y_Adjust)
- self.LCD_WriteReg(0x2C)
- def LCD_Clear(self):
- #hello
- _buffer = [0xff]*(self.width * self.height * 2)
- self.LCD_SetWindows(0, 0, self.width, self.height)
- GPIO.output(LCD_Config.LCD_DC_PIN, GPIO.HIGH)
- for i in range(0,len(_buffer),4096):
- LCD_Config.SPI_Write_Byte(_buffer[i:i+4096])
- def LCD_ShowImage(self,Image,Xstart,Ystart):
- if (Image == None):
- return
- imwidth, imheight = Image.size
- if imwidth != self.width or imheight != self.height:
- raise ValueError('Image must be same dimensions as display \
- ({0}x{1}).' .format(self.width, self.height))
- img = np.asarray(Image)
- pix = np.zeros((self.width,self.height,2), dtype = np.uint8)
- pix[...,[0]] = np.add(np.bitwise_and(img[...,[0]],0xF8),np.right_shift(img[...,[1]],5))
- pix[...,[1]] = np.add(np.bitwise_and(np.left_shift(img[...,[1]],3),0xE0),np.right_shift(img[...,[2]],3))
- pix = pix.flatten().tolist()
- self.LCD_SetWindows(0, 0, self.width , self.height)
- GPIO.output(LCD_Config.LCD_DC_PIN, GPIO.HIGH)
- for i in range(0,len(pix),4096):
- LCD_Config.SPI_Write_Byte(pix[i:i+4096])
|