Hi I,I have tested the spare unit I have here.. Its definitely an LI9341 320 x 240.
I'm doing that model as well so I'll crack on..
'Fuses definition.
#define CONFIG1L = 0x00
#define CONFIG1H = 0x38
#define CONFIG2L = 0x1E
#define CONFIG2H = 0x3C
#define CONFIG3L = 0x00
#define CONFIG3H = 0x3D
#define CONFIG4L = 0x80
#define CONFIG4H = 0x00
#define CONFIG5L = 0x0F
#define CONFIG5H = 0xC0
#define CONFIG6L = 0x0F
#define CONFIG6H = 0xE0
#define CONFIG7L = 0x0F
#define CONFIG7H = 0x40
#define CLOCK_FREQUENCY = 64 'Clock 64Mhz
#define STRING_MAX_LENGTH = 60
'#define SIMULATION_WAITMS_VALUE = 1
'************************************************
'*****************************************************
'lcd driver
Const ILI9341_NOP = 0x00
Const ILI9341_SWRESET = 0x01
Const ILI9341_RDDID = 0x04
Const ILI9341_RDDST = 0x09
Const ILI9341_SLPIN = 0x10
Const ILI9341_SLPOUT = 0x11
Const ILI9341_PTLON = 0x12
Const ILI9341_NORON = 0x13
Const ILI9341_INVOFF = 0x20
Const ILI9341_INVON = 0x21
Const ILI9341_DISPOFF = 0x28
Const ILI9341_DISPON = 0x29
Const ILI9341_CASET = 0x2a
Const ILI9341_RASET = 0x2b
Const ILI9341_RAMWR = 0x2c
Const ILI9341_RAMRD = 0x2e
Const ILI9341_PTLAR = 0x30
Const ILI9341_COLMOD = 0x3a
Const ILI9341_MADCTL = 0x36
Const ILI9341_DISP_FUNC = 0xB6
Const ILI9341_MADCTL_MY = 0x80
Const ILI9341_MADCTL_MX = 0x40
Const ILI9341_MADCTL_MV = 0x20
Const ILI9341_MADCTL_ML = 0x10
Const ILI9341_MADCTL_RGB = 0x00
Const ILI9341_RDID1 = 0xda
Const ILI9341_RDID2 = 0xdb
Const ILI9341_RDID3 = 0xdc
Const ILI9341_RDID4 = 0xdd
Const LCD_BLACK = 0x0000
Const LCD_RED = 0x001f
Const LCD_BLUE = 0xf800
Const LCD_GREEN = 0x07E0
Const LCD_YELLOW = 0x07ff
Const LCD_MAGENTA = 0xf81f
Const LCD_CYAN = 0xffe0
Const LCD_WHITE = 0xffff
Dim LCD_width As Word ///< Display width as modified by current rotation
Dim LCD_height As Word ///< Display height as modified by current rotation
Dim LCD_rotation As Byte ///< Display rotation (0 thru 3)
Symbol TFT_RST = PORTC.0 'RST RESET pin
Symbol TFT_DC = PORTC.1 'DC (SS) Data/Command pin
Symbol TFT_CS = PORTC.2 'CS Chip Select pin
Symbol TFT_SCK = PORTC.3 'SCK as output
Symbol TFT_SDI = PORTC.4 'SDI as input -> SDO
Symbol TFT_SDO = PORTC.5 'SDO as output -> SDI
'*************************************************
Dim x As Byte
OSCCON = 0x70
OSCTUNE.PLLEN = 1
TRISA.1 = 0
TRISC = 0
ADCON1 = 15
Call SPI_init()
Call LCD_init()
Main:
x = 1
While x = 1
WaitMs 300
LATA.1 = 1
Call fillScreen(LCD_RED)
WaitMs 300
LATA.1 = 0
Call fillwindow(10,10,310,230, LCD_BLUE)
WaitMs 300
LATA.1 = 1
Call fillwindow(10,10,310,230, LCD_GREEN)
WaitMs 300
LATA.1 = 0
Call fillScreen(LCD_WHITE)
Wend
End
Proc SPI_init()
SSPSTAT = 0x40
SSPCON1 = 0x31
End Proc
Proc LCD_WRITE_COM(dat As Byte)
TFT_CS = 0
TFT_DC = 0
SSPBUF = dat
While SSPSTAT.BF = 0
Wend
TFT_DC = 1
TFT_CS = 1
End Proc
Proc LCD_WRITE_DATA(dat As Byte)
TFT_CS = 0
TFT_DC = 1
SSPBUF = dat
While SSPSTAT.BF = 0
Wend
TFT_DC = 1
TFT_CS = 1
End Proc
Proc LCD_init()
Dim idx As Byte
Dim cmd As Byte
High TFT_RST
'ConfigPin TFT_RST = Output
WaitMs 100
Low TFT_RST
WaitMs 100
High TFT_RST
WaitMs 200
Call LCD_WRITE_COM(ILI9341_SWRESET)
WaitMs 150
Call LCD_WRITE_COM(ILI9341_DISPOFF)
Call LCD_WRITE_COM(0xCB) //Power control a
Call LCD_WRITE_DATA(0x39)
Call LCD_WRITE_DATA(0x2C)
Call LCD_WRITE_DATA(0x00)
Call LCD_WRITE_DATA(0x34)
Call LCD_WRITE_DATA(0x02)
WaitMs 1
Call LCD_WRITE_COM(0xCF) //Power control b
Call LCD_WRITE_DATA(0x00)
Call LCD_WRITE_DATA(0XC1)
Call LCD_WRITE_DATA(0X30)
WaitMs 1
Call LCD_WRITE_COM(0xE8) //Timing control a
Call LCD_WRITE_DATA(0x85)
Call LCD_WRITE_DATA(0x10)
Call LCD_WRITE_DATA(0x78)
WaitMs 1
Call LCD_WRITE_COM(0xEA) //Timing control b
Call LCD_WRITE_DATA(0x00)
Call LCD_WRITE_DATA(0x00)
WaitMs 1
Call LCD_WRITE_COM(0xED) //Power on seq control
Call LCD_WRITE_DATA(0x64)
Call LCD_WRITE_DATA(0x03)
Call LCD_WRITE_DATA(0X12)
Call LCD_WRITE_DATA(0X81)
//WaitMs 1
Call LCD_WRITE_COM(0xC0) //Power control 1
Call LCD_WRITE_DATA(0x26) //VRH[5:0]
//WaitMs 1
Call LCD_WRITE_COM(0xC1) //Power control 2
Call LCD_WRITE_DATA(0x11) //SAP[2:0];BT[3:0]
//WaitMs 1
Call LCD_WRITE_COM(0xC5) //VCM control
Call LCD_WRITE_DATA(0x3e) //Contrast
Call LCD_WRITE_DATA(0x28)
// WaitMs 1
Call LCD_WRITE_COM(0xF7)
Call LCD_WRITE_DATA(0x20)
//WaitMs 1
Call LCD_WRITE_COM(ILI9341_MADCTL)
Call LCD_WRITE_DATA(0x8)
Call LCD_WRITE_COM(ILI9341_INVOFF)
//WaitMs 1
Call LCD_WRITE_COM(ILI9341_NORON)
WaitMs 1
Call LCD_WRITE_COM(ILI9341_COLMOD )
Call LCD_WRITE_DATA(0x55)
//WaitMs 1
Call LCD_WRITE_COM(0xB7) //emtry mode
Call LCD_WRITE_DATA(0x07)
Call LCD_WRITE_COM(0x3A) //pixel format
Call LCD_WRITE_DATA(0x55) //16bit
Call LCD_WRITE_COM(ILI9341_DISP_FUNC) // Display Function Control
Call LCD_WRITE_DATA(0x08)
Call LCD_WRITE_DATA(0x82)
Call LCD_WRITE_DATA(0x27)
WaitMs 1
Call LCD_WRITE_COM(ILI9341_SLPOUT)
WaitMs 120
Call LCD_WRITE_COM(ILI9341_DISPON)
WaitMs 1
LCD_height = 240
LCD_width = 320
End Proc
'/**************************************************************************/
'@brief SPI displays set an address window rectangle For blitting pixels
'@param x Top left corner x coordinate
'@param y Top left corner x coordinate
'@param W Width of window
'@param h Height of window
'/**************************************************************************/
Proc setAddrWindow(x1 As Word, y1 As Word, x2 As Word, y2 As Word)
Call LCD_WRITE_COM(ILI9341_CASET) //Column addr set
Call LCD_WRITE_DATA(x1.HB)
Call LCD_WRITE_DATA(x1.LB)
Call LCD_WRITE_DATA(x2.HB)
Call LCD_WRITE_DATA(x2.LB)
Call LCD_WRITE_COM(ILI9341_RASET) //Row addr set
Call LCD_WRITE_DATA(y1.HB)
Call LCD_WRITE_DATA(y1.LB)
Call LCD_WRITE_DATA(y2.HB)
Call LCD_WRITE_DATA(y2.LB)
Call LCD_WRITE_COM(ILI9341_RAMWR) //write to RAM
End Proc
'/**************************************************************************/
Proc fillRect(x1 As Word, y1 As Word, x2 As Word, y2 As Word, color As Word)
Dim px As Long
Dim tmp As Word
If x2 > 0 And y2 > 0 Then //Nonzero width and height?
If x1 >= x2 Or y1 >= y2 Then Exit
tmp = x1 + x2 - 1
If tmp >= x2 Then x2 = x2 - x1
tmp = y1 + y2 - 1
If tmp >= y2 Then y2 = y2 - y1
Call setAddrWindow(x1, y1, x2, y2)
px = x2
px = px * y2
TFT_CS = 0
TFT_DC = 1
While px > 1
SSPBUF = color.HB
While SSPSTAT.BF = 0
Wend
SSPBUF = color.LB
While SSPSTAT.BF = 0
Wend
px = px - 1
Wend
TFT_DC = 1
TFT_CS = 1
Endif
End Proc
'/**************************************************************************/
'@brief Fill the screen completely with one color. Update in subclasses If desired!
'@param color 16-Bit 5-6-5 Color To fill with
'/**************************************************************************/
Proc fillScreen(color As Word)
Call fillRect(0, 0, LCD_width, LCD_height, color)
End Proc
Proc fillwindow(x1 As Word,y1 As Word,x2 As Word,y2 As Word,color As Word)
Call fillRect(x1, y1, x2, y2, color)
End Proc
Hi I,Hello!
Here is a skeletal ili9341 diver it works quite wel. However I have it on a pic18f46k22 on breadboard so I cannot achieve max SPI speed, so its on FOSC/16 at the moment... Again SPI MODE3 works the best.
Code:'Fuses definition. #define CONFIG1L = 0x00 #define CONFIG1H = 0x38 #define CONFIG2L = 0x1E #define CONFIG2H = 0x3C #define CONFIG3L = 0x00 #define CONFIG3H = 0x3D #define CONFIG4L = 0x80 #define CONFIG4H = 0x00 #define CONFIG5L = 0x0F #define CONFIG5H = 0xC0 #define CONFIG6L = 0x0F #define CONFIG6H = 0xE0 #define CONFIG7L = 0x0F #define CONFIG7H = 0x40 #define CLOCK_FREQUENCY = 64 'Clock 64Mhz #define STRING_MAX_LENGTH = 60 '#define SIMULATION_WAITMS_VALUE = 1 '************************************************ '***************************************************** 'lcd driver Const ILI9341_NOP = 0x00 Const ILI9341_SWRESET = 0x01 Const ILI9341_RDDID = 0x04 Const ILI9341_RDDST = 0x09 Const ILI9341_SLPIN = 0x10 Const ILI9341_SLPOUT = 0x11 Const ILI9341_PTLON = 0x12 Const ILI9341_NORON = 0x13 Const ILI9341_INVOFF = 0x20 Const ILI9341_INVON = 0x21 Const ILI9341_DISPOFF = 0x28 Const ILI9341_DISPON = 0x29 Const ILI9341_CASET = 0x2a Const ILI9341_RASET = 0x2b Const ILI9341_RAMWR = 0x2c Const ILI9341_RAMRD = 0x2e Const ILI9341_PTLAR = 0x30 Const ILI9341_COLMOD = 0x3a Const ILI9341_MADCTL = 0x36 Const ILI9341_DISP_FUNC = 0xB6 Const ILI9341_MADCTL_MY = 0x80 Const ILI9341_MADCTL_MX = 0x40 Const ILI9341_MADCTL_MV = 0x20 Const ILI9341_MADCTL_ML = 0x10 Const ILI9341_MADCTL_RGB = 0x00 Const ILI9341_RDID1 = 0xda Const ILI9341_RDID2 = 0xdb Const ILI9341_RDID3 = 0xdc Const ILI9341_RDID4 = 0xdd Const LCD_BLACK = 0x0000 Const LCD_RED = 0x001f Const LCD_BLUE = 0xf800 Const LCD_GREEN = 0x07E0 Const LCD_YELLOW = 0x07ff Const LCD_MAGENTA = 0xf81f Const LCD_CYAN = 0xffe0 Const LCD_WHITE = 0xffff Dim LCD_width As Word ///< Display width as modified by current rotation Dim LCD_height As Word ///< Display height as modified by current rotation Dim LCD_rotation As Byte ///< Display rotation (0 thru 3) Symbol TFT_RST = PORTC.0 'RST RESET pin Symbol TFT_DC = PORTC.1 'DC (SS) Data/Command pin Symbol TFT_CS = PORTC.2 'CS Chip Select pin Symbol TFT_SCK = PORTC.3 'SCK as output Symbol TFT_SDI = PORTC.4 'SDI as input -> SDO Symbol TFT_SDO = PORTC.5 'SDO as output -> SDI '************************************************* Dim x As Byte OSCCON = 0x70 OSCTUNE.PLLEN = 1 TRISA.1 = 0 TRISC = 0 ADCON1 = 15 Call SPI_init() Call LCD_init() Main: x = 1 While x = 1 WaitMs 300 LATA.1 = 1 Call fillScreen(LCD_RED) WaitMs 300 LATA.1 = 0 Call fillwindow(10,10,310,230, LCD_BLUE) WaitMs 300 LATA.1 = 1 Call fillwindow(10,10,310,230, LCD_GREEN) WaitMs 300 LATA.1 = 0 Call fillScreen(LCD_WHITE) Wend End Proc SPI_init() SSPSTAT = 0x40 SSPCON1 = 0x31 End Proc Proc LCD_WRITE_COM(dat As Byte) TFT_CS = 0 TFT_DC = 0 SSPBUF = dat While SSPSTAT.BF = 0 Wend TFT_DC = 1 TFT_CS = 1 End Proc Proc LCD_WRITE_DATA(dat As Byte) TFT_CS = 0 TFT_DC = 1 SSPBUF = dat While SSPSTAT.BF = 0 Wend TFT_DC = 1 TFT_CS = 1 End Proc Proc LCD_init() Dim idx As Byte Dim cmd As Byte High TFT_RST 'ConfigPin TFT_RST = Output WaitMs 100 Low TFT_RST WaitMs 100 High TFT_RST WaitMs 200 Call LCD_WRITE_COM(ILI9341_SWRESET) WaitMs 150 Call LCD_WRITE_COM(ILI9341_DISPOFF) Call LCD_WRITE_COM(0xCB) //Power control a Call LCD_WRITE_DATA(0x39) Call LCD_WRITE_DATA(0x2C) Call LCD_WRITE_DATA(0x00) Call LCD_WRITE_DATA(0x34) Call LCD_WRITE_DATA(0x02) WaitMs 1 Call LCD_WRITE_COM(0xCF) //Power control b Call LCD_WRITE_DATA(0x00) Call LCD_WRITE_DATA(0XC1) Call LCD_WRITE_DATA(0X30) WaitMs 1 Call LCD_WRITE_COM(0xE8) //Timing control a Call LCD_WRITE_DATA(0x85) Call LCD_WRITE_DATA(0x10) Call LCD_WRITE_DATA(0x78) WaitMs 1 Call LCD_WRITE_COM(0xEA) //Timing control b Call LCD_WRITE_DATA(0x00) Call LCD_WRITE_DATA(0x00) WaitMs 1 Call LCD_WRITE_COM(0xED) //Power on seq control Call LCD_WRITE_DATA(0x64) Call LCD_WRITE_DATA(0x03) Call LCD_WRITE_DATA(0X12) Call LCD_WRITE_DATA(0X81) //WaitMs 1 Call LCD_WRITE_COM(0xC0) //Power control 1 Call LCD_WRITE_DATA(0x26) //VRH[5:0] //WaitMs 1 Call LCD_WRITE_COM(0xC1) //Power control 2 Call LCD_WRITE_DATA(0x11) //SAP[2:0];BT[3:0] //WaitMs 1 Call LCD_WRITE_COM(0xC5) //VCM control Call LCD_WRITE_DATA(0x3e) //Contrast Call LCD_WRITE_DATA(0x28) // WaitMs 1 Call LCD_WRITE_COM(0xF7) Call LCD_WRITE_DATA(0x20) //WaitMs 1 Call LCD_WRITE_COM(ILI9341_MADCTL) Call LCD_WRITE_DATA(0x8) Call LCD_WRITE_COM(ILI9341_INVOFF) //WaitMs 1 Call LCD_WRITE_COM(ILI9341_NORON) WaitMs 1 Call LCD_WRITE_COM(ILI9341_COLMOD ) Call LCD_WRITE_DATA(0x55) //WaitMs 1 Call LCD_WRITE_COM(0xB7) //emtry mode Call LCD_WRITE_DATA(0x07) Call LCD_WRITE_COM(0x3A) //pixel format Call LCD_WRITE_DATA(0x55) //16bit Call LCD_WRITE_COM(ILI9341_DISP_FUNC) // Display Function Control Call LCD_WRITE_DATA(0x08) Call LCD_WRITE_DATA(0x82) Call LCD_WRITE_DATA(0x27) WaitMs 1 Call LCD_WRITE_COM(ILI9341_SLPOUT) WaitMs 120 Call LCD_WRITE_COM(ILI9341_DISPON) WaitMs 1 LCD_height = 240 LCD_width = 320 End Proc '/**************************************************************************/ '@brief SPI displays set an address window rectangle For blitting pixels '@param x Top left corner x coordinate '@param y Top left corner x coordinate '@param W Width of window '@param h Height of window '/**************************************************************************/ Proc setAddrWindow(x1 As Word, y1 As Word, x2 As Word, y2 As Word) Call LCD_WRITE_COM(ILI9341_CASET) //Column addr set Call LCD_WRITE_DATA(x1.HB) Call LCD_WRITE_DATA(x1.LB) Call LCD_WRITE_DATA(x2.HB) Call LCD_WRITE_DATA(x2.LB) Call LCD_WRITE_COM(ILI9341_RASET) //Row addr set Call LCD_WRITE_DATA(y1.HB) Call LCD_WRITE_DATA(y1.LB) Call LCD_WRITE_DATA(y2.HB) Call LCD_WRITE_DATA(y2.LB) Call LCD_WRITE_COM(ILI9341_RAMWR) //write to RAM End Proc '/**************************************************************************/ Proc fillRect(x1 As Word, y1 As Word, x2 As Word, y2 As Word, color As Word) Dim px As Long Dim tmp As Word If x2 > 0 And y2 > 0 Then //Nonzero width and height? If x1 >= x2 Or y1 >= y2 Then Exit tmp = x1 + x2 - 1 If tmp >= x2 Then x2 = x2 - x1 tmp = y1 + y2 - 1 If tmp >= y2 Then y2 = y2 - y1 Call setAddrWindow(x1, y1, x2, y2) px = x2 px = px * y2 TFT_CS = 0 TFT_DC = 1 While px > 1 SSPBUF = color.HB While SSPSTAT.BF = 0 Wend SSPBUF = color.LB While SSPSTAT.BF = 0 Wend px = px - 1 Wend TFT_DC = 1 TFT_CS = 1 Endif End Proc '/**************************************************************************/ '@brief Fill the screen completely with one color. Update in subclasses If desired! '@param color 16-Bit 5-6-5 Color To fill with '/**************************************************************************/ Proc fillScreen(color As Word) Call fillRect(0, 0, LCD_width, LCD_height, color) End Proc Proc fillwindow(x1 As Word,y1 As Word,x2 As Word,y2 As Word,color As Word) Call fillRect(x1, y1, x2, y2, color) End Proc
Proc LCD_DrawLine(x1 As Word, y1 As Word, x2 As Word, y2 As Word, color As Word)
Dim t As Word
Dim xerr, yerr, delta_x, delta_y, distance As Integer
Dim incx, incy, xPix, yPix As Integer
xerr = 0
yerr = 0
delta_x = x2 - x1
delta_y = y2 - y1
xPix = x1
yPix = y1
If delta_x > 0 Then incx = 1
If delta_x = 0 Then incx = 0
If delta_x < 0 Then
incx = -1
delta_x = -delta_x
Endif
If delta_y > 0 Then incy = 1
If delta_y = 0 Then incy = 0
If delta_y < 0 Then
incy = -1
delta_y = -delta_y
Endif
If delta_x > delta_y Then
distance = delta_x
Else
distance = delta_y
Endif
For t = 0 To distance + 1 Step 1
Call LCD_DrawPoint(xPix, yPix, color)
xerr = xerr + delta_x
yerr = yerr + delta_y
If xerr > distance Then
xerr = xerr - distance
xPix = xPix + incx
Endif
If yerr > distance Then
yerr = yerr - distance
yPix = yPix + incy
Endif
Next t
End Proc
// Rectangle
Proc LCD_DrawRectangle( x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer, color As Word)
Call LCD_DrawLine(x1, y1, x2, y1, color)
Call LCD_DrawLine(x1, y1, x1, y2, color)
Call LCD_DrawLine(x1, y2, x2, y2, color)
Call LCD_DrawLine(x2, y1, x2, y2, color)
End Proc
// Circle routine
Proc LCD_Circle(x1 As Word, y1 As Word, rad As Word, color As Word)
Dim xPix, yPix, di As Integer
xPix = 0
yPix = rad
di = 3 - ShiftLeft(rad,1)
While xPix <= yPix
Call LCD_DrawPoint(x1+xPix, y1-yPix, color)
Call LCD_DrawPoint(x1+yPix, y1-xPix, color)
Call LCD_DrawPoint(x1+yPix, y1+xPix, color)
Call LCD_DrawPoint(x1+xPix, y1+yPix, color)
Call LCD_DrawPoint(x1-xPix, y1+yPix, color)
Call LCD_DrawPoint(x1-yPix, y1+xPix, color)
Call LCD_DrawPoint(x1-xPix, y1-yPix, color)
Call LCD_DrawPoint(x1-yPix, y1-xPix, color)
xPix = xPix + 1
If di < 0 Then
di= (4 * xPix + 6) + di
Else
di= (10 + 4 * (xPix-yPix)) + di
yPix = yPix - 1
Endif
Wend
End Proc
// line drawing
Proc LCD_DrawPoint(x1 As Word, y1 As Word ,color As Word)
Call LCD_WRITE_COM(ILI9341_CASET) //Column addr set
Call LCD_WRITE_DATA(x1.HB)
Call LCD_WRITE_DATA(x1.LB)
Call LCD_WRITE_COM(ILI9341_RASET) //Row addr set
Call LCD_WRITE_DATA(y1.HB)
Call LCD_WRITE_DATA(y1.LB)
Call LCD_WRITE_COM(ILI9341_RAMWR) //write to RAM
Call LCD_WRITE_DATA(color.HB)
Call LCD_WRITE_DATA(color.LB)
End Proc
'Fuses definition.
#define CONFIG1L = 0x00
#define CONFIG1H = 0x38
#define CONFIG2L = 0x1E
#define CONFIG2H = 0x3C
#define CONFIG3L = 0x00
#define CONFIG3H = 0x3D
#define CONFIG4L = 0x80
#define CONFIG4H = 0x00
#define CONFIG5L = 0x0F
#define CONFIG5H = 0xC0
#define CONFIG6L = 0x0F
#define CONFIG6H = 0xE0
#define CONFIG7L = 0x0F
#define CONFIG7H = 0x40
#define CLOCK_FREQUENCY = 64 'Clock 64Mhz
#define STRING_MAX_LENGTH = 60
'#define SIMULATION_WAITMS_VALUE = 1
'************************************************
'*****************************************************
'lcd driver
Const ILI9341_NOP = 0x00
Const ILI9341_SWRESET = 0x01
Const ILI9341_RDDID = 0x04
Const ILI9341_RDDST = 0x09
Const ILI9341_SLPIN = 0x10
Const ILI9341_SLPOUT = 0x11
Const ILI9341_PTLON = 0x12
Const ILI9341_NORON = 0x13
Const ILI9341_INVOFF = 0x20
Const ILI9341_INVON = 0x21
Const ILI9341_DISPOFF = 0x28
Const ILI9341_DISPON = 0x29
Const ILI9341_CASET = 0x2a
Const ILI9341_RASET = 0x2b
Const ILI9341_RAMWR = 0x2c
Const ILI9341_RAMRD = 0x2e
Const ILI9341_PTLAR = 0x30
Const ILI9341_COLMOD = 0x3a
Const ILI9341_MADCTL = 0x36
Const ILI9341_DISP_FUNC = 0xB6
Const ILI9341_MADCTL_MY = 0x80
Const ILI9341_MADCTL_MX = 0x40
Const ILI9341_MADCTL_MV = 0x20
Const ILI9341_MADCTL_ML = 0x10
Const ILI9341_MADCTL_RGB = 0x00
Const ILI9341_RDID1 = 0xda
Const ILI9341_RDID2 = 0xdb
Const ILI9341_RDID3 = 0xdc
Const ILI9341_RDID4 = 0xdd
Const LCD_BLACK = 0x0000
Const LCD_RED = 0x001f
Const LCD_BLUE = 0xf800
Const LCD_GREEN = 0x07E0
Const LCD_YELLOW = 0x07ff
Const LCD_MAGENTA = 0xf81f
Const LCD_CYAN = 0xffe0
Const LCD_WHITE = 0xffff
Dim LCD_width As Word ///< Display width as modified by current rotation
Dim LCD_height As Word ///< Display height as modified by current rotation
Dim LCD_rotation As Byte ///< Display rotation (0 thru 3)
Symbol TFT_RST = PORTC.0 'RST RESET pin
Symbol TFT_DC = PORTC.1 'DC (SS) Data/Command pin
Symbol TFT_CS = PORTC.2 'CS Chip Select pin
Symbol TFT_SCK = PORTC.3 'SCK as output
Symbol TFT_SDI = PORTC.4 'SDI as input -> SDO
Symbol TFT_SDO = PORTC.5 'SDO as output -> SDI
'*************************************************
Dim x As Byte
OSCCON = 0x70
OSCTUNE.PLLEN = 1
TRISA.1 = 0
TRISC = 0
ADCON1 = 15
Call SPI_init()
Call LCD_init()
Main:
x = 1
While x = 1
WaitMs 300
LATA.1 = 1
Call fillScreen(LCD_RED)
WaitMs 300
LATA.1 = 0
Call fillwindow(10,10,310,230, LCD_BLUE)
WaitMs 300
LATA.1 = 1
Call fillwindow(10,10,310,230, LCD_GREEN)
WaitMs 300
LATA.1 = 0
Call fillScreen(LCD_WHITE)
Call LCD_DrawLine(10,10,310,230,LCD_BLACK)
Call LCD_DrawLine(310,10,10,230,LCD_BLACK)
Call LCD_DrawLine(10,120,310,120,LCD_BLACK)
Call LCD_DrawLine(160,10,160,230,LCD_BLACK)
Call LCD_Circle(160,120,100,LCD_BLUE)
Call fillwindow(100,50,220,190, LCD_WHITE)
Call LCD_DrawRectangle(100,50,220,190,LCD_BLUE)
WaitMs 1000
Wend
End
Proc SPI_init()
SSPSTAT = 0x40
SSPCON1 = 0x31
End Proc
Proc LCD_WRITE_COM(dat As Byte)
TFT_CS = 0
TFT_DC = 0
SSPBUF = dat
While SSPSTAT.BF = 0
Wend
TFT_DC = 1
TFT_CS = 1
End Proc
Proc LCD_WRITE_DATA(dat As Byte)
TFT_CS = 0
TFT_DC = 1
SSPBUF = dat
While SSPSTAT.BF = 0
Wend
TFT_DC = 1
TFT_CS = 1
End Proc
Proc LCD_init()
Dim idx As Byte
Dim cmd As Byte
High TFT_RST
'ConfigPin TFT_RST = Output
WaitMs 100
Low TFT_RST
WaitMs 100
High TFT_RST
WaitMs 200
Call LCD_WRITE_COM(ILI9341_SWRESET)
WaitMs 150
Call LCD_WRITE_COM(ILI9341_DISPOFF)
Call LCD_WRITE_COM(0xCB) //Power control a
Call LCD_WRITE_DATA(0x39)
Call LCD_WRITE_DATA(0x2C)
Call LCD_WRITE_DATA(0x00)
Call LCD_WRITE_DATA(0x34)
Call LCD_WRITE_DATA(0x02)
WaitMs 1
Call LCD_WRITE_COM(0xCF) //Power control b
Call LCD_WRITE_DATA(0x00)
Call LCD_WRITE_DATA(0XC1)
Call LCD_WRITE_DATA(0X30)
WaitMs 1
Call LCD_WRITE_COM(0xE8) //Timing control a
Call LCD_WRITE_DATA(0x85)
Call LCD_WRITE_DATA(0x10)
Call LCD_WRITE_DATA(0x78)
WaitMs 1
Call LCD_WRITE_COM(0xEA) //Timing control b
Call LCD_WRITE_DATA(0x00)
Call LCD_WRITE_DATA(0x00)
WaitMs 1
Call LCD_WRITE_COM(0xED) //Power on seq control
Call LCD_WRITE_DATA(0x64)
Call LCD_WRITE_DATA(0x03)
Call LCD_WRITE_DATA(0X12)
Call LCD_WRITE_DATA(0X81)
//WaitMs 1
Call LCD_WRITE_COM(0xC0) //Power control 1
Call LCD_WRITE_DATA(0x26) //VRH[5:0]
//WaitMs 1
Call LCD_WRITE_COM(0xC1) //Power control 2
Call LCD_WRITE_DATA(0x11) //SAP[2:0];BT[3:0]
//WaitMs 1
Call LCD_WRITE_COM(0xC5) //VCM control
Call LCD_WRITE_DATA(0x3e) //Contrast
Call LCD_WRITE_DATA(0x28)
// WaitMs 1
Call LCD_WRITE_COM(0xF7)
Call LCD_WRITE_DATA(0x20)
//WaitMs 1
Call LCD_WRITE_COM(ILI9341_MADCTL)
Call LCD_WRITE_DATA(0x8)
Call LCD_WRITE_COM(ILI9341_INVOFF)
//WaitMs 1
Call LCD_WRITE_COM(ILI9341_NORON)
WaitMs 1
Call LCD_WRITE_COM(ILI9341_COLMOD )
Call LCD_WRITE_DATA(0x55)
//WaitMs 1
Call LCD_WRITE_COM(0xB7) //emtry mode
Call LCD_WRITE_DATA(0x07)
Call LCD_WRITE_COM(0x3A) //pixel format
Call LCD_WRITE_DATA(0x55) //16bit
Call LCD_WRITE_COM(ILI9341_DISP_FUNC) // Display Function Control
Call LCD_WRITE_DATA(0x08)
Call LCD_WRITE_DATA(0x82)
Call LCD_WRITE_DATA(0x27)
WaitMs 1
Call LCD_WRITE_COM(ILI9341_SLPOUT)
WaitMs 120
Call LCD_WRITE_COM(ILI9341_DISPON)
WaitMs 1
LCD_height = 240
LCD_width = 320
End Proc
'/**************************************************************************/
'@brief SPI displays set an address window rectangle For blitting pixels
'@param x Top left corner x coordinate
'@param y Top left corner x coordinate
'@param W Width of window
'@param h Height of window
'/**************************************************************************/
Proc setAddrWindow(x1 As Word, y1 As Word, x2 As Word, y2 As Word)
Call LCD_WRITE_COM(ILI9341_CASET) //Column addr set
Call LCD_WRITE_DATA(x1.HB)
Call LCD_WRITE_DATA(x1.LB)
Call LCD_WRITE_DATA(x2.HB)
Call LCD_WRITE_DATA(x2.LB)
Call LCD_WRITE_COM(ILI9341_RASET) //Row addr set
Call LCD_WRITE_DATA(y1.HB)
Call LCD_WRITE_DATA(y1.LB)
Call LCD_WRITE_DATA(y2.HB)
Call LCD_WRITE_DATA(y2.LB)
Call LCD_WRITE_COM(ILI9341_RAMWR) //write to RAM
End Proc
Proc LCD_DrawLine(x1 As Word, y1 As Word, x2 As Word, y2 As Word, color As Word)
Dim t As Word
Dim xerr, yerr, delta_x, delta_y, distance As Integer
Dim incx, incy, xPix, yPix As Integer
xerr = 0
yerr = 0
delta_x = x2 - x1
delta_y = y2 - y1
xPix = x1
yPix = y1
If delta_x > 0 Then incx = 1
If delta_x = 0 Then incx = 0
If delta_x < 0 Then
incx = -1
delta_x = -delta_x
Endif
If delta_y > 0 Then incy = 1
If delta_y = 0 Then incy = 0
If delta_y < 0 Then
incy = -1
delta_y = -delta_y
Endif
If delta_x > delta_y Then
distance = delta_x
Else
distance = delta_y
Endif
For t = 0 To distance + 1 Step 1
Call LCD_DrawPoint(xPix, yPix, color)
xerr = xerr + delta_x
yerr = yerr + delta_y
If xerr > distance Then
xerr = xerr - distance
xPix = xPix + incx
Endif
If yerr > distance Then
yerr = yerr - distance
yPix = yPix + incy
Endif
Next t
End Proc
Proc LCD_String( str As String, x As Word, y As Word, size As Word , fcol As Word , bcol As Word)
Dim x0 As Integer
Dim width, height As Integer
Select Case size
Case 1
width = 5
height = 8
Case 2
width = 8
height = 12
Case 3
width = 16
height = 24
EndSelect
x0 = x
width+=x
height+=y
End Proc
// Rectangle
Proc LCD_DrawRectangle( x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer, color As Word)
Call LCD_DrawLine(x1, y1, x2, y1, color)
Call LCD_DrawLine(x1, y1, x1, y2, color)
Call LCD_DrawLine(x1, y2, x2, y2, color)
Call LCD_DrawLine(x2, y1, x2, y2, color)
End Proc
// Circle routine
Proc LCD_Circle(x1 As Word, y1 As Word, rad As Word, color As Word)
Dim xPix, yPix, di As Integer
xPix = 0
yPix = rad
di = 3 - ShiftLeft(rad,1)
While xPix <= yPix
Call LCD_DrawPoint(x1+xPix, y1-yPix, color)
Call LCD_DrawPoint(x1+yPix, y1-xPix, color)
Call LCD_DrawPoint(x1+yPix, y1+xPix, color)
Call LCD_DrawPoint(x1+xPix, y1+yPix, color)
Call LCD_DrawPoint(x1-xPix, y1+yPix, color)
Call LCD_DrawPoint(x1-yPix, y1+xPix, color)
Call LCD_DrawPoint(x1-xPix, y1-yPix, color)
Call LCD_DrawPoint(x1-yPix, y1-xPix, color)
xPix = xPix + 1
If di < 0 Then
di= (4 * xPix + 6) + di
Else
di= (10 + 4 * (xPix-yPix)) + di
yPix = yPix - 1
Endif
Wend
End Proc
// line drawing
Proc LCD_DrawPoint(x1 As Word, y1 As Word ,color As Word)
Call LCD_WRITE_COM(ILI9341_CASET) //Column addr set
Call LCD_WRITE_DATA(x1.HB)
Call LCD_WRITE_DATA(x1.LB)
Call LCD_WRITE_COM(ILI9341_RASET) //Row addr set
Call LCD_WRITE_DATA(y1.HB)
Call LCD_WRITE_DATA(y1.LB)
Call LCD_WRITE_COM(ILI9341_RAMWR) //write to RAM
Call LCD_WRITE_DATA(color.HB)
Call LCD_WRITE_DATA(color.LB)
End Proc
'/**************************************************************************/
Proc fillRect(x1 As Word, y1 As Word, x2 As Word, y2 As Word, color As Word)
Dim px As Long
Dim tmp As Word
If x2 > 0 And y2 > 0 Then //Nonzero width and height?
Call setAddrWindow(x1, y1, x2, y2)
px = x2
px = px * y2
TFT_CS = 0
TFT_DC = 1
While px > 1
SSPBUF = color.HB
While SSPSTAT.BF = 0
Wend
SSPBUF = color.LB
While SSPSTAT.BF = 0
Wend
px = px - 1
Wend
TFT_DC = 1
TFT_CS = 1
Endif
End Proc
'/**************************************************************************/
'@brief Fill the screen completely with one color. Update in subclasses If desired!
'@param color 16-Bit 5-6-5 Color To fill with
'/**************************************************************************/
Proc fillScreen(color As Word)
Call fillRect(0, 0, LCD_width, LCD_height, color)
End Proc
Proc fillwindow(x1 As Word,y1 As Word,x2 As Word,y2 As Word,color As Word)
Call fillRect(x1, y1, x2, y2, color)
End Proc
Hi I,Hi Cam.. Are you on breadboard? if the SPI lines are in a breadboard the SPI is chopped an I only get 4Mhz
I set the FOSC to 64Mhz and set the speed of SPI to FOSC / 16 ergo 4Mhz...
I haven't tried SPI at 8Mhz FOSC = 32Mhs with SPI FOSC / 4
I'm at home today, so I should have characters very soon,
Hi I,I just tried 32Mhz with 8Mhz and it appears slower
Hi I,what does your SPI init routine look like?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?