/******************************************************************** * 文件名:main.c * 功能:测试TFT屏的驱动函数 * 作者:jianqi * 版本:v1.0 ********************************************************************/ #include"2440addr.h" //包含2440相关寄存器的设置 #include"TFT.h" #include"Touch.h" #include"MMU.h" #include"UART.h" volatile int A,B,C,D,E,F,K; //校正参数 int flagTS=0; //触摸屏转换标志 int xdata,ydata; //触摸屏A/D转换数据 /******************************************* * 名称:Touch_Int * 功能:触摸屏中断程序,读取A/D转换的值 * 入口参数:无 * 出口参数:无 **********************************************/ void __irq Touch_Int(void) //中断函数 { rINTSUBMSK |= ((U32)0x1<<9); //关闭中断服务 if (rADCUPDN&(U32)0x01) //触笔down { rADCUPDN=0; //清除标志位 Send_String("down"); //打印信息(调试用) rADCTSC = (1<<3)|(1<<2); //上拉无效,自动XY坐标转换模式 rADCCON|=0x1; //开始A/D转换 while(rADCCON&0x1); //等待AD转换开始 while(!(rADCCON&(1<<15))); //等待AD转换结束 xdata=(rADCDAT0&0x3ff); //保存A/D转换的x位置 ydata=(rADCDAT1&0x3ff); //保存A/D转换的y位置 flagTS=0; rADCTSC=0xd3|(1<<8); //再次设置等待中断模式,目的判断触笔up } if((rADCUPDN>>1)&(U32)0x01) //触笔up { rADCUPDN=0; //清除标志位 Send_String("up"); //打印信息(调试用) flagTS=1; //一次接触完毕 rADCTSC=0xd3; //设置触摸屏为等待中断模式。 } rSRCPND|=(U32)0x1<<31; //清中断标志 rSUBSRCPND|=(U32)0x01<<9; rINTPND|=(U32)0x1<<31; rINTSUBMSK&=~((U32)0x1<<9); //打开中断服务 } /******************************************* * 名称:Delay * 功能:延时 * 入口参数:无 * 出口参数:无 **********************************************/ void Delay(void) { int i,j,k; for(i=0;i<20;i++) { for(j=0;j<100;j++) { for(k=0;k<1000;k++); } } } /******************************************* * 名称:Calibration * 功能:触摸屏校正 * 入口参数:无 * 出口参数:无 **********************************************/ void Calibration(void) { char i; int xt[3],yt[3]; TFT_CLearScreen(0xFFFFFF); Draw_Cross(32,24,0xFF0000); Draw_Cross(160,216,0xFF0000); Draw_Cross(288,120,0xFF0000); //依次读取三个采样点的坐标值 for(i=0;i<3;i++) { while(flagTS==0) { Delay(); } Send_String("Over"); xt[i]=xdata; yt[i]=ydata; flagTS=0; } //计算参数 K=(xt[0]-xt[2])*(yt[1]-yt[2])-(xt[1]-xt[2])*(yt[0]-yt[2]); A=(32-288)*(yt[1]-yt[2])-(160-288)*(yt[0]-yt[2]); B=(xt[0]-xt[2])*(160-288)-(32-288)*(xt[1]-xt[2]); C=yt[0]*(xt[2]*160-xt[1]*288)+yt[1]*(xt[0]*288-xt[2]*32)+yt[2]*(xt[1]*32-xt[0]*160); D=(24-120)*(yt[1]-yt[2])-(216-120)*(yt[0]-yt[2]); E=(xt[0]-xt[2])*(216-120)-(24-120)*(xt[1]-xt[2]); F=yt[0]*(xt[2]*216-xt[1]*120)+yt[1]*(xt[0]*120-xt[2]*24)+yt[2]*(xt[1]*24-xt[0]*216); } /******************************************* * 名称:Touch_Screen_Init * 功能:触摸屏中断初始化 * 入口参数:无 * 出口参数:无 **********************************************/ void Touch_Screen_Init(void) { rADCDLY=50000; //设置延时 rADCCON=(1<<14)|(20<<6); //设置A/D预分频 rADCTSC=0xd3; //设置等待中断模式 rSUBSRCPND|=(1<<9); rSRCPND|=(1<<31); rINTPND|=(1<<31); rINTSUBMSK&=~(1<<9); rINTMSK&=~(1<<31); //打开中断屏蔽 } /******************************************* * 名称:Clk_Set * 功能:关于系统时钟的初始化 * 入口参数:无 * 出口参数:无 **********************************************/ void Clk_Set(void) { int count; rUPLLCON=(56<<12)|(2<<4)|2; //UCLK为48MHZ for(count=0;count<10;count++) { ; } rMPLLCON=(92<<12)|(1<<4)|1; //FCLK为400MHZ rCLKDIVN=(0<<3)|(2<<1)|1; //HCLK位100MHZ,PCLK为50MHZ rCAMDIVN=(0<<9); //PCLK=HCLK/4 } /******************************************* * 名称:Main * 功能:测试TFT屏幕 * 入口参数:无 * 出口参数:无 **********************************************/ void Main(void) { int x,y; MMU_Init(); //MMU初始化 UART0_init(); //串口初始化 TFT_Power_Enable(1); //TFT电源管理使能 TFT_Contraller_Init(); //TFT初始化 TFT_Video_ON(1); //打开TFT pISR_ADC=(U32)Touch_Int; //注册触摸屏中断函数 Touch_Screen_Init(); //触摸屏初始化 Calibration(); //触摸屏校正 TFT_CLearScreen((0x00<<11) | (0x00<<5) | (0x1f)); //Paint_Picture(0,0,480,272,TQ_LOGO_480272_2); while(1) { if(flagTS) { flagTS=0; Send_String("OK"); x=(A*xdata+B*ydata+C)/K; //计算X轴坐标 y=(D*xdata+E*ydata+F)/K; //计算Y轴坐标 Draws_Quare(x,y,0x00); //在触摸坐标处绘制正方形 } } }