ADC触摸屏转换---那些年我们一起玩mini2440(arm9)裸机
扫描二维码
随时随地手机看文章
触摸屏工作原理:
四线电阻屏结构,是在玻璃或丙稀酸基板上覆盖两层均匀导电的ITO层,分别作为x电极和y电极,他们之间由均匀排列的透明格点分来绝缘。X电极和y电极的正负端由导电线(黑色粗体线)从两端引出,引出x-,x+,y-,y+.
当接触触摸屏表面并施加压力时,上层的ITO导电层和下层的ITO导电层发生接触,形成上面右图的等效电路。
1.y坐标计算:
在y+加驱动电压V-drive,y-接地。X+作为引出端测量接触点的电压,由于ITO层均匀导电,触电电压与V-drive电压之比等于Y坐标与屏高度之比。
2.x坐标计算:
在x+加驱动电压V-drive电压,x-接地。Y+作为引出端测量接触点的电压,由于ITO层均匀导电,触点电压与V-drive电压比等于x坐标与屏宽度之比。
y=Vx/V-driv *heightx=Vy/ V-driv * width
触摸屏工作流程(理解好这几步流程,代码至少能看懂30%)
1.设置触摸屏接口为等待中断模式,等待触摸屏被按下。
2.如果中断(INT_TC)发生,选择X,Y坐标转换模式(x/y坐标分别转换模式,x/y坐标自动转换),启动AD转换。
3.当AD转换完后,通过中断(INT_ADC),获取x/y坐标,
ADCDAT0 bit[9:0]-x坐标;
ADCDAT1 bit[9:0]-y坐标;
4.设置触摸屏接口为等待中断模式,等待触摸笔离开触摸屏。
5.返回步骤1,等待下次触摸笔被按下。
#defineGLOBAL_CLK1
#include
#include
#include"def.h"
#include"option.h"
#include"2440addr.h"
#include"2440lib.h"
#include"2440slib.h"
#include"mmu.h"
#include"profile.h"
#include"memtest.h"
#defineADC_FREQ2500000
//#defineADC_FREQ1250000
intcount=0;
volatileU32preScaler;
intxdata,ydata;
voidTest_Touchpanel(void);
staticvoid__irqAdcTsAuto(void);
staticvoidcal_cpu_bus_clk(void);
voidSet_Clk(void);
/*************************************************
Functionname:delay
Parameter:times
Description:延时函数
Return:void
Argument:void
Autor&date:Daniel
**************************************************/
voiddelay(inttimes)
{
inti,j;
for(i=0;i for(j=0;j<400;j++); } /************************************************* Functionname:Main Parameter:void Description:主功能函数 Return:void Argument:void Autor&date:Daniel **************************************************/ intMain(void) { intScom=0; MMU_Init(); Set_Clk(); Uart_Init(0,115200); Uart_Select(Scom); //Uart_Printf("nHelloWorld!n"); Test_Touchpanel(); while(1); return0; } /************************************************* Functionname:Test_Touchpanel Parameter:void Description:触摸屏初始化 Return:void Argument:void Autor&date:Daniel **************************************************/ voidTest_Touchpanel(void) { rADCDLY=50000;//Normalconversionmodedelayabout(1/3.6864M)*50000=13.56ms /*设置AD转频率*/ preScaler=ADC_FREQ; Uart_Printf("ADCconv,freq.=%dHzn",preScaler); preScaler=50000000/ADC_FREQ-1;//PCLK=50M rADCCON=(1<<14)|(preScaler<<6);//ADCPRSEn,PRSCVL //rADCCON=(1<<14)+(preScaler<<6);//ADCPRSEn,ADCPRSValue Uart_Printf("ADCtouchscreentestn"); /*设置触摸屏为等待中断模式,等待触摸笔被按下*/ rADCTSC=0xd3;//Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En /*clearirq*/ //ClearPending(BIT_ADC); rSRCPND=0x80000000; rINTPND=0x80000000; ClearSubPending(BIT_SUB_TC); pISR_ADC=(U32)AdcTsAuto; /*enableINT_TCirq*/ //EnableIrq(BIT_ADC); rINTMSK=0x7fffffff;//允许中断 EnableSubIrq(BIT_SUB_TC); } /************************************************* Functionname:AdcTsAuto Parameter:void Description:中断服务程序 Return:void Argument:void Autor&date:Daniel **************************************************/ staticvoid__irqAdcTsAuto(void) { U32saveAdcdly; /****************stylus down************************/