gfxlcd/gfxlcd/driver/ili9325/ili9325.py
2017-07-08 20:07:42 +02:00

215 lines
7.1 KiB
Python

"""ILI9325 chip driver"""
import time
from gfxlcd.drawing.area import Area
from gfxlcd.abstract.chip import Chip
class ILI9325(Area, Chip):
"""Class for ILI9325 based LCD"""
rotations = {
0: {
'output': 0x0100,
'mode': 0x1030,
'output2': 0xa700
},
90: {
'output': 0x0000,
'mode': 0x1038,
'output2': 0xa700
},
180: {
'output': 0x0000,
'mode': 0x1030,
'output2': 0x2700
},
270: {
'output': 0x0100,
'mode': 0x1038,
'output2': 0x2700
}
}
def __init__(self, width, height, driver):
Chip.__init__(self, width, height, driver, True)
Area.__init__(self, driver)
def _convert_color(self, color):
"""color from 8-8-8 to 5-6-5"""
rgb = color['R'] << 16 | \
color['G'] << 8 | \
color['B']
return ((rgb & 0x00f80000) >> 8) |\
((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3)
def init(self):
"""init display"""
self.driver.init()
Area.init(self)
Chip.init(self)
self.driver.reset()
# ************* ILI9325C/D **********
# set SS and SM bit
self.driver.cmd(0x0001, None)
self.driver.data(self.rotations[self.rotation]['output'], None)
# set 1 line inversion
self.driver.cmd(0x0002, None)
self.driver.data(0x0200, None)
# set GRAM write direction and BGR=1
self.driver.cmd(0x0003, None)
self.driver.data(self.rotations[self.rotation]['mode'], None)
# Resize register
self.driver.cmd(0x0004, None)
self.driver.data(0x0000, None)
# set the back porch and front porch
self.driver.cmd(0x0008, None)
self.driver.data(0x0207, None)
# set non-display area refresh cycle ISC[3:0]
self.driver.cmd(0x0009, None)
self.driver.data(0x0000, None)
# FMARK function
self.driver.cmd(0x000A, None)
self.driver.data(0x0000, None)
# RGB interface setting
self.driver.cmd(0x000C, None)
self.driver.data(0x0000, None)
# Frame marker Position
self.driver.cmd(0x000D, None)
self.driver.data(0x0000, None)
# RGB interface polarity
self.driver.cmd(0x000F, None)
self.driver.data(0x0000, None)
# ************* Power On sequence ****************
# SAP, BT[3:0], AP, DSTB, SLP, STB
self.driver.cmd(0x0010, None)
self.driver.data(0x0000, None)
# DC1[2:0], DC0[2:0], VC[2:0]
self.driver.cmd(0x0011, None)
self.driver.data(0x0007, None)
# VREG1OUT voltage
self.driver.cmd(0x0012, None)
self.driver.data(0x0000, None)
# VDV[4:0] for VCOM amplitude
self.driver.cmd(0x0013, None)
self.driver.data(0x0000, None)
self.driver.cmd(0x0007, None)
self.driver.data(0x0001, None)
time.sleep(0.2) # Dis-charge capacitor power voltage
# SAP, BT[3:0], AP, DSTB, SLP, STB
self.driver.cmd(0x0010, None)
self.driver.data(0x1690, None)
# Set DC1[2:0], DC0[2:0], VC[2:0]
self.driver.cmd(0x0011, None)
self.driver.data(0x0227, None)
time.sleep(0.05)
self.driver.cmd(0x0012, None)
self.driver.data(0x000D, None)
time.sleep(0.05)
# VDV[4:0] for VCOM amplitude
self.driver.cmd(0x0013, None)
self.driver.data(0x1200, None)
# 04 VCM[5:0] for VCOMH
self.driver.cmd(0x0029, None)
self.driver.data(0x000A, None)
# Set Frame Rate
self.driver.cmd(0x002B, None)
self.driver.data(0x000D, None)
time.sleep(0.05)
# GRAM horizontal Address
self.driver.cmd(0x0020, None)
self.driver.data(0x0000, None)
# GRAM Vertical Address
self.driver.cmd(0x0021, None)
self.driver.data(0x0000, None)
# ************* Adjust the Gamma Curve *************
self.driver.cmd(0x0030, None)
self.driver.data(0x0000, None)
self.driver.cmd(0x0031, None)
self.driver.data(0x0404, None)
self.driver.cmd(0x0032, None)
self.driver.data(0x0003, None)
self.driver.cmd(0x0035, None)
self.driver.data(0x0405, None)
self.driver.cmd(0x0036, None)
self.driver.data(0x0808, None)
self.driver.cmd(0x0037, None)
self.driver.data(0x0407, None)
self.driver.cmd(0x0038, None)
self.driver.data(0x0303, None)
self.driver.cmd(0x0039, None)
self.driver.data(0x0707, None)
self.driver.cmd(0x003C, None)
self.driver.data(0x0504, None)
self.driver.cmd(0x003D, None)
self.driver.data(0x0808, None)
# ************* Set GRAM area *************
# Horizontal GRAM Start Address
self.driver.cmd(0x0050, None)
self.driver.data(0x0000, None)
# Horizontal GRAM End Address
self.driver.cmd(0x0051, None)
self.driver.data(0x00EF, None)
# Vertical GRAM Start Address
self.driver.cmd(0x0052, None)
self.driver.data(0x0000, None)
# Vertical GRAM Start Address
self.driver.cmd(0x0053, None)
self.driver.data(0x013F, None)
# Gate Scan Line
self.driver.cmd(0x0060, None)
self.driver.data(self.rotations[self.rotation]['output2'], None)
# NDL, VLE, REV
self.driver.cmd(0x0061, None)
self.driver.data(0x0001, None)
# set scrolling line
self.driver.cmd(0x006A, None)
self.driver.data(0x0000, None)
# ************* Partial Display Control *************
self.driver.cmd(0x0080, None)
self.driver.data(0x0000, None)
self.driver.cmd(0x0081, None)
self.driver.data(0x0000, None)
self.driver.cmd(0x0082, None)
self.driver.data(0x0000, None)
self.driver.cmd(0x0083, None)
self.driver.data(0x0000, None)
self.driver.cmd(0x0084, None)
self.driver.data(0x0000, None)
self.driver.cmd(0x0085, None)
self.driver.data(0x0000, None)
# ************* Panel Control *************
self.driver.cmd(0x0090, None)
self.driver.data(0x0010, None)
self.driver.cmd(0x0092, None)
self.driver.data(0x0000, None)
# 262K color and display ON
self.driver.cmd(0x0007, None)
self.driver.data(0x0133, None)
def _set_area(self, pos_x1, pos_y1, pos_x2, pos_y2):
"""select area to work with"""
if self.rotation == 90 or self.rotation == 270:
pos_x1, pos_y1, pos_x2, pos_y2 = pos_y1, pos_x1, pos_y2, pos_x2
self.driver.cmd(0x0020, None)
self.driver.data(pos_x1, None)
self.driver.cmd(0x0021, None)
self.driver.data(pos_y1, None)
self.driver.cmd(0x0050, None)
self.driver.data(pos_x1, None)
self.driver.cmd(0x0052, None)
self.driver.data(pos_y1, None)
self.driver.cmd(0x0051, None)
self.driver.data(pos_x2, None)
self.driver.cmd(0x0053, None)
self.driver.data(pos_y2, None)
self.driver.cmd(0x0022, None)