s3c2440的觸摸屏校正與測試
本文引用地址:http://m.butianyuan.cn/article/201611/318934.htm
- /********************************************************************
- *文件名:main.c
- *功能:測試TFT屏的驅(qū)動函數(shù)
- *作者:jianqi
- *版本:v1.0
- ********************************************************************/
- #include"2440addr.h"http://包含2440相關(guān)寄存器的設(shè)置
- #include"TFT.h"
- #include"Touch.h"
- #include"MMU.h"
- #include"UART.h"
- volatileintA,B,C,D,E,F,K;//校正參數(shù)
- intflagTS=0;//觸摸屏轉(zhuǎn)換標(biāo)志
- intxdata,ydata;//觸摸屏A/D轉(zhuǎn)換數(shù)據(jù)
- /*******************************************
- *名稱:Touch_Int
- *功能:觸摸屏中斷程序,讀取A/D轉(zhuǎn)換的值
- *入口參數(shù):無
- *出口參數(shù):無
- **********************************************/
- void__irqTouch_Int(void)//中斷函數(shù)
- {
- rINTSUBMSK|=((U32)0x1<<9);//關(guān)閉中斷服務(wù)
- if(rADCUPDN&(U32)0x01)//觸筆down
- {
- rADCUPDN=0;//清除標(biāo)志位
- Send_String("down");//打印信息(調(diào)試用)
- rADCTSC=(1<<3)|(1<<2);//上拉無效,自動XY坐標(biāo)轉(zhuǎn)換模式
- rADCCON|=0x1;//開始A/D轉(zhuǎn)換
- while(rADCCON&0x1);//等待AD轉(zhuǎn)換開始
- while(!(rADCCON&(1<<15)));//等待AD轉(zhuǎn)換結(jié)束
- xdata=(rADCDAT0&0x3ff);//保存A/D轉(zhuǎn)換的x位置
- ydata=(rADCDAT1&0x3ff);//保存A/D轉(zhuǎn)換的y位置
- flagTS=0;
- rADCTSC=0xd3|(1<<8);//再次設(shè)置等待中斷模式,目的判斷觸筆up
- }
- if((rADCUPDN>>1)&(U32)0x01)//觸筆up
- {
- rADCUPDN=0;//清除標(biāo)志位
- Send_String("up");//打印信息(調(diào)試用)
- flagTS=1;//一次接觸完畢
- rADCTSC=0xd3;//設(shè)置觸摸屏為等待中斷模式。
- }
- rSRCPND|=(U32)0x1<<31;//清中斷標(biāo)志
- rSUBSRCPND|=(U32)0x01<<9;
- rINTPND|=(U32)0x1<<31;
- rINTSUBMSK&=~((U32)0x1<<9);//打開中斷服務(wù)
- }
- /*******************************************
- *名稱:Delay
- *功能:延時
- *入口參數(shù):無
- *出口參數(shù):無
- **********************************************/
- voidDelay(void)
- {
- inti,j,k;
- for(i=0;i<20;i++)
- {
- for(j=0;j<100;j++)
- {
- for(k=0;k<1000;k++);
- }
- }
- }
- /*******************************************
- *名稱:Calibration
- *功能:觸摸屏校正
- *入口參數(shù):無
- *出口參數(shù):無
- **********************************************/
- voidCalibration(void)
- {
- chari;
- intxt[3],yt[3];
- TFT_CLearScreen(0xFFFFFF);
- Draw_Cross(32,24,0xFF0000);
- Draw_Cross(160,216,0xFF0000);
- Draw_Cross(288,120,0xFF0000);
- //依次讀取三個采樣點(diǎn)的坐標(biāo)值
- for(i=0;i<3;i++)
- {
- while(flagTS==0)
- {
- Delay();
- }
- Send_String("Over");
- xt[i]=xdata;
- yt[i]=ydata;
- flagTS=0;
- }
- //計(jì)算參數(shù)
- 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
- *功能:觸摸屏中斷初始化
- *入口參數(shù):無
- *出口參數(shù):無
- **********************************************/
- voidTouch_Screen_Init(void)
- {
- rADCDLY=50000;//設(shè)置延時
- rADCCON=(1<<14)|(20<<6);//設(shè)置A/D預(yù)分頻
- rADCTSC=0xd3;//設(shè)置等待中斷模式
- rSUBSRCPND|=(1<<9);
- rSRCPND|=(1<<31);
- rINTPND|=(1<<31);
- rINTSUBMSK&=~(1<<9);
- rINTMSK&=~(1<<31);//打開中斷屏蔽
- }
- /*******************************************
- *名稱:Clk_Set
- *功能:關(guān)于系統(tǒng)時鐘的初始化
- *入口參數(shù):無
- *出口參數(shù):無
- **********************************************/
- voidClk_Set(void)
- {
- intcount;
- 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屏幕
- *入口參數(shù):無
- *出口參數(shù):無
- **********************************************/
- voidMain(void)
- {
- intx,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;//注冊觸摸屏中斷函數(shù)
- 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;//計(jì)算X軸坐標(biāo)
- y=(D*xdata+E*ydata+F)/K;//計(jì)算Y軸坐標(biāo)
- Draws_Quare(x,y,0x00);//在觸摸坐標(biāo)處繪制正方形
- }
- }
- }
評論