2440的触摸屏转换接口搭载在ADC接口之上,使用上比ADC接口多了一些花样,首先,触摸屏接口有几种转换模式

1. 普通转换模式

单转换模式是最合适的通用ADC转换。此模式可以通过设置ADCCON(ADC控制寄存器)初始化并且通过读写ADCDAT0(ADC数据寄存器0)就能够完成

2. 分离的X/Y方向转换模式

触摸屏控制器可以工作在两个转换模式之一。方向转换模式如下方法操作。X方向模式写X方向转换数据到ADCDAT0,故触摸屏接口产生中断源给中断控制器。Y方向模式写Y方向转换数据到ADCDAT1,故触摸屏接口产生中断源给中断控制器。

3. 自动(顺序)X/Y方向转换模式

自动(顺序)X/Y方向转换模式操作如下。触摸屏控制器顺序变换触摸X方向和Y方向。在自动方向转变模式中触摸控制器在写入X测量数值到ADCDAT0和写入Y测量数值到ADCDAT1后,触摸屏接口产生中断源给中断控制器。

4. 等待中断模式

当笔尖落下时触摸屏控制器产生中断(INT_TC)信号。等待中断模式设置值为rADCTSC=0xd3; // XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En触摸屏控制器产生中断信号(INT_TC)后,必须清除等待中断模式。(XY_PST设置到无操作模式)

使用触摸屏ADC需要设置以下几个寄存器

设置转换引脚的模式,以及转换模式

中断转换时间

另外还需要注意一点

具体查看代码

#ifndef __TOUCH_H
#define __TOUCH_H
#include "def.h"
#include "2440addr.h"
#include "uart0.h" extern u16 xPoint;
extern u16 yPoint; extern u8 touchState; void TouchInit(void); void TouchMode1GetValue(void); //extern volatile int xdata,ydata;
//extern volatile U8 penDownFlag; //落笔标志 //extern volatile int A,B,C,D,E,F,K; //void TouchInit(void); //#define ADCPRS 26 //AD转换器预分频值
#endif
#include "touch.h"

u16 xPoint = 0;
u16 yPoint = 0;
u8 touchState = 0; void __irq AdcTsAuto(void)
{
u8 i = 0,j=0;
u16 xtemp[10] = {0};
u16 ytemp[10] = {0};
xPoint = 0;
yPoint = 0;
rSRCPND |= BIT_ADC;
rINTPND |= BIT_ADC;
rSUBSRCPND|= BIT_SUB_TC; //清除中断标志
rINTMSK |= BIT_ADC; //关闭中断 rADCTSC &= ~(3<<0);//清除等待中断模式,上拉不禁止
rADCTSC |= (1<<3)|(1<<2); //XP上拉禁止,自动顺序X,Y测量 for(i = 0; i < 10; i++)//循环获取十次数据
{
rADCCON |=0x1; //使能AD转换
while(rADCCON & 0x1); //判断使能ADC转换后被清零
while(!(rADCCON &0x8000)); //等待转换结束
xtemp[i] = (rADCDAT0&0x3ff);
ytemp[i] = (rADCDAT1&0x3ff);
}
//两组值进行冒泡排序
for(i = 0; i < 10; i++)
{
for(j = 0; j < i; j++)
{
if(xtemp[j]> xtemp[j+1])
{
xtemp[j] = xtemp[j]+xtemp[j+1];
xtemp[j+1] = xtemp[j]-xtemp[j+1];
xtemp[j] = xtemp[j]-xtemp[j+1];
}
if(ytemp[j]> ytemp[j+1])
{
ytemp[j] = ytemp[j]+ytemp[j+1];
ytemp[j+1] = ytemp[j]-ytemp[j+1];
ytemp[j] = ytemp[j]-ytemp[j+1];
}
}
}
for(i = 2; i < 8; i++)//去掉两个最大值两个最小值
{
xPoint+= xtemp[i];
yPoint+= ytemp[i];
} xPoint/=(8-2);
yPoint/=(8-2);
touchState = 1; printf("xPoint %d yPoint %d \r\n",xPoint,yPoint); rSRCPND |= BIT_ADC;
rINTPND |= BIT_ADC;
rSUBSRCPND|= BIT_SUB_TC; //清除中断标志 rADCTSC = 0xd3; //等待中断模式,正常AD转换,XP上拉使能,XP,XM,YP输出禁止,YM输出使能
rINTMSK &=~BIT_ADC;//打开中断 } //触摸屏中断初始化
void TouchInit(void)
{
rADCDLY = 40000; //正常转换模式下延时
rADCCON = (1<<14)|(69<<6); //使能AD转换预分频器 70分频
rADCTSC = 0xd3; //等待中断模式,正常AD转换,XP上拉使能,XP,XM,YP输出禁止,YM输出使能
rSRCPND |= BIT_ADC;
rINTPND |= BIT_ADC;
rSUBSRCPND|= BIT_SUB_TC; //清除中断标志 rINTMOD &=~BIT_ADC;
rINTMSK &=~BIT_ADC;
rINTSUBMSK &=~(BIT_SUB_TC); //使能触摸中断
rINTSUBMSK |= BIT_SUB_ADC; //关闭ADC中断
pISR_ADC =(unsigned)AdcTsAuto; //中断服务程序入口
}

S3C2440触摸屏驱动详解的更多相关文章

  1. S3C2440 TFTLCD驱动详解

    S3C2440自带有LCD控制器,该控制器主要有以下接口 仅仅说TFT显示器,TFT显示器的时序如下 TFT显示器的驱动是以行列的形式逐点扫描过来的,驱动时钟有三种,一种是行时钟,一种是列时钟,还有一 ...

  2. linux usb 驱动详解

    linux usb 驱动详解 USB 设备驱动代码通过urb和所有的 USB 设备通讯.urb用 struct urb 结构描述(include/linux/usb.h ). urb 以一种异步的方式 ...

  3. 25.Linux-Nor Flash驱动(详解)

    1.nor硬件介绍: 从原理图中我们能看到NOR FLASH有地址线,有数据线,它和我们的SDRAM接口相似,能直接读取数据,但是不能像SDRAM直接写入数据,需要有命令才行 1.1其中我们2440的 ...

  4. 16.Linux-LCD驱动(详解)

    在上一节LCD层次分析中,得出写个LCD驱动入口函数,需要以下4步: 1) 分配一个fb_info结构体: framebuffer_alloc(); 2) 设置fb_info 3) 设置硬件相关的操作 ...

  5. 使用VS2010编译MongoDB C++驱动详解

    最近为了解决IM消息记录的高速度写入.多文档类型支持的需求,决定使用MongoDB来解决. 考虑到MongoDB对VS版本要求较高,与我现有的VS版本不兼容,在leveldb.ssdb.redis.h ...

  6. 16.Linux-LCD驱动(详解)【转】

    转自:https://www.cnblogs.com/lifexy/p/7604011.html 在上一节LCD层次分析中,得出写个LCD驱动入口函数,需要以下4步: 1) 分配一个fb_info结构 ...

  7. 18.Llinux-触摸屏驱动(详解)

    本节的触摸屏驱动也是使用之前的输入子系统 1.先来回忆之前第12节分析的输入子系统 其中输入子系统层次如下图所示, 其中事件处理层的函数都是通过input_register_handler()函数注册 ...

  8. 18.Llinux-触摸屏驱动(详解)【转】

    转自:https://www.cnblogs.com/lifexy/p/7628889.html 本节的触摸屏驱动也是使用之前的输入子系统 1.先来回忆之前第12节分析的输入子系统 其中输入子系统层次 ...

  9. 13.Linux键盘驱动 (详解)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标: 实现键盘驱动,让开发板的 ...

随机推荐

  1. tiny210移植linux内核(3.0.8)杂项

    关于三星芯片nand内存分区文件: linux-3.0.8/drivers/mtd/nand/s3c_nand.c struct mtd_partition s3c_partition_info[] ...

  2. 学习笔记——桥接模式Bridge

    桥接模式的目的是在设计初,就将实现与接口分离,在以后实现发生变化时,只需要改变传递的实现对象,在保持接口一致的情况,达到实现的变更. 在OperationInterface中就调用实现的方法imp.O ...

  3. mybatis generator Date类型时间丢失

    开篇 本次项目换用了Oracle数据库,讲真,真的不好用,不太喜欢,比较喜欢轻量级的MySQL但是不得不说从Oracle的严谨中学到不少好东西. <resultMap id="Base ...

  4. 强制性输出private中变量的三种方法

    众所周知,private里面的变量不可以输出,但是也可以通过特殊途径获得. 1.通过指针暴力内存,把它索罗出来,方法:调试,破掉语法. 并且还可以对类对象进行修改. // Thread.cpp : 定 ...

  5. JavaBean--删除操作

    删除命令:removeAttribute(Javabean名称) 前面调用用pageContext,request,session,application, 如request.removeAttrib ...

  6. AIM Tech Round 3 (Div. 2) B 数学+贪心

    http://codeforces.com/contest/709 题目大意:给一个一维的坐标轴,上面有n个点,我们刚开始在位置a,问,从a点开始走,走n-1个点所需要的最小路程. 思路:我们知道,如 ...

  7. Linux 下安装配置 JDK1.7

    目录[-] 1.下载JDK 2.解压安装 3.配置环境变量 4.配置默认JDK(一般情况下这一步都可以省略) 5.测试 1.下载JDK Linux操作系统是:Centos6.5-x64 目前最新的JD ...

  8. Css span div

    SPAN元素和DIV元素有什么区别 解决思路: 最明显的区别是:DIV是块元素,SPAN是内嵌元素.块元素相当于内嵌元素在前后各加一个<br>换行.其实,块元素和行内元素也不是一成不变的, ...

  9. linux修改句柄数

    linux服务器大并发调优时,往往需要预先调优linux参数,其中修改linux最大文件句柄数是最常修改的参数之一. 在linux中执行ulimit -a 即可查询linux相关的参数,如下所示: [ ...

  10. C# 中的内存管理,摘自网络

    C#编程的一个优点是程序员不需要关心具体的内存管理,尤其是垃圾收集器会处理所有的内存清理工作.虽然不必手工管理内存,但如果要编写高质量的代码,还是要理解后台发生的事情,理解C#的内存管理.本文主要介绍 ...