TQ2440 触摸屏入门

转载:http://blog.csdn.net/ZJQLOVELYY/article/details/34466091


四线式电阻触摸屏

  四线触摸屏包含两个阻性层。其中一层在屏幕的左右边缘各有一条垂直总线,另一层在屏幕的底部和顶部各有一条水平总线。为了在X轴方向进行测量,将左侧总线偏置为0V,右侧总线偏置为VREF。将顶部或底部总线连接到ADC,当顶层和底层相接触时即可作一次测量。为了在Y轴方向进行测量,将顶部总线偏置为VREF,底部总线偏置为0V。将ADC输入端接左侧总线或右侧总线,当顶层与底层相接触时即可对电压进行测量。



等待中断: XP上拉,XM高阻
                    YP模拟输入,YM接地
在数据手册上有那么一句话:
Touch Screen Controller generates interrupt (INT_TC) signal when the Stylus is down. Waiting for Interrupt Mode
setting value is rADCTSC=0xd3; // XP_PU, XP_Dis, XM_Dis, YP_Dis, YM_En.
After Touch Screen Controller generates interrupt signal (INT_TC), Waiting for interrupt Mode must be cleared.
(XY_PST sets to the No operation Mode)
也就是说需要设置为等待中断模式只需要设置ADCTSC = 0xd3即可



获取X坐标:XP接Vref,XM接地
                      YP接模拟输入,YM高阻
Vmeas = Vref *  Rx2 / ( Rx1 + Rx2 )




获取Y坐标:XP模拟输入,XM高阻
                       YP接Vref,YM接地
Vmeas = Vref * Ry2 / ( Ry1 + Ry2 )



程序的状态转换图:
TQ2440 触摸屏入门_第1张图片

所需用到的寄存器:
ADCCON
ADCTSC
ADCDLY
ADCDAT0
ADCDAT1


头文件:
[cpp]  view plain copy
  1. #ifndef TOUCH_H  
  2. #define TOUCH_H  
  3.   
  4. #include "2440addr.h"  
  5.   
  6. #define PRSCEN  1               //使能分频  
  7. #define PRSCVL  49              //分频系数  
  8.   
  9. /*  设置为等待中断 */  
  10. #define waitDownInit()  do{ \  
  11.                         rADCTSC = 0xd3;\  
  12.                         }while(0)  
  13.   
  14.   
  15. extern __irq void touchISR();  
  16. extern void touchInit(void);  
  17.   
  18.   
  19.   
  20. #endif  


源文件:
[cpp]  view plain copy
  1. #include "TOUCH.h"  
  2. #include "uart.h"  
  3. #include "2440addr.h"  
  4.   
  5. __irq void touchISR()  
  6. {  
  7.     int x,y;  
  8.       
  9.     /*  松开产生的中断 */  
  10.     if (rADCTSC & (0x100))  
  11.     {  
  12.         rADCTSC &= 0xff;  
  13.     }  
  14.     else    /*  按下产生的中断 */  
  15.     {  
  16.         /*  在检测XY坐标时要禁止上拉,这里设置为自动转换 */  
  17.         rADCTSC = (1<<3) | (1<<2);  
  18.           
  19.         /*  开启AD转换  */  
  20.         rADCCON |= 1;  
  21.           
  22.         /*  等待AD转换开启    */  
  23.         while(rADCCON & 1)  
  24.             ;  
  25.           
  26.         /*  等待AD转换结束    */  
  27.         while(!(rADCCON & (1<<15)))  
  28.             ;  
  29.           
  30.         /*  设置为检测松开中断   */  
  31.         rADCTSC = (1<<8) | 0xd3;  
  32.           
  33.         /*  读取XY坐标值 */  
  34.         x = rADCDAT0 & 0x3ff;  
  35.         y = rADCDAT1 & 0x3ff;  
  36.           
  37.         put(x);  
  38.         putc(',');  
  39.         put(y);  
  40.         putc('\n');  
  41.     }  
  42.       
  43.     rSUBSRCPND = (1<<9);  
  44.     rSRCPND = 1<<31;  
  45.     rINTPND = 1<<31;  
  46.       
  47. }  
  48.   
  49. void touchInit(void)  
  50. {  
  51.       
  52.     pISR_ADC = (unsigned int)touchISR;  
  53.   
  54.     /*  设置延时,之前没加的时候一按下就出了好多个数据,转换太快了   */  
  55.     rADCDLY = 50000;  
  56.       
  57.     rADCCON =  (PRSCEN<<14) | (PRSCVL<<6);  
  58.       
  59.     /*  刚开始的时候设置为等待中断   */  
  60.     waitDownInit();  
  61.       
  62.     rINTMSK &= ~(1<<31);  
  63.     rINTSUBMSK &= ~(1<<9);  
  64.       
  65.     putc('H');  
  66. }  

你可能感兴趣的:(裸奔)