哪位大侠帮我分析一下这个驱动程序,每次显示都是一个固定坐标。或者发到我的邮箱 个人信息保护,已隐藏 万分感谢! #include #include #include
#define uint unsigned int #define uchar unsigned char #define _nop_() asm("nop")
#define TFT_DataPortH PORTD //高8位数据口,8位模式下只使用高8位 #define TFT_DataPortL PORTF //低8位数据口,8位模式下低8位可以不接线
#define TFT_RS PA3 //数据/命令切换 #define TFT_WR PA2 //写控制 #define TFT_RD PA5 //读控制 #define TFT_CS PA4 //片选 #define TFT_RST PA6 //复位
/* touch panel interface define */ #define DCLK PE1 // #define CS PE3 // #define DIN PE5 // #define DOUT PE0 // #define Penirq PE2 //检测触摸屏响应信号 uint TP_X=0; uint TP_Y=0; //当前触控坐标 *定义常用颜色的颜色码*/ #define RED 0xf800 //红 #define YELLOW 0xffe0 //黄 #define GREEN 0x07e0 //绿 #define CYAN 0x07ff //青 #define BLUE 0x001f //蓝 #define PURPLE 0xf81f //紫 #define BLACK 0x0000 //黑 #define WHITE 0xffff //白 #define GRAY 0x7bef //灰 //**********************************************************
void spistar(void) //SPI开始 { PORTE &=~(1<PORTE |=(1<PORTE |=(1<PORTE |=(1<PORTE &=~(1<} //********************************************************** void WriteCharTo7843(unsigned char num) //SPI写数据 { uchar count=0; PORTE &=~(1<for(count=0;count<8;count++) { num<<=1; if(SREG&0x01) PORTE |= (1<else PORTE &= ~(1<PORTE &=~(1< //上升沿有效 PORTE |= (1<} } //********************************************************** uint ReadFromCharFrom7843(void) //SPI 读数据 { uchar count=0; uint Num=0; for(count=0;count<12;count++) { Num<<=1; PORTE |= (1<PORTE &=~(1<if((PINE&0X01)==1) Num++; }PORTA &=~(1<return(Num); }
void inttostr(int dd,unsigned char *str) { str[0]=dd/10000+48; str[1]=(dd/1000)-((dd/10000)*10)+48; str[2]=(dd/100)-((dd/1000)*10)+48; str[3]=(dd/10)-((dd/100)*10)+48; str[4]=dd-((dd/10)*10)+48; str[5]=0; }
void AD7843(void) //外部中断0 用来接受触屏中断发来的数据 { _delay_ms(2); spistar(); _delay_ms(2); //PORTE &=~(1<WriteCharTo7843(0x90);//送控制字 10010000 即用差分方式读X坐标
详细请见有关资料 _delay_ms(2); PORTE |= (1< 下降沿有效 PORTE &=~(1<TP_X=ReadFromCharFrom7843(); _nop_();_nop_();_nop_();_nop_(); WriteCharTo7843(0xD0);//送控制字 11010000 即用差分方式读Y坐标
详细请见有关资料 PORTE |= (1< 下降沿有效 PORTE &=~(1<TP_Y=ReadFromCharFrom7843(); PORTE |= (1<GUI_wrul(33, 33,TP_X,0,0xffff);//在这里每次显示都是同一个数值,为什么? GUI_wrul(33,49,TP_Y , 0,0xffff);//在这里每次显示都是同一个数值,为什么? }
void write_data(unsigned char DH,unsigned char DL) { TFT_DataPortH=DH; TFT_DataPortL=DL;
PORTA &=~(1<PORTA |= (1<}
void LCD_Write_COM(unsigned char CH,unsigned char CL) { PORTA &=~(1<write_data(CH,CL); }
void LCD_Write_DATA(unsigned char cmd,unsigned int dat) { PORTA |=(1<write_data(cmd,dat); }
void write_data_u16(unsigned int dat) { unsigned char m,n; PORTA |=(1<m=dat>>8; n=dat; write_data(m,n); } void Address_set(unsigned int x1,unsigned int y1,unsigned int
x2,unsigned int y2) { LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1>>8,x1); //设置X坐标位置 LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1>>8,y1);//设置Y坐标位置 LCD_Write_COM(0x00,0x50);LCD_Write_DATA(x1>>8,x1); //开始X LCD_Write_COM(0x00,0x52);LCD_Write_DATA(y1>>8,y1); //开始Y LCD_Write_COM(0x00,0x51);LCD_Write_DATA(x2>>8,x2); //结束X LCD_Write_COM(0x00,0x53);LCD_Write_DATA(y2>>8,y2); //结束Y LCD_Write_COM(0x00,0x22);
}
void LCD_Init(void) {
PORTA |= (1<_delay_ms(5); PORTA &= ~(1<_delay_ms(5); PORTA |= (1<_delay_ms(50);//可以适当调整延时,保障稳定显示
PORTA &=~(1<_delay_ms(5); //************* Start Initial Sequence **********// LCD_Write_COM(0x00,0xE5); LCD_Write_DATA(0x78,0xF0); // set
SRAM internal timing LCD_Write_COM(0x00,0x01); LCD_Write_DATA(0x01,0x00); // set SS
and SM bit LCD_Write_COM(0x00,0x02); LCD_Write_DATA(0x07,0x00); // set 1
line inversion LCD_Write_COM(0x00,0x03); LCD_Write_DATA(0x10,0x30); // set
GRAM write direction and BGR=1. LCD_Write_COM(0x00,0x04); LCD_Write_DATA(0x00,0x00); // Resize
register LCD_Write_COM(0x00,0x08); LCD_Write_DATA(0x02,0x07); // set
the back porch and front porch LCD_Write_COM(0x00,0x09); LCD_Write_DATA(0x00,0x00); // set
non-display area refresh cycle ISC[3:0] LCD_Write_COM(0x00,0x0A); LCD_Write_DATA(0x00,0x00); // FMARK
function LCD_Write_COM(0x00,0x0C); LCD_Write_DATA(0x00,0x00); // RGB
interface setting LCD_Write_COM(0x00,0x0D); LCD_Write_DATA(0x00,0x00); // Frame
marker Position LCD_Write_COM(0x00,0x0F); LCD_Write_DATA(0x00,0x00); // RGB
interface polarity //*************Power On sequence ****************// LCD_Write_COM(0x00,0x10); LCD_Write_DATA(0x00,0x00); // SAP,
BT[3:0], AP, DSTB, SLP, STB LCD_Write_COM(0x00,0x11); LCD_Write_DATA(0x00,0x07); // DC1
[2:0], DC0[2:0], VC[2:0] LCD_Write_COM(0x00,0x12); LCD_Write_DATA(0x00,0x00); //
VREG1OUT voltage LCD_Write_COM(0x00,0x13); LCD_Write_DATA(0x00,0x00); // VDV
[4:0] for VCOM amplitude LCD_Write_COM(0x00,0x07); LCD_Write_DATA(0x00,0x01); _delay_ms(50); // Dis-charge capacitor power voltage LCD_Write_COM(0x00,0x10); LCD_Write_DATA(0x10,0x90); //
1490//SAP, BT[3:0], AP, DSTB, SLP, STB LCD_Write_COM(0x00,0x11); LCD_Write_DATA(0x02,0x27); // DC1
[2:0], DC0[2:0], VC[2:0] _delay_ms(50); // Delay 50ms LCD_Write_COM(0x00,0x12); LCD_Write_DATA(0x00,0x1F); //001C//
Internal reference voltage= Vci; _delay_ms(50); // Delay 50ms LCD_Write_COM(0x00,0x13); LCD_Write_DATA(0x15,0x00);
//0x1000//1400 Set VDV[4:0] for VCOM amplitude 1A00 LCD_Write_COM(0x00,0x29); LCD_Write_DATA(0x00,0x27); //0x0012
//001a Set VCM[5:0] for VCOMH //0x0025 0034 LCD_Write_COM(0x00,0x2B); LCD_Write_DATA(0x00,0x0D); // Set
Frame Rate 000C _delay_ms(50); // Delay 50ms LCD_Write_COM(0x00,0x20); LCD_Write_DATA(0x00,0x00); // GRAM
horizontal Address LCD_Write_COM(0x00,0x21); LCD_Write_DATA(0x00,0x00); // GRAM
Vertical Address // ----------- Adjust the Gamma Curve ----------// LCD_Write_COM(0x00,0x30); LCD_Write_DATA(0x00,0x00); LCD_Write_COM(0x00,0x31); LCD_Write_DATA(0x07,0x07); LCD_Write_COM(0x00,0x32); LCD_Write_DATA(0x03,0x07); LCD_Write_COM(0x00,0x35); LCD_Write_DATA(0x02,0x00); LCD_Write_COM(0x00,0x36); LCD_Write_DATA(0x00,0x08);//0207 LCD_Write_COM(0x00,0x37); LCD_Write_DATA(0x00,0x04);//0306 LCD_Write_COM(0x00,0x38); LCD_Write_DATA(0x00,0x00);//0102 LCD_Write_COM(0x00,0x39); LCD_Write_DATA(0x07,0x07);//0707 LCD_Write_COM(0x00,0x3C); LCD_Write_DATA(0x00,0x02);//0702 LCD_Write_COM(0x00,0x3D); LCD_Write_DATA(0x1D,0x04);//1604
//------------------ Set GRAM area ---------------// LCD_Write_COM(0x00,0x50); LCD_Write_DATA(0x00,0x00); //
Horizontal GRAM Start Address LCD_Write_COM(0x00,0x51); LCD_Write_DATA(0x00,0xEF); //
Horizontal GRAM End Address LCD_Write_COM(0x00,0x52); LCD_Write_DATA(0x00,0x00); //
Vertical GRAM Start Address LCD_Write_COM(0x00,0x53); LCD_Write_DATA(0x01,0x3F); //
Vertical GRAM Start Ad