3.5" Color LCD code example


Closed Thread
Results 1 to 40 of 45

Hybrid View

  1. #1
    Join Date
    Mar 2008
    Location
    Gerogetown, Texas
    Posts
    94

    Default 3.5" Color LCD code example

    I recently bought a 3.5" color lcd from China from
    http://cgi.ebay.com/3-5-262k-TFT-240...item1c153a8de4
    for $35.00 including shipping. It also has a touch screen and controller , eeprom, and sd socket.

    Below is the test code. This should get you started if you want to play with this color display.

    I am using 8 bit control for the LCD and hardware SPI for the touch screen controller.

    Here are the spec's

    3.5" QVGA 262k TFT-LCD module
    240*RGB*320 pixels
    LCD driver is SSD2119
    2.7-3.3V operating voltage
    RS1843 touch panel controller onboard directly compatible with ADS7843
    Standard 2.54mm PCB headers for prototyping
    Support a SD card interface(SPI mode)
    Support a ATMEL DataFlash AT45DBxxx series device
    Optional 8-bit or 16-bit parallel bus interface and
    Optional 3 wire SPI or 4 wire SPI interface with PS3、PS2、PS1、PS1 jump select
    4-wire Touch Panel support

    I have to give credit to Darrel Taylor, mister_e, skimask and anyone else I may have used their code over the years.
    Code:
    ' ************************************************************
    ' * Auto generated EasyHID file. PBP 2.60 and above          *
    ' ************************************************************
    
    ' include the HID descriptor
    include	"DESC_TFT.bas"
    
    DEFINE OSC 48
    DEFINE LOADER_USED 1
    
    ADCON1 = $F       'port A digital
    CMCON = 7         'PortA Digital
    INTCON2.7 = 0     'weak pullups portB
    'INTCON2.4 = 0     'INT2 falling edge
    USBBufferSizeMax   con 64  ' maximum buffer size
    USBBufferSizeTX    con 64  ' input
    USBBufferSizeRX    con 64  ' output
    
    ' the USB buffer...
    USBBuffer        Var Byte[USBBufferSizeMax] 
    USBBufferCount   Var Byte 
    
    
    SPI_Buf_out   var        byte[8]      'spi output buffer
    SPI_Buf_in   var        byte[8]       'spi input buffer
    spi_cnt      var        byte          ' Transmit counter
    ts_y      var        word
    ts_x      var        word
    ts_cs     var        PORTB.5
    number    var        word
    len       var        byte
    high      ts_cs
    ' LCD VARS__________________________________________________________
    
    LCD_Dat         var    PORTD
    LCD_CS          var    PORTE.2
    LCD_RS          var    PORTB.3
    LCD_RD          var    PORTE.0
    LCD_WR          var    PORTE.1
    LCD_RST         var    PORTC.6
    CMD             var    word
    DAT             var    word
    Color           var    word
    fColor           var    word
    bColor           var    word
    ' Color
    RED	    con  $f800
    GREEN	con  $07e0
    BLUE	con  $001f
    YELLOW	con  $ffe0
    CYAN	con  $07ff
    MAGENTA	con  $f81f
    BLACK	con  $0000
    WHITE	con  $ffff
    rlb   var    byte
    rhb   var    word
    i     var    long
    j     var    long
    k     var    long
    m     var    byte
    n     var    byte
    
    '** Graphic vars *************************************************************
    cx          var     long
    cy          var     long
    sx          var     long
    ex          var     long
    sy          var     long
    ey          var     long
    x           var     word
    y           var     word
    ypos        var     long
    rad         var     long
    rad2         var    long
    color_buf   var     word
    sx_buff      var     word
    ex_buff      var     word
    'Circle constants and variables
    gl_pi			con	2	'PI as an integer
    glc_x			var     BYTE	'Calculation var
    glc_y			var     BYTE	'Calculation var
    glc_s			var     WORD	'Slope
    glc_cx			var     BYTE	'Center x
    glc_cy  		var     BYTE	'Center y
    glc_r			var     BYTE	'Radius
    gl_x1			var     word
    gl_x2           var     word
    gl_y1           var     BYTE
    gl_y2           var     BYTE
    b_inp1	 		var     BYTE
    b_inp2	 		var     BYTE
    b_inp3	 		var     BYTE
    gl_i		var	word
    gl_j		var BYTE
    gl_k		var	BYTE
    gl_l        var BYTE
    gl_m        var BYTE
    gl_x		var	WORD
    gl_y		var	WORD
    '===============================================================================
    Invert          var bit
    charsel          var byte[8]
    char_row         var byte
    lu1              var byte
    charpos          var byte
    addr             var word
    addrb            var byte
    addrb = 0
    addr1            var word
    char             var chardata[0]
    chardata         var byte[8]
    temp             var byte
    temp1            var byte
    temp5            var byte
    Im1              var word
    temp2            var byte
    a               var byte
    LCDx    var byte    '  Col position
    LCDy    var byte    '  Row position
    big     var byte
    big = 0
    Row var byte
    col var byte
    
    picdat  var byte
    
    lcdcharloop var byte
    lcdchardata var byte[8]
    tp_cs      var PORTB.5
    
    SSPEN VAR SSPCON1.5   ' SSP Enable bit
    CKP   VAR SSPCON1.4   ' Clock Polarity Select
    SMP   VAR SSPSTAT.7  ' Data input sample phase
    CKE   VAR SSPSTAT.6  ' Clock Edge Select bit
    SSPIF VAR PIR1.3     ' SPI interrupt flag
    WCOL		Var	SSPCON1.7	' SSP write collision
    BF		    Var	SSPSTAT.0	' SSP buffer full
    SSPCON1 = %00000010	
    Pen_Down  var PORTB.2
    TRISA = %00000000
    TRISB = %00000101
    TRISC = %00000000
    TRISD = %00000000
    TRISE.0 = 0
    TRISE.1 = 0
    TRISE.2 = 0
    latD = %11111111
    high lcd_cs
    high lcd_RD
    high lcd_wr
    high lcd_rs
    high lcd_rst
    
        '   Interrupt definition
        '   ====================
            '   USB interrupt used to keep USB connection alive
    INCLUDE "DT_INTS-18.bas"    ' Base Interrupt System
    INCLUDE "ReEnterPBP-18.bas"     ' Include if using PBP interrupts
    ASM
    INT_LIST  macro    ; IntSource,         Label,  Type, ResetFlag?
            INT_Handler    INT2_INT,  _TS_INT,   ASM,  yes
        endm
        INT_CREATE               ; Creates the interrupt processor
    ENDASM
    @    INT_ENABLE  INT2_INT      ; enable external (INT) interrupt
    
    ASM	;printstr2 to color LCD macro,	'@ printstr2 x,y, "string2 to lcd at x,y"
    printstr2	macro x2, y2, str2
    		local thestring2, overstr2
    	
    		bra overstr2
    thestring2
    		data str2,0
    overstr2
    		MOVE?CB x2, _LCDx
    		MOVE?CB y2, _Row
    		MOVE?CW thestring2, _addr
    		L?CALL _stringout2
    		endm
    ENDASM
    
    
    pause 1000
    'include "USB_ASM_Service.pbp"
    lcd_dat = $FF
    goto programstart
    '******************************************************************************
    LCD_Write_CMD:
    high lcd_RD
    low lcd_rs
    low lcd_cs
    low lcd_wr
    lcd_dat = cmd.highbyte
    high lcd_wr
    low lcd_wr
    LCD_Dat = cmd.lowbyte
    high lcd_wr
    high lcd_rs
    high lcd_cs
    
    Return
    '******************************************************************************
    LCD_Write_Dat:
    high lcd_RD
    high lcd_rs
    low lcd_cs
    low lcd_wr
    lcd_dat = dat.highbyte
    high lcd_wr
    low lcd_wr
    LCD_Dat = dat.lowbyte
    high lcd_wr
    high lcd_cs
    
    return
    '******************************************************************************
    LCD_Read_Dat:           ' only works with 16 bit control
    TRISD = $FF
    color_buf = 0
    low lcd_cs
    high lcd_rs
    high lcd_wr
    
    
    low lcd_rd      'dummy read
    high lcd_rd
    
    low lcd_rd
    color_buf.lowbyte = lcd_dat 
    high lcd_rd
                                                            'lcd_dat
    low lcd_rd
    color_buf.highbyte = lcd_dat 
    high lcd_rd
    
                                                               'lcd_dat
    TRISD = $00
    high lcd_cs
    return
    '******************************************************************************
    
    LCD_RESET:
    low lcd_rst
    pause 500
    high lcd_rst
    pause 1000
    return
    '******************************************************************************
    LCD_Test:
    gosub lcd_home
    for i = 0 to 319
        for j = 0 to 239
            if i > 279 then 
            dat = black
            elseif i > 239 then 
            dat = blue
            elseif i > 199 then 
            dat = green
            elseif i > 159 then 
            dat = cyan
            elseif i > 119 then 
            dat = red
            elseif i > 79 then 
            dat = magenta
            elseif i > 39 then 
            dat = yellow
            else 
            dat = white
            
            endif
            gosub lcd_write_dat
        next j       
    
    
    
    
    next i
    return
    '******************************************************************************
    LCD_INIT:
    gosub lcd_reset
    cmd = $0028 : gosub lcd_write_CMD : dat = $0006 : gosub lcd_write_dat
    
    pause 10
    cmd = $0000 : gosub lcd_write_CMD : dat = $0001 : gosub lcd_write_dat ' Start OSC
    cmd = $0010 : gosub lcd_write_CMD : dat = $0000 : gosub lcd_write_dat
    cmd = $0001 : gosub lcd_write_CMD : dat = $30EF : gosub lcd_write_dat  ' Driver output  32EF
    cmd = $0002 : gosub lcd_write_CMD : dat = $0600 : gosub lcd_write_dat   
    cmd = $0003 : gosub lcd_write_CMD : dat = $6A64 : gosub lcd_write_dat   
    cmd = $0011 : gosub lcd_write_CMD : dat = $6830 : gosub lcd_write_dat   
    
    cmd = $000F : gosub lcd_write_CMD : dat = $0000 : gosub lcd_write_dat
    
    cmd = $000B : gosub lcd_write_CMD : dat = $5308 : gosub lcd_write_dat
    cmd = $000C : gosub lcd_write_CMD : dat = $0003 : gosub lcd_write_dat
    cmd = $000D : gosub lcd_write_CMD : dat = $000A : gosub lcd_write_dat
    cmd = $000E : gosub lcd_write_CMD : dat = $2E00 : gosub lcd_write_dat
    
    cmd = $001E : gosub lcd_write_CMD : dat = $002B : gosub lcd_write_dat '
    cmd = $0025 : gosub lcd_write_CMD : dat = $8000 : gosub lcd_write_dat
    cmd = $0026 : gosub lcd_write_CMD : dat = $7000 : gosub lcd_write_dat 
    cmd = $004E : gosub lcd_write_CMD : dat = $0000 : gosub lcd_write_dat
    cmd = $004F : gosub lcd_write_CMD : dat = $0000 : gosub lcd_write_dat
    
    cmd = $0012 : gosub lcd_write_CMD : dat = $08D9 : gosub lcd_write_dat
     ' Gama Curve
    cmd = $0030 : gosub lcd_write_CMD : dat = $0000 : gosub lcd_write_dat
    cmd = $0031 : gosub lcd_write_CMD : dat = $0104 : gosub lcd_write_dat
    cmd = $0032 : gosub lcd_write_CMD : dat = $0100 : gosub lcd_write_dat
    cmd = $0033 : gosub lcd_write_CMD : dat = $0305 : gosub lcd_write_dat
    cmd = $0034 : gosub lcd_write_CMD : dat = $0505 : gosub lcd_write_dat
    cmd = $0035 : gosub lcd_write_CMD : dat = $0305 : gosub lcd_write_dat
    cmd = $0036 : gosub lcd_write_CMD : dat = $0707 : gosub lcd_write_dat
    cmd = $0037 : gosub lcd_write_CMD : dat = $0300 : gosub lcd_write_dat
    cmd = $003A : gosub lcd_write_CMD : dat = $1200 : gosub lcd_write_dat
    cmd = $003B : gosub lcd_write_CMD : dat = $0800 : gosub lcd_write_dat
    pause 150
    cmd = $0007 : gosub lcd_write_CMD : dat = $0033 : gosub lcd_write_dat
    pause 200
    
    Return
    '******************************************************************************
    LCD_HOME:
    
    cmd = $004E : gosub lcd_write_CMD : dat = $0000 : gosub lcd_write_dat  ' RAM Addsress set X
    cmd = $004F : gosub lcd_write_CMD : dat = $0000 : gosub lcd_write_dat  ' RAM Addsress set Y
    cmd = $0044 : gosub lcd_write_CMD : dat = $EF00 : gosub lcd_write_dat  'Vertical start/end RAM address position
    cmd = $0045 : gosub lcd_write_CMD : dat = $0000 : gosub lcd_write_dat  'Horizontal start RAM address position 
    cmd = $0046 : gosub lcd_write_CMD : dat = $013F : gosub lcd_write_dat   ' Horizontal end RAM address position
    cmd = $0022 : gosub lcd_write_CMD     'RAM data write/read
    
    return
    '******************************************************************************
    CLR_DISP:
    color = white
    for i = 0 to 319
        for j = 0 to 239
        dat = color
        gosub lcd_write_dat
        next j
    next i
    return
    '******************************************************************************
    '  Need sx (start x), ex (end x) sy (start y), ey (end y) and Color
    '
    '******************************************************************************
    Fill_Rect:
    ypos.highbyte = ey
    ypos.lowbyte = sy
    
    
    cmd = $004E : gosub lcd_write_CMD : dat = sx : gosub lcd_write_dat  ' RAM Addsress set X
    cmd = $004F : gosub lcd_write_CMD : dat = sy : gosub lcd_write_dat  ' RAM Addsress set Y
    cmd = $0044 : gosub lcd_write_CMD : dat = ypos: gosub lcd_write_dat  'Vertical start/end RAM address position
    cmd = $0045 : gosub lcd_write_CMD : dat = sx : gosub lcd_write_dat  'Horizontal start RAM address position 
    cmd = $0046 : gosub lcd_write_CMD : dat = ex : gosub lcd_write_dat   ' Horizontal end RAM address position
    cmd = $0022 : gosub lcd_write_CMD     'RAM data write/read
    x = ex - sx + 1
    y = ey - sy + 1
    dat = color
    for j = 0 to y
        for i = 0 to x
        gosub lcd_write_dat
        next i
    next j
    return
    
    '******************************************************************************
    '  Need cx (center x), cy (center y), rad (radius) and Color
    '
    '******************************************************************************
    
    '******************************************************************************
    '    need  x, y, color
    '
    '******************************************************************************
    Setdot:
    cmd = $004E : gosub lcd_write_CMD : dat = x : gosub lcd_write_dat  ' RAM Addsress counter set X
    cmd = $004F : gosub lcd_write_CMD : dat = y : gosub lcd_write_dat  ' RAM Addsress counter set Y
    cmd = $0022 : gosub lcd_write_CMD 
    dat = color
    gosub lcd_write_dat
    
    return
    
    ' ***** Set x,y Points *****
    set8:
    	x = glc_x+glc_cx : y=glc_y+glc_cy	        '1
    	gosub setdot
    	x = glc_cx-glc_x : y=glc_y+glc_cy		'2	
    	gosub setdot
    	x = glc_cx+glc_x : y=glc_cy-glc_y		'3	
    	gosub setdot
    	x = glc_cx-glc_x : y=glc_cy-glc_y		'4	
    	gosub setdot
    	x = glc_y+glc_cx : y=glc_x+glc_cy		'5
    	gosub setdot			
    	x = glc_cx-glc_y : y=glc_cy+glc_x		'6	
    	gosub setdot
    	x = glc_cx+glc_y : y=glc_cy-glc_x		'7	
    	gosub setdot
    	x = glc_cx-glc_y : y=glc_cy-glc_x		'8	
    	gosub setdot
    return
    
    '*** gl_circle d = diameter r = radius x,y are point locations ***
    '***** Given Center = glc_cx,glc_cy and Radius = glc_r **********
    gl_circ:
      glc_x = 0
      glc_y = glc_r
      glc_s = gl_pi-2*glc_r
      
    
      while (glc_x <= glc_y) 
     
          gosub set8
    
    	if (glc_s.15 =1) then
               glc_s = glc_s + (4*glc_x + 6)
             else
               glc_s = glc_s + (4*(glc_x-glc_y) + 10)
               glc_y = glc_y - 1
    	endif
    
    	glc_x = glc_x + 1
      wend
    
    return
    'Rectangle subroutine given gl_x1,gl_x2,gl_y1, gl_y2
    gl_rect:
    
            gosub chk_xy         
    	for gl_i= gl_x1 to gl_x2 step 1
    		x = gl_i
    		y = gl_y1
    		gosub setdot
    	        y = gl_y2
    		gosub setdot
    	next gl_i
    
    	for gl_i= gl_y1 to gl_y2 step 1
    		y = gl_i
    		x = gl_x1
    		gosub setdot
    		x = gl_x2
    		gosub setdot
    	next gl_i
    
    return
    
    chk_xy:
    	if gl_x1 > gl_x2 then
    		swap gl_x1,gl_x2
            endif
    	if gl_y1 > gl_y2 then
    		swap gl_y1,gl_y2
            endif
    return
    
    
    
    '*******************************************************************************
    '           Text
    '*******************************************************************************
    stringout2:		
    lcdy = row
    Readcode addr, char : 
    If char = 0 then return 
    
    gosub putclcdtext : 
    addr = addr + 1 : 
    lcdx = lcdx + 1 : 
    
    lcdy = row 
    
    goto stringout2
    
    
    putclcdtext:	
    if char < 20 then return
     if char > $7f then return
     
     for char_row = 0 to 4
         if char < $50 then
            charpos  = (((char & $ff)- $20)*5)
            gosub table1
            
         endif
    
         if char > $4f then
            charpos  = (((char & $ff)- $50)*5)
            gosub table2
          endif 
    
    next char_row
    if big = 0 then      ' Normal 5x7 font
        for j = 0 to 7   ' data bits 0 - 7
                    
                	cmd = $004E : gosub lcd_write_CMD : dat = lcdx : gosub lcd_write_dat  ' RAM Addsress counter set X
                    cmd = $004F : gosub lcd_write_CMD : dat = lcdy : gosub lcd_write_dat  ' RAM Addsress counter set Y    
        
                       
            for k = 1 to 5
        
        	        dat = fcolor
                    temp = chardata[k]
                    if temp.0[j] = 0 then 
                        dat = bcolor
                    endif
                    cmd = $0022 : gosub lcd_write_CMD 
                    gosub lcd_write_dat
        	next k
        	dat = bcolor
            gosub lcd_write_dat
            lcdy = lcdy + 1
        
        next j 
        lcdx = lcdx + 6
        
    
    elseif big = 1 then      ' big 10x14 font
        for j = 0 to 7   ' data bits 0 - 7
        for n = 0 to 1
                     
                	cmd = $004E : gosub lcd_write_CMD : dat = lcdx : gosub lcd_write_dat  ' RAM Addsress counter set X
                    cmd = $004F : gosub lcd_write_CMD : dat = lcdy : gosub lcd_write_dat  ' RAM Addsress counter set Y    
        
        
            for k = 1 to 5
            for m = 0 to 1    
        	        dat = fcolor
                    temp = chardata[k]
                    if temp.0[j] = 0 then 
                        dat = bcolor
                    endif
                    cmd = $0022 : gosub lcd_write_CMD 
                    gosub lcd_write_dat
        	next m
            next k
        	
            dat = bcolor
            gosub lcd_write_dat
            lcdy = lcdy + 1
        next n
        next j 
        lcdx = lcdx + 10       '20X24
    elseif big = 2   then
        for j = 0 to 7   ' data bits 0 - 7
        for n = 0 to 3
                     
                	cmd = $004E : gosub lcd_write_CMD : dat = lcdx : gosub lcd_write_dat  ' RAM Addsress counter set X
                    cmd = $004F : gosub lcd_write_CMD : dat = lcdy : gosub lcd_write_dat  ' RAM Addsress counter set Y    
        
        
            for k = 1 to 5
            for m = 0 to 3    
        	        dat = fcolor
                    temp = chardata[k]
                    if temp.0[j] = 0 then 
                        dat = bcolor
                    endif
                    cmd = $0022 : gosub lcd_write_CMD 
                    gosub lcd_write_dat
        	next m
            next k
        	
            dat = bcolor
            gosub lcd_write_dat
            lcdy = lcdy + 1
        next n
        next j 
        lcdx = lcdx + 24
    
    endif
    return
    
    '=================
    'FONT SAMPLE 5x7
    '=================
    
    Table1:
    lu1 = charpos + char_row
    
    lookup lu1, [0,0,0,0,0,_             'space
                $00,$00,$5f,$00,$00,_	'// 21 !
    			$00,$07,$00,$07,$00,_	' 22 "
    			$14,$7f,$14,$7f,$14,_	 ' 23 #
    			$24,$2a,$7f,$2a,$12,_	 ' 24 $
    			$23,$13,$08,$64,$62,_	'  25%
    			$36,$49,$55,$22,$50,_	 ' 26 &
    			$00,$05,$03,$00,$00,_	 ' 27 '
    			$00,$1c,$22,$41,$00,_	 ' 28 (
    			$00,$41,$22,$1c,$00,_	 ' 29 )
    			$14,$08,$3e,$08,$14,_	 ' 2a *
    			$08,$08,$3e,$08,$08,_	 ' 2b +
    			$00,$50,$30,$00,$00,_	 ' 2c ,
    			$08,$08,$08,$08,$08,_	 ' 2d -
    			$00,$60,$60,$00,$00,_	 ' 2e .
    			$20,$10,$08,$04,$02,_	 ' 2f /
    			$3e,$51,$49,$45,$3e,_	 ' 30 0
    			$00,$42,$7f,$40,$00,_	 ' 31 1
    			$42,$61,$51,$49,$46,_    ' 32 2
    			$21,$41,$45,$4b,$31,_    ' 33 3
    			$18,$14,$12,$7f,$10,_    ' 34 4
    			$27,$45,$45,$45,$39,_    ' 35 5
    			$3c,$4a,$49,$49,$30,_    ' 36 6
    			$01,$71,$09,$05,$03,_    ' 37 7
    			$36,$49,$49,$49,$36,_    ' 38 8
    			$06,$49,$49,$29,$1e,_	'// 39 9
    			$00,$36,$36,$00,$00,_	'// 3a :
    			$00,$56,$36,$00,$00,_	'// 3b ;
    			$08,$14,$22,$41,$00,_	'// 3c <
    			$14,$14,$14,$14,$14,_	'// 3d =
    			$00,$41,$22,$14,$08,_	'// 3e >
    			$02,$01,$51,$09,$06,_	'// 3f ?
    			$32,$49,$79,$41,$3e,_	'// 40 @
    			$7e,$11,$11,$11,$7e,_	'// 41 A
    			$7f,$49,$49,$49,$36,_	'// 42 B
    			$3e,$41,$41,$41,$22,_	'// 43 C
                $7f,$41,$41,$22,$1c,_	'// 44 D
    			$7f,$49,$49,$49,$41,_	'// 45 E
    			$7f,$09,$09,$09,$01,_	'// 46 F
    			$3e,$41,$49,$49,$7a,_	''// 47 G
    			$7f,$08,$08,$08,$7f,_	'// 48 H
    			$00,$41,$7f,$41,$00,_	'// 49 I
    			$20,$40,$41,$3f,$01,_	'// 4a J
    			$7f,$08,$14,$22,$41,_	'// 4b K
    			$7f,$40,$40,$40,$40,_	'// 4c L
    			$7f,$02,$0c,$02,$7f,_	'// 4d M
    			$7f,$04,$08,$10,$7f,_	'// 4e N
    			$3e,$41,$41,$41,$3e],temp	'// 4f O
    chardata[char_row + 1] = temp
    
    
    Return
    
    Table2:
    lu1 = charpos + char_row
    
    lookup lu1, [$7f,$09,$09,$09,$06,_	'// 50 P
                $3e,$41,$51,$21,$5e,_	'// 51 Q
    			$7f,$09,$19,$29,$46,_	'// 52 R
    			$46,$49,$49,$49,$31,_	'// 53 S
    			$01,$01,$7f,$01,$01,_	'// 54 T
    			$3f,$40,$40,$40,$3f,_	'// 55 U
    			$1f,$20,$40,$20,$1f,_	'// 56 V
    			$3f,$40,$38,$40,$3f,_	'// 57 W
    			$63,$14,$08,$14,$63,_	'// 58 X
    			$07,$08,$70,$08,$07,_	'// 59 Y
    			$61,$51,$49,$45,$43,_	'// 5a Z
    			$00,$7f,$41,$41,$00,_	'// 5b [
    			$02,$04,$08,$10,$20,_	'// 5c
    			$00,$41,$41,$7f,$00,_	'// 5d
    			$04,$02,$01,$02,$04,_	'// 5e
    			$40,$40,$40,$40,$40,_	'// 5f
    			$00,$01,$02,$04,$00,_	'// 60
    			$20,$54,$54,$54,$78,_	'// 61 a
    			$7f,$48,$44,$44,$38,_	'// 62 b
    			$38,$44,$44,$44,$20,_	'// 63 c
    			$38,$44,$44,$48,$7f,_	'// 64 d
    			$38,$54,$54,$54,$18,_	'// 65 e
    			$08,$7e,$09,$01,$02,_	'// 66 f
    			$0c,$52,$52,$52,$3e,_	'// 67 g
    			$7f,$08,$04,$04,$78,_	'// 68 h
    			$00,$44,$7d,$40,$00,_	'// 69 i
    			$20,$40,$44,$3d,$00,_	'// 6a j 
    			$7f,$10,$28,$44,$00,_	'// 6b k
    			$00,$41,$7f,$40,$00,_	'// 6c l
    			$7c,$04,$18,$04,$78,_	'// 6d m
    			$7c,$08,$04,$04,$78,_	'// 6e n
    			$38,$44,$44,$44,$38,_	'// 6f o
    			$7c,$14,$14,$14,$08,_	'// 70 p
    			$08,$14,$14,$18,$7c,_	'// 71 q
    			$7c,$08,$04,$04,$08,_	'// 72 r
    			$48,$54,$54,$54,$20,_	'// 73 s
    			$04,$3f,$44,$40,$20,_	'// 74 t
    			$3c,$40,$40,$20,$7c,_	'// 75 u
    			$1c,$20,$40,$20,$1c,_	'// 76 v
    			$3c,$40,$30,$40,$3c,_	'// 77 w
    			$44,$28,$10,$28,$44,_	'// 78 x
    			$0c,$50,$50,$50,$3c,_	'// 79 y
    			$44,$64,$54,$4c,$44,_	'// 7a z
    			$00,$08,$36,$41,$00,_	'// 7b
    			$00,$00,$7f,$00,$00,_	'// 7c
    			$00,$41,$36,$08,$00,_	'// 7d
    			$10,$08,$08,$10,$08,_	'// 7e
    			$78,$46,$41,$46,$78], temp '	// 7f
    chardata[char_row + 1] = temp
    
    
    Return  
    '******************************************************************************
    
    
    
    
    
    '******************************************************************************
    
    '******************************************************************************
    
    '''*******************************************************************************
    spi_Write:
    		
           SPI_Buf_out[0] = $90    'read y   ADS7843
           SPI_Buf_out[1] = 0
           SPI_Buf_out[2] = $D0    'read x   ADS7843                                                  '
           SPI_Buf_out[3] = 0
           SPI_Buf_out[4] = 0 
           low tp_cs               ' enable touch screen
            
            
            SPI_Buf_in = SSPBUF	' Clear the buffer.
    		SSPIF = 0		' Clear the interrupt flag.
    for spi_cnt = 0 to 4
    		SSPBUF = SPI_Buf_out[spi_cnt]	' Send the byte.
      		While !SSPIF		' Wait for send to complete.
    		Wend
            SPI_Buf_in[spi_cnt] = SSPBUF    'receive data and put in array
            SSPIF = 0          ' reset flag
    next spi_cnt        
    '-------------------Calabration-----------------------------------------------
    ' spi returns a  12 bit number highest is 4095
    ' if the desplay is 320X240  x = 320  so-- 4095/320 = 12.80
    ' we must use integer math,  multiply the spi result by 100, 
    ' then devide that result by the calibration factor  1280 ( 12.80 * 100 )
    ' adjust this number to your display, then do the same for the Y
    '---------------------------------------------------------------------------
         high tp_cs                ' disable touch screen
         ts_y = SPI_Buf_in[1] <<5
         ts_y = 240-(((ts_y +  SPI_Buf_in[2] >>3)*100)/1800)   ' Calibration = 1800 very rough number, change to suit your scteen
         ts_x = SPI_Buf_in[3] <<5
         ts_x = 320-(((ts_x +  SPI_Buf_in[4] >>3)*100)/1244)     
    return
    '*******************************************************************************
    Print_Number:    ' need lcd_x , lcd_y , number, len, 
         temp5 = lcdy
       for i = len to 0 step -1
       char = number dig i  + 48
       gosub putclcdtext
       lcdy = temp5
        next i
    
    return
    '*******************************************************************************
    
    
    
    '*******************************************************************************
    
    '*******************************************************************************
    
    
    
    '*******************************************************************************
    
    TS_Init:       ' Touch initalization
    '---SPI ________________________________
    'SSPCON1.2 = 1
    SSPEN = 1         ' enable SPI pins  = 1
    CKP = 0           ' clock idle low
    CKE = 1           ' transmit on idle to active transition
    SSPIF = 0         ' clear buffer full status
    SMP = 0            ' sample in middle of data
    
    Return
    '---[INT - interrupt handler]---------------------------------------------------
    TS_INT:
     
    gosub LCD_HOME
    gosub clr_disp
    bcolor = white
    fcolor = black
     color = red
     sx = 159
     ex = 161
     sy = 119
     ey = 121
    gosub fill_rect      'Center dot to check calibration
    gosub LCD_HOME
    gosub  spi_write
    while pen_down = 0
    @ printstr2 125,20, "X = "
    @ printstr2 125,30, "Y = "
    lcdx = 165
    lcdy = 20
    len = 3
    number = ts_x
    gosub  print_number
    lcdx = 165
    lcdy = 30
    len = 3
    number = ts_y
    gosub  print_number   
    wend
       
    @ INT_RETURN
    
    
    ' ************************************************************
    ' * receive data from the USB bus                            *
    ' ************************************************************
    DoUSBIn:
       USBBufferCount = USBBufferSizeRX              ' RX buffer size
       USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   ' read data, if available
       return
        
    ' ************************************************************
    ' * wait for USB interface to attach                         *
    ' ************************************************************
    DoUSBOut:
       USBBufferCount = USBBufferSizeTX              ' TX buffer size
       USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
       return
    ' ************************************************************
    ' * main program loop - remember, you must keep the USB      *
    ' * connection alive with a call to USBService every couple  *
    ' * of milliseconds or so...                                 *
    ' ************************************************************   
    ProgramStart: 
     gosub lcd_init
     gosub lcd_home
     gosub clr_disp
     pause 3000
     gosub lcd_test
     pause 3000
     gosub clr_disp
    
     color = blue
     sx = 0
     ex = 319
     sy = 0
     ey = 239
     gosub fill_rect
    
     color = black
     sx = 0
     ex = 319
     sy = 0
     ey = 70
     gosub fill_rect                
    
    fcolor = white
    bcolor = black
    @ printstr2 25,20, "Testing SSD2119 Controller"
     gosub lcd_home
     color = black
     sx = 20
     ex = 80
     sy = 90
     ey = 130
     gosub fill_rect
    
     color = yellow
     sx = 30
     ex = 90
     sy = 100
     ey = 140
     gosub fill_rect      
    
     color = black
     sx = 20
     ex = 80
     sy = 160
     ey = 200
     gosub fill_rect
    
     color = red
     sx = 30
     ex = 90
     sy = 170
     ey = 210
     gosub fill_rect  
    
      color = white
     sx = 195
     ex = 205
     sy = 71
     ey = 239
     gosub fill_rect 
    for k = 26 to 30
    glc_cx = 160
    glc_cy  = 120
    glc_r = k
    color = magenta
    gosub  gl_circ
    next k
    pause 2000
    gosub lcd_home
    gosub clr_disp
    big = 0
    bcolor = white
    fcolor = black
    @ printstr2 25,5, "Small"
    big = 1
    @ printstr2 25,20, "Bigger"
    big = 2
    @ printstr2 25,50, "Biggest"
    big = 0
    
    
    pause 3000
    gosub lcd_home
    gosub clr_disp
    
    glc_cx = 160
    glc_cy  = 120
    glc_r = 30
    color = green
    gosub  gl_circ
    gl_x1 = 10
    gl_x2 = 310
    gl_y1 =  10 
    gl_y2 = 230
    color = black
    gosub gl_rect
    gosub lcd_home
    bcolor = white
    fcolor = black
    @ printstr2 25,20, "SSD2119 Controller"
    @ printstr2 25,28, "Dave Cutliff "
    @ printstr2 25,36, "TFT Color LCD Model Rev 1.0"
    @ printstr2 25,44, "320xRGBx240"
    @ printstr2 25,60, "PicBasic Pro6.0 "
    @ printstr2 25,68, "Sept 8,2010"
    gosub ts_init
    Loop1:
    ' gosub DoUSBIn
    '  gosub DoUSBOut
    goto loop1

  2. #2
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Nice work!
    I placed it in the wiki.
    Dave
    Always wear safety glasses while programming.

  3. #3
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    3,809


    Did you find this post helpful? Yes | No

    Default

    Good Job.

    Congrats!

    Ioannis

  4. #4
    Join Date
    Mar 2008
    Location
    Gerogetown, Texas
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Thanks

    I will be adding SD read and a function to make a digital photo frame next.

    Dave

  5. #5
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    Did you find this post helpful? Yes | No

    Default

    Great Job!!!!!!!
    Thanks and Regards;
    Gadelhas

  6. #6
    Join Date
    Mar 2008
    Location
    Gerogetown, Texas
    Posts
    94


    Did you find this post helpful? Yes | No

    Default Short video of project

    Here is a short (poor) video of the color LCD, I added code to scroll through pictures from the SD card.

Members who have read this thread : 2

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts