#include #include #define DataH P2 #define DataL P0 sbit TFT_CS = P1^0; sbit RES =P1^4; sbit RS = P1^1; sbit WRB = P1^2; sbit RDB = P1^3; sbit KEY = P3^3; #define EN_TP 1 //使能(1),禁止(0) 触摸功能 #define Bcolor 0x00,0x00 //显示IC 背景颜色 #define Fcolor 0xffff //显示IC 字体颜色 #define FBcolor 0x0000 //显示IC 字体背景颜色 /* LCD color */ #define White 0xFFFF #define Black 0x0000 #define Blue 0x001F #define Blue2 0x051F #define Red 0xF800 #define Magenta 0xF81F #define Green 0x07E0 #define Cyan 0x7FFF #define Yellow 0xFFE0 struct pix_ { unsigned int x; unsigned int y; }; extern struct pix_ Tp_pix; //当前触控坐标的取样值 /* touch panel interface define */ sbit DCLK = P3^6; sbit CS = P3^7; sbit DIN = P3^5; sbit BUSY = P3^3; sbit DOUT = P3^4; sbit Penirq = P3^3; //触碰触摸屏时,ADS7843/XPT2046的笔中断Penirq引脚产生低电平中断信号; //没有碰触触摸屏时,触摸控制芯片的笔中断引脚输出为高电平。 void UART_init(void) { SCON=0x40; TMOD=0x20; TH1=0xF3; //波特率计算256-11059200/(12*32*9600) TL1=0xF3; TR1=1; } void UART_send_data(unsigned char str) { SBUF=str; while(!TI); TI=0; } void delay(int value) { int i,j; for(i=0;i<=value;i++) {for(j=0;j<=500;j++);} } void LCD_WRITE_CMD(unsigned int cmd) { RS = 0; RDB = 1; WRB = 1; TFT_CS = 0; DataH = cmd>>8; // UART_send_data(DataH); DataL = cmd; // UART_send_data(DataL); WRB = 0; WRB = 1; TFT_CS = 1; } void LCD_WRITE_DATA(unsigned int dat) { RS = 1; RDB = 1; WRB = 1; TFT_CS = 0; DataH = dat>>8; DataL = dat; WRB = 0; WRB = 1; TFT_CS = 1; } void seng_cmd_dat(unsigned int cmd,unsigned int dat) { LCD_WRITE_CMD(cmd); LCD_WRITE_DATA(dat); } void reset(void) { RES = 1; delay(50); RES = 0; delay(200); RES = 1; delay(500); } void lcd_init(void) { reset(); seng_cmd_dat(0x18,0xAA); //UADJ seng_cmd_dat(0x19,0x01); //OSC_EN='1', start Osc seng_cmd_dat(0x1A,0x04); //BT[2:0] = 4 before sleep out // Power On Setting seng_cmd_dat(0x1F,0x88); delay(5); seng_cmd_dat(0x1F,0x80); delay(5); seng_cmd_dat(0x1F,0x90); delay(5); seng_cmd_dat(0x1F,0xD0); delay(5); //Display ON Setting seng_cmd_dat(0x28,0x38); //GON=1, DTE=1, D=1000 delay(40); seng_cmd_dat(0x28,0x3C); //GON=1, DTE=1, D=1100 seng_cmd_dat(0x36,0x09); //REV, BGR seng_cmd_dat(0x17,0x05); // 06: 262k, 05:65k seng_cmd_dat(0xEB,0x26); //PTBA[7:0] seng_cmd_dat(0x2F,0x11); // Line Inversion seng_cmd_dat(0x29,0xFF); // RTN = 142 seng_cmd_dat(0x2A,0x00); // RTN = 142 seng_cmd_dat(0x2B,0x02); // Normal Dummy Line seng_cmd_dat(0x2C,0x02); // Idle Dummy Line seng_cmd_dat(0x2D,0x04); // G On seng_cmd_dat(0x2E,0x80); // G Off seng_cmd_dat(0x18,0xAA); //OSC seng_cmd_dat(0x1A,0x02); //BT seng_cmd_dat(0x1B,0x1E); //VRH seng_cmd_dat(0xE2,0x04); //VREF seng_cmd_dat(0xE3,0x04); //DDVDH seng_cmd_dat(0x24,0x47); //VCOM L seng_cmd_dat(0x25,0x3f); //VCOM H seng_cmd_dat(0x23,0x70); //VCOM OFFset//70 seng_cmd_dat(0xE8,0x50); //N_OPON seng_cmd_dat(0xEC,0x38); //STBA[15:8] seng_cmd_dat(0xED,0x08); //STBA[7:0] seng_cmd_dat(0xE4,0x0F); //EQVCI_M0 seng_cmd_dat(0xE5,0x02); //EQGND_M0 seng_cmd_dat(0xE6,0x0F); //EQVCI_M1 seng_cmd_dat(0xE7,0x02); //EQGND_M1 seng_cmd_dat(0xF3,0x00); //SEQVCI_M1 seng_cmd_dat(0xF4,0x00); //SEQGND_M0 seng_cmd_dat(0x40,0x02); // seng_cmd_dat(0x41,0x08); // seng_cmd_dat(0x42,0x08); // seng_cmd_dat(0x43,0x13); // seng_cmd_dat(0x44,0x11); //5 seng_cmd_dat(0x45,0x25); // seng_cmd_dat(0x46,0x0A); // seng_cmd_dat(0x47,0x56); // seng_cmd_dat(0x48,0x03); // seng_cmd_dat(0x49,0x12); //10 seng_cmd_dat(0x4A,0x18); // seng_cmd_dat(0x4B,0x1A); // seng_cmd_dat(0x4C,0x19); // seng_cmd_dat(0x50,0x1A); // seng_cmd_dat(0x51,0x2E); //15 seng_cmd_dat(0x52,0x2C); // seng_cmd_dat(0x53,0x37); // seng_cmd_dat(0x54,0x37); // seng_cmd_dat(0x55,0x3D); // seng_cmd_dat(0x56,0x29); //20 seng_cmd_dat(0x57,0x75); // seng_cmd_dat(0x58,0x06); // seng_cmd_dat(0x59,0x05); // seng_cmd_dat(0x5A,0x07); // seng_cmd_dat(0x5B,0x0D); // seng_cmd_dat(0x5C,0x1C); // seng_cmd_dat(0x5D,0x88); // seng_cmd_dat(0xFF,0x01); //PAGE 1 Color Enhance seng_cmd_dat(0x71,0x00); //SG0_F seng_cmd_dat(0x72,0x06); //SG64_F seng_cmd_dat(0x73,0x04); //SG128_F seng_cmd_dat(0x74,0x02); //SG192_F seng_cmd_dat(0x75,0x00); //SG255_F seng_cmd_dat(0x76,0x01); //CE_EN = 1 seng_cmd_dat(0xFF,0x02); //PAGE 2 Ver.C IC ???? seng_cmd_dat(0x0C,0x40); //EC01 bit 6 Full pump seng_cmd_dat(0xFF,0x00); //PAGE 0 LCD_WRITE_CMD(0x22); //Start GRAM write } void LCD_SET_WIN(void) { seng_cmd_dat(0x0002,0x0000); // Column address start2 seng_cmd_dat(0x0003,0x0000); // Column address start1 seng_cmd_dat(0x0004,0x0000); // Column address end2 seng_cmd_dat(0x0005,0x00ef); // Column address end1 seng_cmd_dat(0x0006,0x0000); // Row address start2 seng_cmd_dat(0x0007,0x0000); // Row address start1 seng_cmd_dat(0x0008,0x0001); // Row address end2 seng_cmd_dat(0x0009,0x003f); // Row address end1 LCD_WRITE_CMD(0x0022);//LCD_WriteCMD(GRAMWR); } void LCD_BRUSH(int color) { int i,j; for(i=0;i<320;i++) { for(j=0;j<240;j++) { // LCD_WRITE_DATA(color>>8); // LCD_WRITE_DATA(color); LCD_WRITE_DATA(color); } } } unsigned char LCD_ID(unsigned int dat) { unsigned char DL,DH; unsigned char id; LCD_WRITE_CMD( dat); // DEVICE_Id=0x04 P2=0xff; // 高八位 的 单片机IO定义 P0=0xff; // 低八位 的 单片机IO定义 //读第一个参数,空操作,没用 RS=1; // 数据模式 TFT_CS=0; // 片选 RDB=0; DH=P2; DL=P0; //1byte RDB=1; UART_send_data(DH); UART_send_data(DL); // 读第二个参数, TFT_CS=0; return id; } //================================================================================================ // 实现功能: 触摸中断检查,触摸会中断显示,不触摸继续 // 输入参数: 无 //================================================================================================ void NO_Keypress() { while(!KEY) delay(10); } //================================================================================================ // 实现功能: 触摸中断检查 ,触摸 会继续显示,不触摸停止 // 输入参数: 无 //================================================================================================ void Keypress() { while(KEY) delay(10); } //================================================================================================ // 实现功能: SPI开始 // 输入参数: 无 //================================================================================================ void spistart() { CS=1; DCLK=1; DIN=1; DCLK=1; } //================================================================================================ // 实现功能: SPI写数据 // 输入参数: num //================================================================================================ void WriteCharTo7843(unsigned char num) { unsigned char count=0; DCLK=0; for(count=0;count<8;count++) { num<<=1; DIN=CY; DCLK=0; _nop_();_nop_();_nop_(); //上升沿有效 DCLK=1; _nop_();_nop_();_nop_(); } } //================================================================================================ // 实现功能: SPI读数据 // 输入参数: 无 //================================================================================================ unsigned int ReadFromCharFrom7843() //SPI 读数据 { unsigned char count=0; unsigned int Num=0; for(count=0;count<12;count++) { Num<<=1; DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效 DCLK=0; _nop_();_nop_();_nop_(); if(DOUT) Num++; } return(Num); } void set_point(unsigned int x,unsigned int y) { seng_cmd_dat(0x0002,x>>8); // Column address start2 seng_cmd_dat(0x0003,x); // Column address start1 seng_cmd_dat(0x0004,x>>8); // Column address end2 seng_cmd_dat(0x0005,x); // Column address end1 seng_cmd_dat(0x0006,y>>8); // Row address start2 seng_cmd_dat(0x0007,y); // Row address start1 seng_cmd_dat(0x0008,y>>8); // Row address end2 seng_cmd_dat(0x0009,y); // Row address end1 LCD_WRITE_CMD(0x0022);//LCD_WriteCMD(GRAMWR); } //================================================================================================ // 实现功能: 设置TFT显示窗口坐标 // 输入参数: x0,x1,y0,y1 //================================================================================================ void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1) { set_point(x0,y0); } //================================================================================================ // 实现功能: 触摸画点 // 输入参数: X,Y,color //================================================================================================ void drawpoint(unsigned char x,unsigned int y,unsigned int color) { LCD_SetPos(x,x+1,y,y+1); LCD_WRITE_DATA(color); LCD_WRITE_DATA(color); LCD_WRITE_DATA(color); LCD_WRITE_DATA(color); } //================================================================================================ // 实现功能: 软件滤波 // 输入参数: 无 //================================================================================================ unsigned char Makpix(struct pix_ pix1,struct pix_ pix2) { unsigned char l=0; int x=pix1.x>pix2.x?pix1.x-pix2.x:pix2.x-pix1.x; int y=pix1.y>pix2.y?pix1.y-pix2.y:pix2.y-pix1.y; if(x<14&&y<11) //软件滤波,2次取样的值相差太大的视为噪声 { l=1; Tp_pix.x=(pix1.x+pix2.x)/2; Tp_pix.y=(pix1.y+pix2.y)/2; } return l; } //================================================================================================ // 实现功能: 读取X,Y 坐标 // 输入参数: 无 //================================================================================================ struct pix_ AD7843() { struct pix_ pix; CS=0; WriteCharTo7843(0x90); //送控制字 10010000 即用差分方式读X坐标 详细请见有关资料 DCLK=1; _nop_();_nop_();_nop_();_nop_(); DCLK=0; _nop_();_nop_();_nop_();_nop_(); pix.y=ReadFromCharFrom7843(); WriteCharTo7843(0xD0); //送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料 DCLK=1; _nop_();_nop_();_nop_();_nop_(); DCLK=0; _nop_();_nop_();_nop_();_nop_(); pix.x=ReadFromCharFrom7843(); CS=1; return pix; } //================================================================================================ // 实现功能: 软件滤波 // 输入参数: 无 //================================================================================================ unsigned char Getpix() //取采样值,此处使用软件滤波,2次取样的值相差太大的视为噪声 { struct pix_ pix1; struct pix_ pix2; pix1=AD7843(); pix2=AD7843(); return Makpix(pix1,pix2); } //================================================================================================ // 实现功能: 中断0 // 输入参数: 无 //================================================================================================ void INRT() interrupt 0 { unsigned int X=0,Y=0; delay(10000); //中断后延时以消除抖动,使得采样数据更准确 spistart(); //启动SPI // while(!BUSY); //如果BUSY信号不好使可以删除不用 delay(2); WriteCharTo7843(0x90); //送控制字 10010000 即用差分方式读X坐标 详细请见有关资料 // while(!BUSY); //如果BUSY信号不好使可以删除不用 delay(2); DCLK=1; _nop_();_nop_();_nop_();_nop_(); DCLK=0; _nop_();_nop_();_nop_();_nop_(); X=ReadFromCharFrom7843(); //读X轴坐标 WriteCharTo7843(0xD0); //送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料 DCLK=1; _nop_();_nop_();_nop_();_nop_(); DCLK=0; _nop_();_nop_();_nop_();_nop_(); Y=ReadFromCharFrom7843(); //读Y轴坐标 } struct pix_ Tp_pix; void main(void) { unsigned char id; unsigned int lx,ly,i; UART_init(); reset(); id = LCD_ID(0x00); lcd_init(); LCD_SET_WIN(); while(1) { LCD_BRUSH(0xf800); delay(1000); Keypress(); LCD_BRUSH(0x0000); delay(1000); LCD_BRUSH(0xf7de); delay(1000); LCD_BRUSH(0x001f); delay(1000); LCD_BRUSH(0xffff); #if EN_TP spistart(); //模拟spi初始化 while(1) { if (Penirq==0) { if(Getpix()==1) //得到当前TP的取样值,此处使用软件滤波,2次取样的值相差太大的视为噪声 { lx=(4096-Tp_pix.x-320)/15+7;//x轴采样值转换成TFT的横坐标 ly=(Tp_pix.y-220)/11;//y轴采样值转换成TFT的纵坐标 drawpoint(lx,ly,Black); //写(x,y)点为红色 } } else { } } #endif //// LCD_BRUSH(0xf81f); //// delay(1000); // LCD_BRUSH(0x07e0); // delay(1000); // LCD_BRUSH(0x001f); // delay(1000); // LCD_BRUSH(0xffe0); // delay(1000); } }