|
S3C2440触摸屏学习笔记
发一下S3c2440的代码,下面是实现触摸屏画线功能的部分代码
....................
void drawCross(unsigned int x,unsigned int y,U32 color);
void TSCal(void);
extern int LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];
#define XD0 20
#define YD0 20
#define XD1 20
#define YD1 220
#define XD2 300
#define YD2 220
#define REQCNT 30
#define ADCPRS 9
#define LOOP 1
void __irq test();
int x1,x2,y1,y2,A,B,C,D,E,F,K=1,count=0;
volatile int xdata1,xdata2,ydata1,ydata2;
void main()
{
..............................
..............................
//*********************
rADCDLY=50000; //设置延时
rADCCON=(1<<14)+(ADCPRS<<6); //设置A/D预分频
rADCTSC=0xd3; //设置cm屏为等待中断模式。
pISR_ADC = (int)test;
rINTMSK=~BIT_ADC; //开启中断
rINTSUBMSK=~(BIT_SUB_TC);
flagTc = 0;
//*********************
TSCal();//校正
Paint_Bmp(0, 0, 320, 240, tu1_320240);
while(1)
{
if(flagTc==1)
{
flagTc=0;
Glib_Line(x1,y1,x2,y2,0xff000);
Glib_Rectangle(x1-5,y1-5,x1+5,y1+5,0xff00);
Glib_Rectangle(x2-5,y2-5,x2+5,y2+5,0xff00); //绘制正方形
}
//Delay(500);
}
rINTSUBMSK|=BIT_SUB_TC;
rINTMSK|=BIT_ADC;
}
void __irq test()
{
U32 saveAdcdly;
if(rADCDAT0&0x8000) //中断刚开始没设置是按下还是抬起中断,所以加个if语句一定设置成按下触发中断
{
//Uart_Printf("\nStylus Up!!\n");
rADCTSC&=0xff; // Set stylus down interrupt bit
}
//else
//Uart_Printf("\nStylus Down!!\n");
//中断一触发说明光标按下,按下来进行ADC转换
rADCTSC=(1<<3)|(1<<2); //等待中断时【4】和【3】位一定要设置为10,触发后从新设置
saveAdcdly=rADCDLY;
rADCDLY=40000; //设置成自动检测x,y坐标 .
rADCCON|=0x1; //ADC转换开始,开始后该位清零
flagTc = 1;
while(rADCCON & 0x1); //开始后第一位清零,检测是否开始
while(!(rADCCON & 0x8000)); //检测ADC转换是否结束
while(!(rSRCPND & (BIT_ADC))); //检测中断INT_ADC是否已请求
xdata1=(rADCDAT0&0x3ff);
ydata1=(rADCDAT1&0x3ff);
x1 = (A*xdata1+B*ydata1+C)/K; //计算x轴坐标,k的初值要设成一,否则会出错
y1 = (D*xdata1+E*ydata1+F)/K;
Uart_Printf("count=%03d XP=%04d, YP=%04d\n", count++, xdata1, ydata1);
//再度启用中断看光标是否已抬起,抬起则跳出while循环
rSUBSRCPND|=BIT_SUB_TC;
ClearPending(BIT_ADC);
rINTSUBMSK=~(BIT_SUB_TC);
rINTMSK=~(BIT_ADC);
rADCTSC =0xd3; //等待中断 Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.
while(!(rSUBSRCPND & (BIT_SUB_TC))) //to check Pen-up state
{
Delay(5); //保证中断开启需延时,同时避免一进循环就出去时间要尽量少
if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit若INT_TC已请求
{
Delay(5000);
if(rSUBSRCPND & (BIT_SUB_TC))
//Uart_Printf("Stylus Up Interrupt~!\n");
{break; }//if Stylus is up(1) state
}
rADCTSC=(1<<3)|(1<<2);
//saveAdcdly=rADCDLY;
//rADCDLY=40000;
rADCCON|=0x1; //ADC转换开始,开始后该位清零
while(rADCCON & 0x1); //开始后第一位清零,检测是否开始
while(!(rADCCON & 0x8000)); //检测ADC转换是否结束
//while(!(rSRCPND & (BIT_ADC))); //这句不能要,否则未抬起时始终卡在这
xdata2=(rADCDAT0&0x3ff);
ydata2=(rADCDAT1&0x3ff);
x2 = (A*xdata2+B*ydata2+C)/K; //计算x轴坐标
y2 = (D*xdata2+E*ydata2+F)/K;
Uart_Printf("upcount=%03d XP=%04d, YP=%04d\n", count++, xdata2, ydata2);
rSUBSRCPND|=BIT_SUB_TC;
ClearPending(BIT_ADC);
rINTSUBMSK=~(BIT_SUB_TC);
rINTMSK=~(BIT_ADC);
rADCTSC =0xd3; //等待中断 Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
rADCTSC=rADCTSC|(1<<8);
Delay(150); //保证画线的过程中有足够的扫描次数(要求延时少),
//同时保证为保证中断不出现在读坐标前使延时有一定长度
}
rADCDLY=saveAdcdly;
rADCTSC =0xd3;
rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal
rSUBSRCPND|=BIT_SUB_TC;
ClearPending(BIT_ADC);
rINTSUBMSK=~(BIT_SUB_TC); |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|