/******************************************************************** *名称:touchscreen.c *作者:D *时间:2015.11.23 *功能: * 触摸屏驱动,由于MINI2440采用一线触控,而非四线电阻触控所以触摸屏 * 驱动无法使用。 ********************************************************************/ /******************************************************************** *宏定义 ********************************************************************/ #define INTMSK ( (*(volatile unsigned long *)0X4A000008) ) //中断掩码寄存器 #define INTSUBMSK ( (*(volatile unsigned long *)0X4A00001C) ) //子中断掩码寄存器 #define ADCCON ( (*(volatile unsigned long *)0x58000000) ) //ADC控制寄存器 #define ADCTSC ( (*(volatile unsigned long *)0x58000004) ) //ADC触摸屏控制寄存器 #define ADCDAT0 ( (*(volatile unsigned long *)0x5800000C) ) //ADC0转换数据寄存器 #define ADCDAT1 ( (*(volatile unsigned long *)0x58000010) ) //ADC1转换数据寄存器 #define SUBSRCPND ( (*(volatile unsigned long *)0X4A000018) ) //子中断掩码寄存器 #define SRCPND ( (*(volatile unsigned long *)0X4A000000) ) //中断源请求寄存器 #define INTPND ( (*(volatile unsigned long *)0X4A000010) ) //中断请求寄存器 /******************************************************************** *名称:init_touchscreen *参数: * none *返回: * none *功能:初始化触摸屏 *********************************************************************/ void init_touchscreen(){ //设置ADC转换频率 ADCCON = (1<<14)|(49<<6); //PRSCEN[14]:1, PRSCVL[13:6]:49 ADC_Freqeuncy=PCLK/(PRSCVL+1) PCLK=50MHz ADC_Freqeuncy=1MHz //等待按下中断 ADCTSC = (0<<8)|(1<<7)|(1<<6)|(1<<4)|(0x3<<0); //UD_SEN[8]:0, YM_SEN[7]:1, YP_SEN[6]:1, XM_SEN[5]:0, XP_SEN[4]:1, PULL_UP[3]:0, AUTO_PST[2]:0, XY_PST[1:0]:0b11 //设置子中断掩码 INTSUBMSK &= ~(1<<9); //INT_TC[9]:0 //设置中断掩码 INTMSK &= ~(1<<31); //INT_ADC[31]:0 } /******************************************************************** *名称:touchscreen_irq *参数: * none *返回: * none *功能:触摸屏中断服务 *********************************************************************/ void touchscreen_irq(){ int x, y; if( !(ADCTSC&(1<<8)) ){ //如果是触摸屏按下,UD_SEN[8]:0 //设置触摸屏自动转换 ADCTSC = (1<<2); //AUTO_PST[2]:1 //启动ADC转换 ADCCON |= (1<<0); //ENABLE_START[0]:1 //等待ADC转换结束 while( !(ADCCON&(1<<15)) ); //ECFLG[15] //获取坐标 x = ADCDAT0&(0x3FF<<0); //XPDATA[9:0] y = ADCDAT1&(0x3FF<<0); //YPDATA[9:0] //清除子中断请求 SUBSRCPND |= (1<<9); //INT_TC[9]:0 //清除中断源请求 SRCPND |= (1<<31); //INT_ADC[31]:0 //清除中断请求 INTPND |= (1<<31); //INT_ADC[31]:0 //等待弹起中断 ADCTSC = (1<<8)|(1<<7)|(1<<6)|(1<<4)|(0x3<<0); //UD_SEN[8]:1, XY_PST[1:0]:0b11 }else{ //如果是触摸屏弹起,UD_SEN[8]:1 //清除子中断请求 SUBSRCPND |= (1<<9); //INT_TC[9]:0 //清除中断源请求 SRCPND |= (1<<31); //INT_ADC[31]:0 //清除中断请求 INTPND |= (1<<31); //INT_ADC[31]:0 //等待按下中断 ADCTSC = (0<<8)|(1<<7)|(1<<6)|(1<<4)|(0x3<<0); //UD_SEN[8]:0, XY_PST[1:0]:0b11 } }
时间: 2024-10-07 02:04:49