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
It start with a splash screen, then lists the files on the SD card and then loops through the pictures. Notice that BMP files store the image from bottom to top.
BTW this is a 18F4550 @ 20Mhz
enjoy
Dave
Code:
'**************************************************************** '* Name : SD_PicFrame_TFT.BAS * '* Author : Dave Cutliff * '* Notice : Copyright (c) 2010 You can take all you want * '* : All Rights Reserved * '* Date : 9/21/2010 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** DEFINE OSC 20 DEFINE LOADER_USED 1 ADCON1 = $F 'port A digital CMCON = 7 'PortA Digital INTCON2.7 = 0 'weak pullups portB Include "SDFSR.pbp" SDC_UseHardSPI = TRUE 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 rgb var word cnt var word first 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 b var byte c var byte i var long j var long k var long m var byte n var byte p 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 tmp_color var word tmp1_color var word buffer var byte[10] TempData var byte[3] NoOfChar var byte TextBuffer var byte[64] File1 var byte[11] File2 var byte[11] File3 var byte[11] File4 var byte[11] File5 var byte[11] File6 var byte[11] FileNum var byte BMP_data_offset var byte[4] picdat var byte lcdcharloop var byte lcdchardata var byte[8] tp_cs var PORTB.5 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 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 '****************************************************************************** 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 '******************************************************************************* ProgramStart: gosub lcd_init gosub lcd_home gosub clr_disp 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 pause 2000 gosub lcd_home gosub clr_disp Gosub FSInit @ printstr2 25,20, "INT: " lcdx = 50 lcdy = 20 len = 1 number = FAT_error gosub print_number lcdx = 80 lcdy = 20 len = 2 number = SDC_status gosub print_number lcdx = 120 lcdy = 20 len = 2 number = SDC_response gosub print_number If (FAT_error != 0) Then Stop 'Display card directory lcdx = 50 row = 70 filenum = 1 Gosub FINDfirst ' Find first file on card While (FAT_error = 0) ' number of char = 11 for b = 0 to 10 select case filenum case 1 for c = 0 to 10 file1[c] = FAT_FileName[c] next c case 2 for c = 0 to 10 file2[c] = FAT_FileName[c] next c case 3 for c = 0 to 10 file3[c] = FAT_FileName[c] next c case 4 for c = 0 to 10 file4[c] = FAT_FileName[c] next c case 5 for c = 0 to 10 file5[c] = FAT_FileName[c] next c end select next b lcdx = 50 for c = 0 to 10 char = FAT_FileName[c] lcdy = row gosub putclcdtext next c lcdy = row Gosub FINDnext ' Find next file on card filenum = filenum + 1 row = row + 10 Wend filenum = filenum - 1 'number of file on card pause 2000 ImageLoop: for p = 1 to filenum select case p case 1 for c = 0 to 10 FAT_FileName[c] = file1[c] next c case 2 for c = 0 to 10 FAT_FileName[c] = file2[c] next c case 3 for c = 0 to 10 FAT_FileName[c] = file3[c] next c case 4 for c = 0 to 10 FAT_FileName[c] = file4[c] next c case 5 for c = 0 to 10 FAT_FileName[c] = file5[c] next c end select ' Open a file for read FAT_mode = "r" ' Read mode Gosub FSfopen ' Open file pointed to by Byte array FAT_FileName If (FAT_error != 0) Then Stop ' Read and display the whole file FAT_count = 512 ' Read 512 byte to buffer at a time gosub clr_disp gosub lcd_home lcdx = 0 lcdy = 0 x = 0 cnt = 0 rgb = 0 first = 0 gl_x = 0 gl_y = 240 Gosub FSfread if first = 0 then cnt = fat_dest[$0A] 'read where data starts first = 1 else cnt = 0 endif While (FAT_error = 0) While cnt < 512 tmp_color = 0 tmp1_color = 0 select case rgb case 0 tmp_color = fat_dest[cnt]>>3 dat = tmp_color k =k + 1 case 1 tmp_color = fat_dest[cnt]>>2 tmp1_color = tmp_color<< 5 dat = dat + tmp1_color k =k + 1 case 2 tmp_color = fat_dest[cnt]>>3 tmp1_color = tmp_color<< 11 color = dat + tmp1_color end select cnt = cnt + 1 rgb = rgb + 1 if rgb = 3 then y = gl_y gosub setdot color = 0 x = x + 1 rgb = 0 if x >= 320 then x = 0 gl_y = gl_y - 1 endif endif wend FAT_count = 512 ' Read 512 byte to buffer at a time cnt = 0 Gosub FSfread Wend pause 5000 pause 5000 next p goto imageloop Loop1: ' gosub DoUSBIn ' gosub DoUSBOut goto loop1
Re: CAN header and EXT asm question
Interface board with SPI controlled MCP 2515 and line driver to use with non CAN enabled PIC's
retepsnikrep Yesterday, 08:34https://www.aliexpress.com/item/1005006850683509.html
Line driver to use with CAN enabled PIC's....