新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > s3c2440觸摸屏測試

        s3c2440觸摸屏測試

        作者: 時間:2016-11-20 來源:網絡 收藏
        * 文件名: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轉換數據

        本文引用地址:http://www.104case.com/article/201611/318922.htm

        * 名稱: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); //在觸摸坐標處繪制正方形
        }
        }
        }



        關鍵詞: s3c2440觸摸屏測

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 合阳县| 竹北市| 宿州市| 南宁市| 安岳县| 阿巴嘎旗| 黎城县| 巴中市| 昌平区| 通城县| 吉木乃县| 绥芬河市| 孟津县| 贵定县| 加查县| 琼结县| 澄迈县| 清新县| 滨海县| 平遥县| 个旧市| 卫辉市| 义乌市| 吉木萨尔县| 杭州市| 德钦县| 兴文县| 遂昌县| 大城县| 吴忠市| 大悟县| 日土县| 凌海市| 麟游县| 赤峰市| 星子县| 平阴县| 晴隆县| 巧家县| 敦煌市| 昌都县|