您的位置 首页 资料

s3c2440触摸屏测验

*文件名:main.c*功能:测试TFT屏的驱动函数*作者:jianqi*版本:v1.0#include2440addr.h//包含2440相关寄存器的设置#include…

* 文件名: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); //在角度坐标处制作正方形
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/264413.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部