Display TFT ST7789 (OshonSoft Basic).

DogFlu66

Member
I leave the library to use ST7789 TFT display, I have translated one that is in C language. But unfortunately I have not been able to get it to work yet. I leave the files in case someone with more experience with these displays can review it.
 

Attachments

  • Main_ST7789.bas
    1.5 KB · Views: 257
  • ST7789_240X240.bas
    15 KB · Views: 230
  • _SPI_Library.bas
    6 KB · Views: 238
  • _Pic18F26K22Library.bas
    46.4 KB · Views: 226
  • _SetUpAmicus18.bas
    2.9 KB · Views: 214
Hi D and I,
Thanks.
With both of your CODEs I have to alter them to make them work.
e,g, there is no SSP1CON1 with the 18F46K20, and they don't oscillate, so I use my XTL oscillator.
Ian's is almost working, but I can't change some of the settings, e,g, sreen writing direction.

Using my set up with DOG's CODE, it compiles, but the [ Proc LCD_init() ] section stops my LED and SCREEN indicator working, maybe the oscillator?.

I don't expect either of you to mess about with my CODE, so you can devolop the TFT without needing to get held up by me. I'm afraid this is due to the limit of my programming skills. {tiresome!}

Do either of you mind me posting your CODE on the AAC forum?
C
 
Last edited:
Hi C.

That may be a typo on Dogs code as I use SSPCON1 and always have.

Post me your current code. I'll see what gives..

Which code do you want on AAC?
 
I use the Pic18F46K22 which has two MSSP modules, and I have the habit of configuring the registers with the names of the datasheet. In my case it would be SSP1CON1, to make it compatible you just have to delete the "1" in the middle of the registers, this register would be SSPCON1 for your Pic. However, the 18F46K22 for the MSSP1 accepts both, so I will edit it and change it because it works for me in both ways.

I think that to publish the libraries in another forum we would first have to finish the final ones, but for my part there is no problem.
 
Hi D,
I went through your CODE and changed the SSP1CON1 toSSPCON1. They look the same in both D/S.
As mentioned your CODE stops due to the LCD_INIT.
Well done with the commenting, it helps a lot.
C.
 
Hi C.

Post me your current code. I'll see what gives..

Which code do you want on AAC?
Hi I and D,
I'll post the CODE later, but it is set up to use my PCB which has a crystal controlling the osc.
Earlier I offered that I post you one of my PCBs (Also you D) no problem if you prefer your electronics.

I hoped to use your CODE body, within my set up, which is working and I can change some of the settings, but not MADCTL.
C.
 
Hi C,

If the program stops at LCD init, then the I2C is struggling...

Run the I2C at 4Mhz until you get the thing sorted Mine is at 8Mhz so just increase the speed by 1

ie instead of SSPCON1 = 0x30 use SSPCON1 = 0x31
 
Here is the version for the ST7789, the library and the test program for the Pic18F46k22.
But this is not the final one, I am preparing another more complete one.
You will have to change the oscillator settings for your micro.
 

Attachments

  • TFT ST77xx_v01.bas
    2 KB · Views: 58
  • ST7789.bas
    38.4 KB · Views: 57
Hi,
This is the Ian's/my working CODE I would like to post on AAC.
Is it ok?
C
Code:
'18F46K20 32MHz XTL PCB_9 BASE_MASTER TFT ME TEST 241124 1600
Define CONFIG1L = 0x00
Define CONFIG1H = 0x06  '6= EXT8 MHz XPLL = 32 MHZ
Define CONFIG2L = 0x0E 'BORV Set to 2.7V  (SBOREN?)
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = 0x81  'Set for HVP
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 = 32

'OSH config
Define SINGLE_DECIMAL_PLACES = 2
Define STRING_MAX_LENGTH = 20

'IO MAP
'SET BITS ON/OFF before TRIS!
Const LATAinit = %00000000  'ON/OFF
Const LATBinit = %00000000
Const LATCinit = %00000000
Const LATDinit = %00000000
Const LATEinit = %00000000

'SET PIN IN/OUT
Const TRISAinit = %00000000
Const TRISBinit = %00000000
Const TRISCinit = %00010000
Const TRISDinit = %00000000
Const TRISEinit = %00000000

'Define SIMULATION_WAITMS_VALUE = 1  'Comment in for SIM out for PIC

Define SEROUT_DELAYUS = 1000

Disable High
Disable Low

'Init LATx flip flops before TRIS regs
LATA = LATAinit
LATB = LATBinit
LATC = LATCinit
LATD = LATDinit
LATE = LATEinit

TRISA = TRISAinit
TRISB = TRISBinit
TRISC = TRISCinit
TRISD = TRISDinit
TRISE = TRISEinit


'START UP LEDS
rled = 1
WaitMs 1000
rled = 0
WaitMs 1000
rled = 1
WaitMs 1000
rled = 0
WaitMs 1000

TFT_LED = 1 'Switch screen light on


'*****************************************************
'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 = 0x00 '0x28 '0x80 '0x08 '0x26 '0x36 '00110110 4=INVERSE? =26'

Const ILI9341_DISp_FUNC = 0xB6

Const ILI9341_MADCTL_MY = 0x80
Const ILI9341_MADCTL_MX = 0x40
Const ILI9341_MADCTL_MV = 0x60 '0x20
Const ILI9341_MADCTL_ML = 0x3C '0x01 |
Const ILI9341_MADCTL_RGB = 0x01

Const IL19341_MADCTL_MH = 0x38 '|

Const ILI9341_RDID1 = 0xda
Const ILI9341_RDID2 = 0xdb
Const ILI9341_RDID3 = 0xdc
Const ILI9341_RDID4 = 0xdd


Const LCD_BLACK = 0x0000
Const LCD_RED = 0xf800 '0x001f
Const LCD_BLUE =  0x001f' 0xf800
Const LCD_GREEN = 0x07E0
Const LCD_YELLOW = 0xffe0'0x07ff
Const LCD_MAGENTA = 0xf81f
Const LCD_CYAN = 0x07ff '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 = LATC.0  'RST RESET pin
Symbol TFT_DC = LATC.1  'DC (SS) Data/Command pin
Symbol TFT_CS = LATC.2  'CS Chip Select pin
Symbol TFT_SCK = LATC.3  'SCK as output
Symbol TFT_SDI = LATC.4  'SDI as input -> SDO
Symbol TFT_SDO = LATC.5  'SDO as output -> SDI

Symbol TFT_LED = LATD.3 'Screen backlight
Symbol rled = LATE.2 'Red LED
'*************************************************
Dim str As String
Dim x As Byte
'OSCCON = 0x60
'OSCTUNE.PLLEN = 1
TRISA.1 = 0
TRISC = 0
TRISD = 0
TRISE = 0
ADCON1 = 15

TFT_LED = 1 'Switch screen light on

Call init_spi() 'Call SPI_init()
Call LCD_init()

str = "HELLO WORLD"
Main:

Toggle rled

    x = 1
    While x = 1

    'WaitMs 300
    'LATA.1 = 1
    'Call fillScreen(LCD_RED)
    'WaitMs 300
    'LATA.1 = 0
    Call fillwindow(00,00,320,240, LCD_WHITE)
    WaitMs 300
    LATA.1 = 1
    Call fillwindow(00,00,320,240, LCD_BLUE)
    WaitMs 300
    LATA.1 = 0

    'Call fillScreen(LCD_WHITE)
    'Call LCD_DrawLine(320,240,01,01,LCD_GREEN)
    'Call fillScreen(LCD_MAGENTA)
    'Call LCD_DrawLine(05,01,320,240,LCD_BLUE)

    'Call LCD_DrawLine(230,10,10,230,LCD_BLACK)
    'Call LCD_DrawLine(10,120,230,120,LCD_BLACK)
    'Call LCD_DrawLine(120,10,120,230,LCD_BLACK)

    'Call LCD_Circle(120,120,100,LCD_BLUE)
    'Call fillwindow(60,50,180,190, LCD_WHITE)
    'Call LCD_DrawRectangle(60,50,180,190,LCD_BLACK)
    'str = "Draw direction"
    'Call LCD_String( str,30,110, LCD_BLACK, LCD_GREEN) '(STRING,ACROSS-START,ACROSS-END, CHARACTERS, SCREEN)

    WaitMs 2000

Wend
End

'Proc SPI_init()
'SSPSTAT = 0x40
'SSPCON1 = 0x30
'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(0x80) '(0x3C) '(0x8)|
    Call LCD_WRITE_COM(ILI9341_INVOFF)'(ILI9341_INVON)
    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 '240

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_Char( char As Byte, x As Word, y As Word, fcol As Word , bcol As Word)

    Dim  x0 As Integer
    Dim idx, idx2 As Byte
    Dim mask As Byte

    For idx = 0 To 9 Step 1
        mask = _LCDFnt(char, idx)
        For idx2 = 0 To 13 Step 2
            If mask And 0x80 Then
                Call LCD_DrawPoint(x+idx2, y, fcol)
                Call LCD_DrawPoint(x+idx2+1, y, fcol)
                Call LCD_DrawPoint(x+idx2, y+1, fcol)
                Call LCD_DrawPoint(x+idx2+1, y+1, fcol)
            Else
                Call LCD_DrawPoint(x+idx2, y, bcol)
                Call LCD_DrawPoint(x+idx2+1, y, bcol)
                Call LCD_DrawPoint(x+idx2, y+1, bcol)
                Call LCD_DrawPoint(x+idx2+1, y+1, bcol)
            Endif
            mask = ShiftLeft(mask,1)
        Next idx2
        y = y + 2
    Next idx

End Proc
Proc LCD_String( str As String, x As Word, y As Word, fcol As Word , bcol As Word)

Dim idx As Byte
Dim x0 As Word
idx = 0

    While str(idx) <> 0
        Call LCD_Char(str(idx), x, y,fcol,bcol)
        x = x+18
        idx = idx + 1
    Wend

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
Function _LCDFnt(ch As Byte, idx As Byte) As Byte
    Symbol Retval = _LCDFnt

            Select Case ch
                Case " "
                    Retval = LookUp(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), idx  //SPACE
                Case "!"
                    Retval = LookUp(0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00), idx  //!
                Case 34
                    Retval = LookUp(0x00, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), idx  // "
                Case "#"
                    Retval = LookUp(0x00, 0x12, 0x12, 0x7f, 0x24, 0x24, 0xfe, 0x48, 0x48, 0x00), idx  //#
                Case "$"
                    Retval = LookUp(0x00, 0x10, 0x7c, 0x92, 0x70, 0x1c, 0x92, 0x7c, 0x10, 0x00), idx  //$
                Case "%"
                    Retval = LookUp(0x00, 0x41, 0xa2, 0x44, 0x08, 0x10, 0x22, 0x45, 0x82, 0x00), idx  //%
                Case "&"
                    Retval = LookUp(0x00, 0x10, 0x28, 0x10, 0x28, 0x44, 0x43, 0x42, 0x39, 0x00), idx  //&
                Case "'"
                    Retval = LookUp(0x00, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), idx  //'
                Case "("
                    Retval = LookUp(0x00, 0x08, 0x10, 0x20, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00), idx  //(
                Case ")"
                    Retval = LookUp(0x00, 0x08, 0x04, 0x02, 0x02, 0x02, 0x20, 0x04, 0x08, 0x00), idx  //)
                Case "*"
                    Retval = LookUp(0x00, 0x08, 0x2a, 0x1c, 0x7f, 0x1c, 0x2a, 0x08, 0x00, 0x00), idx  //*
                Case "+"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x08, 0x08, 0x00, 0x00), idx  //+
                Case ","
                    Retval = LookUp(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x10, 0x00), idx  //,
                Case "-"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00), idx  //-
                Case "."
                    Retval = LookUp(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00), idx  //.
                Case "/"
                    Retval = LookUp(0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00), idx  ///
                Case "0"
                    Retval = LookUp(0x00, 0x3c, 0x46, 0x4a, 0x4a, 0x52, 0x52, 0x62, 0x3c, 0x00), idx  //0
                Case "1"
                    Retval = LookUp(0x00, 0x08, 0x18, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, 0x00), idx  //1
                Case "2"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x02, 0x0c, 0x30, 0x40, 0x40, 0x7e, 0x00), idx  //2
                Case "3"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x02, 0x0c, 0x02, 0x02, 0x42, 0x3c, 0x00), idx  //3
                Case "4"
                    Retval = LookUp(0x00, 0x09, 0x18, 0x28, 0x48, 0x48, 0x7e, 0x08, 0x08, 0x00), idx  //4
                Case "5"
                    Retval = LookUp(0x00, 0x7e, 0x40, 0x40, 0x7c, 0x02, 0x02, 0x42, 0x3c, 0x00), idx  //5
                Case "6"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x40, 0x7c, 0x42, 0x42, 0x42, 0x3c, 0x00), idx  //6
                Case "7"
                    Retval = LookUp(0x00, 0x7e, 0x02, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x00), idx  //7
                Case "8"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x42, 0x3c, 0x42, 0x42, 0x42, 0x3c, 0x00), idx  //8
                Case "9"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x42, 0x3c, 0x00), idx  //9
                Case ":"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00), idx  //:
                Case ";"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x10, 0x00), idx  //;
                Case "<"
                    Retval = LookUp(0x00, 0x04, 0x08, 0x10, 0x20, 0x20, 0x10, 0x08, 0x04, 0x00), idx  //<
                Case "="
                    Retval = LookUp(0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x00, 0x00), idx  //=
                Case ">"
                    Retval = LookUp(0x00, 0x10, 0x08, 0x04, 0x02, 0x02, 0x04, 0x08, 0x10, 0x00), idx  //>
                Case "?"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x02, 0x04, 0x08, 0x08, 0x00, 0x08, 0x00), idx  //?
                Case "@"
                    Retval = LookUp(0x00, 0x7e, 0x81, 0x9b, 0xa5, 0xa6, 0x9c, 0x81, 0x7e, 0x00), idx  //@
                Case "A"
                    Retval = LookUp(0x00, 0x18, 0x24, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x00), idx  //A
                Case "B"
                    Retval = LookUp(0x00, 0x7c, 0x42, 0x42, 0x7c, 0x42, 0x42, 0x42, 0x7c, 0x00), idx  //B
                Case "C"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x40, 0x40, 0x40, 0x40, 0x42, 0x3c, 0x00), idx  //C
                Case "D"
                    Retval = LookUp(0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7c, 0x00), idx  //D
                Case "E"
                    Retval = LookUp(0x00, 0x7e, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x7e, 0x00), idx  //E
                Case "F"
                    Retval = LookUp(0x00, 0x7e, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x40, 0x00), idx  //F
                Case "G"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x40, 0x40, 0x46, 0x42, 0x42, 0x3c, 0x00), idx  //G
                Case "H"
                    Retval = LookUp(0x00, 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x00), idx  //H
                Case "I"
                    Retval = LookUp(0x00, 0x7e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x7e, 0x00), idx  //I
                Case "J"
                    Retval = LookUp(0x00, 0x7e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x48, 0x30, 0x00), idx  //J
                Case "K"
                    Retval = LookUp(0x00, 0x42, 0x44, 0x48, 0x70, 0x48, 0x44, 0x42, 0x42, 0x00), idx  //K
                Case "L"
                    Retval = LookUp(0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7e, 0x00), idx  //L
                Case "M"
                    Retval = LookUp(0x00, 0x42, 0x42, 0x66, 0x5a, 0x42, 0x42, 0x42, 0x42, 0x00), idx  //M
                Case "N"
                    Retval = LookUp(0x00, 0x42, 0x42, 0x62, 0x52, 0x4a, 0x46, 0x42, 0x42, 0x00), idx  //N
                Case "O"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00), idx  //O
                Case "P"
                    Retval = LookUp(0x00, 0x7c, 0x42, 0x42, 0x7c, 0x40, 0x40, 0x40, 0x40, 0x00), idx  //P
                Case "Q"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x4a, 0x46, 0x3e, 0x00), idx  //Q
                Case "R"
                    Retval = LookUp(0x00, 0x7c, 0x42, 0x42, 0x7c, 0x48, 0x44, 0x42, 0x42, 0x00), idx  //R
                Case "S"
                    Retval = LookUp(0x00, 0x3c, 0x42, 0x40, 0x30, 0x0c, 0x02, 0x42, 0x3c, 0x00), idx  //S
                Case "T"
                    Retval = LookUp(0x00, 0x7e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00), idx  //T
                Case "U"
                    Retval = LookUp(0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00), idx  //U
                Case "V"
                    Retval = LookUp(0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00), idx  //V
                Case "W"
                    Retval = LookUp(0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x5a, 0x66, 0x42, 0x00), idx  //W
                Case "X"
                    Retval = LookUp(0x00, 0x42, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x42, 0x00), idx  //X
                Case "Y"
                    Retval = LookUp(0x00, 0x42, 0x42, 0x24, 0x18, 0x05, 0x08, 0x08, 0x08, 0x00), idx  //Y
                Case "Z"
                    Retval = LookUp(0x00, 0x7e, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7e, 0x00), idx  //Z
                Case "["
                    Retval = LookUp(0x00, 0x3c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x00), idx  //[
                Case "\"
                    Retval = LookUp(0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00), idx  //\
                Case "]"
                    Retval = LookUp(0x00, 0x3c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x3c, 0x00), idx  //]
                Case "^"
                    Retval = LookUp(0x00, 0x08, 0x14, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), idx  //^
                Case "_"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00), idx  //_
                Case "`"
                    Retval = LookUp(0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), idx  //`
                Case "a"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x1c, 0x02, 0x1e, 0x22, 0x22, 0x1e, 0x00), idx  //a
                Case "b"
                    Retval = LookUp(0x00, 0x20, 0x20, 0x3c, 0x22, 0x22, 0x22, 0x22, 0x3c, 0x00), idx  //b
                Case "c"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x1c, 0x22, 0x20, 0x20, 0x22, 0x1c, 0x00), idx  //c
                Case "d"
                    Retval = LookUp(0x00, 0x02, 0x02, 0x1e, 0x22, 0x22, 0x22, 0x22, 0x1e, 0x00), idx  //d
                Case "e"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x1c, 0x22, 0x3e, 0x20, 0x22, 0x1c, 0x00), idx  //e
                Case "f"
                    Retval = LookUp(0x00, 0x0c, 0x10, 0x10, 0x3c, 0x10, 0x10, 0x10, 0x10, 0x00), idx  //f
                Case "g"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x1e, 0x22, 0x22, 0x22, 0x1e, 0x02, 0x3c), idx  //g
                Case "h"
                    Retval = LookUp(0x00, 0x20, 0x20, 0x3c, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00), idx  //h
                Case "i"
                    Retval = LookUp(0x00, 0x08, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00), idx  //i
                Case "j"
                    Retval = LookUp(0x00, 0x08, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x30), idx  //j
                Case "k"
                    Retval = LookUp(0x00, 0x20, 0x20, 0x22, 0x24, 0x38, 0x24, 0x22, 0x22, 0x00), idx  //k
                Case "l"
                    Retval = LookUp(0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x18, 0x00), idx  //l
                Case "m"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x22, 0x36, 0x2a, 0x22, 0x22, 0x22, 0x00), idx  //m
                Case "n"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x3c, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00), idx  //n
                Case "o"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x1c, 0x22, 0x22, 0x22, 0x22, 0x1c, 0x00), idx  //o
                Case "p"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x7c, 0x14, 0x14, 0x14, 0x08, 0x00, 0x00), idx  //p
                Case "q"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x3c, 0x22, 0x22, 0x22, 0x3c, 0x20, 0x20), idx  //q
                Case "r"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x2e, 0x30, 0x20, 0x20, 0x20, 0x20, 0x00), idx  //r
                Case "s"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x1c, 0x22, 0x10, 0x0c, 0x22, 0x1c, 0x00), idx  //s
                Case "t"
                    Retval = LookUp(0x00, 0x10, 0x10, 0x38, 0x10, 0x10, 0x10, 0x12, 0x0c, 0x00), idx  //t
                Case "u"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1c, 0x00), idx  //u
                Case "v"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x14, 0x08, 0x00), idx  //v
                Case "w"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x2a, 0x36, 0x22, 0x00), idx  //w
                Case "x"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x22, 0x14, 0x08, 0x14, 0x22, 0x22, 0x00), idx  //x
                Case "y"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x1e, 0x02, 0x3c), idx  //y
                Case "z"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x3e, 0x02, 0x04, 0x08, 0x10, 0x3e, 0x00), idx  //z
                Case "{"
                    Retval = LookUp(0x00, 0x04, 0x08, 0x08, 0x08, 0x10, 0x08, 0x08, 0x08, 0x04), idx  //{
                Case "|"
                    Retval = LookUp(0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00), idx  //|
                Case "}"
                    Retval = LookUp(0x00, 0x10, 0x08, 0x08, 0x08, 0x04, 0x08, 0x08, 0x08, 0x10), idx  //}
                Case "~"
                    Retval = LookUp(0x00, 0x00, 0x00, 0x00, 0xcc, 0x33, 0x00, 0x00, 0x00, 0x00), idx  //~
                Case 165 '"Ñ" + chr(165) +
                    Retval = LookUp(0x00, 0x00, 0x00, 0x7e, 0x05, 0x09, 0x11, 0x7e), idx  //Ñ
                Case 164'"ñ" + chr(164) +
                    Retval = LookUp(0x00, 0x00, 0x00, 0x78, 0x12, 0x0a, 0x0a, 0x70), idx  //ñ
            EndSelect

End Function
'###################################################################

'*******************************************************
'*                                                     *
'*            START UP SPI ROUTINE                     *
'*                                                     *
'*******************************************************
Proc init_spi()  'PIC 18F46K20
TRISC.3 = 0  'SCK to Slave ****** output *******
TRISC.5 = 0  'MOSI  ****** output *******
TRISC.4 = 1  'MISO  ****** input *******

'MODE 0,0???
SSPSTAT.SMP = 0  'Input data sampled at middle of data output time ** not about clock generation **
SSPSTAT.CKE = 1  'CHANGED to 1 [0 Output data changes on clock transition from active to idle ** AS ABOVE **]
SSPSTAT.5 = 0  'I2C only
SSPSTAT.4 = 0  'I2C only
SSPSTAT.3 = 0  'I2C only
SSPSTAT.2 = 0  'I2C only
SSPSTAT.1 = 0  'I2C only

SSPCON1 = 0  'RESET THE CONTROL REGISTER **************************************ADDED
SSPCON1.WCOL = 0  'Collision detect
SSPCON1.SSPOV = 0  'Overflow
SSPCON1.SSPEN = 1  'Configure SCK,SD0,SDI,/SS ** HAS TO BE 1. To reset or reconfigure SPI mode, clear the SSPEN bit,
'reinitialize the sspcon registers And Then set the SSPEN Bit from the datasheet !!!!!!!!!!!!!!!!
SSPCON1.CKP = 1  '= idle state For clock is A HIGH level
SSPCON1.SSPM3 = 0  '0010 = SPI Master mode, clock = FOSC/64
SSPCON1.SSPM2 = 0
SSPCON1.SSPM1 = 1  'MASTER MODE
SSPCON1.SSPM0 = 0
End Proc
 
Hi C,

If the program stops at LCD init, then the I2C is struggling...

Run the I2C at 4Mhz until you get the thing sorted Mine is at 8Mhz so just increase the speed by 1

ie instead of SSPCON1 = 0x30 use SSPCON1 = 0x31
Hi I,
I'm a bit confused, as I have no experience with i2c, as I think I only have SPI settings?
C
 
Try this setting and see if it works.

#define CONFIG1L = 0x00
#define CONFIG1H = 0x02
#define CONFIG2L = 0x1E
#define CONFIG2H = 0x1E
#define CONFIG3L = 0x00
#define CONFIG3H = 0x8B
#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 = 32 'Clock 32Mhz
#define STRING_MAX_LENGTH = 60

'#define SIMULATION_WAITMS_VALUE = 1
'************************************************
'Include "_Pic18F26K22Library.bas"
Include "ST7789.bas"
'*****************************************************
'Clock internal 64Mhz.
'OSCCON = %01110000 'Call _Setup_Oscillator(_OSC_16MHz_HF)
OSCTUNE.PLLEN = True 'Call _SET_PLL4(_PLL_ON)
RCON.IPEN = False 'Call _Interrupts_Mode(_DISABLE_PRIORITY)
'*********************************************
AllDigital
UART1_Init 115200
WaitMs 1
UART1_Write 0x0C
WaitMs 100
UART1_Write "Ready"
Call LCD_SPI1_Init(LCD_SPI_MODE2, LCD_SPI_MASTER_SPEED0 | LCD_SPI_ENABLE) 'CLK 8Mhz (32Mhz)
Call LCD_init()

Dim str As String
Dim x As Byte

str = "MAXIMUM!"
Dim m As Byte
m = 0
Call SetRotation(2) '0 y 2 TFT horizontal, 1 y 3 TFT Vertical
Call InvertDisplay(INVOFF)
'Main Loop
While True

WaitMs 300
Call fillScreen(LCD_RED)

WaitMs 300
Call fillwindow(10,10,310,230, LCD_BLUE)
WaitMs 300
Call fillwindow(10,10,310,230, LCD_GREEN)
WaitMs 300
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)
Call LCD_String( str,90,110, LCD_BLACK, LCD_WHITE)

'Call setRotation(m)
'm++
'If m > 3 Then m = 0

WaitMs 2000

Wend
End
 
Last edited:
Hi D,
There is a pull up resistor on the PCB
C

If you are referring to the SPI bus it does not need pull-up resistors, and the only pull-up resistor I use is the MCLR pin bias resistor. If you don't use MCLR it is disabled in bit configuration. I was looking for a Pic18F46K20 at home but I don't have one to test.
 
I said in a previous thread.. When you are using an external MCLRE be wary that the pic NEVER hard boots if you keep the pickit 3 in place.. If you change the driver and then upload without removing power afterwards you only soft boot so "variables" are still intact, and then can give erroneous boots.

While developing an internal MCLRE is best.. Once you are happy, by all means swap it back.
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…