触摸屏ADS7843驱动程序
- 格式:wps
- 大小:27.50 KB
- 文档页数:6
触摸屏的驱动芯片ADS7843触摸屏由于其体积小、轻便和接口简单的特点,成为一种在嵌入式系统中应用广泛的输入设备。
S3C44B0X通过端口G模拟串行的SIO接口与触摸屏专门的控制芯片ADS7843(由Burr-Brown公司生产)开展数据传输,来完成对触摸屏触摸位置坐标的读取。
触摸屏接口专用芯片ADS7843要完成两件事:一是完成电极电压的切换;二是采集接触点处的电压值,并开展A/D转换。
触摸屏组成:触摸检测部件:安装在显示器屏幕前面,检测用户触摸位置,承受后送触摸屏控制器。
触摸屏控制器:接收触摸点检测装置信息,并将它转换成触点坐标,再送给CPU。
比方ADS7843。
ADS7843是TI 公司生产的4 线电阻触摸屏转换接口芯片。
ADS7843功能:(1)电极电压的切换。
(2)采集接触点处的电压值,并开展A/D转换。
ADS7843特性:(1)可编程控制8位或者12位A/D转换模式。
(2)低导通电阻模拟开关。
(3)实现触摸屏的驱动选择控制(X、Y通道)。
(4)供电电压为2.7~5V。
(5)参考电压VREF为1V~+Vcc。
(6)转换电压的输入范围为0~VREF。
(7)最高转换速率为125kHz。
编程说明:(1)S3C44B0X端口初始化:PCONG(2)S3C44B0X端口初始化:PUPG(3)触摸屏X坐标控制字(4)触摸屏Y坐标控制字(5)触摸点坐标读取过程(6)检测PENIRQ是否为低电平。
如果PENIRQ=0,则认为有接触。
(7)使ADS7843有效、无效(8)向ADS7843发送控制字(9)等待ADS7843 的BUSY管脚从高变低(10)从ADS7843接收数据。
触控设备驱动软件使用教程第一章:什么是触控设备驱动软件触控设备驱动软件是一种用于控制触控设备的程序,它可以使电脑或其他设备能够识别触摸输入,并将其转化为相应的命令或操作。
触控设备驱动软件通常与操作系统一起提供,但也可以单独安装。
第二章:触控设备驱动软件的分类触控设备驱动软件根据不同的触控技术可分为多种类型,如电阻式触摸屏驱动软件、电容式触摸屏驱动软件、红外触控驱动软件等。
每种类型的驱动软件都有特定的工作原理和应用领域。
第三章:触控设备驱动软件的安装1. 在Windows操作系统中,触控设备驱动软件通常会随着系统安装而自动安装。
如果遇到问题,可以尝试更新系统或手动安装驱动软件。
2. 在其他操作系统中,触控设备驱动软件的安装方式可能会有所不同。
可以通过设备制造商提供的驱动程序手册或官方网站查找适合操作系统的驱动软件,并按照说明进行安装。
第四章:触控设备驱动软件的设置和调整1. 校准触控设备:在安装完成后,有些触控设备驱动软件可能需要进行校准操作,以确保触摸输入的准确性。
校准方法一般在驱动软件的设置界面中可以找到。
2. 调整触摸灵敏度:有些触控设备驱动软件允许用户调整触摸灵敏度,以适应个人习惯或使用环境。
可以通过设置界面中的选项进行调整。
第五章:触控设备驱动软件的高级功能1. 多点触控支持:一些高级触控设备驱动软件支持多点触控,可以实现同时识别多个触摸点并进行相应操作。
这在绘图、游戏等应用领域具有重要意义。
2. 手势识别:部分触控设备驱动软件支持手势识别,可以根据手指在屏幕上的动作来执行特定的操作,如滑动、缩放、旋转等。
手势识别的可用性和使用方法可以在驱动软件的文档或设置界面中找到。
第六章:触控设备驱动软件的故障排除1. 无法识别触摸输入:如果触控设备驱动软件无法识别触摸输入,首先可以尝试重新启动系统或设备,以解决临时性的问题。
如果问题仍然存在,可以尝试更新驱动软件或联系设备制造商进行进一步的故障排除。
课程实验报告实验名称:嵌入式系统实验专业班级:计算机科学与技术x班学号:Ux姓名:x合作者:x实验时间:xxxx年xx月xx日计算机科学与技术学院试验一:bootloader (ads、引导)一、实验任务1、熟悉ADS 1.2开发工具创建、编译、下载、调试工程2、串口通讯串口控制器初始化、收/发数据3、配置主机端的nfs服务器配置主机端的nfs服务器,以连接linux核心4、下载并运行linux核心使用自己的串口程序下载并运行linux核心二、实验内容编写串口接收数据函数编写串口发送数据函数学习ads、jtag调试、flash烧写打印菜单,等待用户输入下载并运行linux核心配置主机的nfs服务器,与linux核心连接三、实验步骤1.编写串口接收数据函数编写串口发送数据函数修改bootloader:菜单、串口收发、命令行;接收串口数据并做相应处理:while(1){打印菜单并等待用户输入;switch(ch) //根据用户输入做相应处理{case '1':imgsize=xmodem_receive((char *)KERNEL_BASE, MAX_KERNEL_SIZE);if(imgsize==0) //下载出错;else //下载成功;break;case '3':nand_read((unsigned char *)KERNEL_BASE, 0x00030000, 4*1024*1024);case '2':BootKernel(); //这里是不会返回的,否则出错;break;default:break;}}Bootloader的main()函数打印菜单:int main(void){ARMTargetInit(); //目标板初始化;//接收用户命令,传递linux核心;Uart_puts("Menu:\n\r");Uart_puts("1.Load kernel via Xmodem;\n\r");Uart_puts("2.Boot linux; \n\r");Uart_puts("3.Load kernel from flash and boot; \n\r");Uart_puts("Make your choice.\n\r");do{ch=Uart_getc();}while(ch!='1' && ch!='2' && ch!='3');return 0;}串口读写:void Uart_putc(char c){while(!SERIAL_WRITE_READY());((UTXH0) = (c));}unsigned char Uart_getc( ){while(!SERIAL_CHAR_READY());return URXH0;}2.使用ads1.2编译bootloader;3.使用uarmjtag下载、调试bootloader;4.使用axd查看变量、内存,单步跟踪;5.配置超级终端,与bootloader通讯;6.配置nfs;编辑/etc/export文件:/home/arm_os/filesystem/rootfs 目标板ip(rw,sync)/home/arm_os/filesystem/rootfs 主机ip(rw,sync)启动nfs服务器:/etc/init.d/nfs restart测试nfs服务器是否正常运行:mount 主机ip:/home/arm_os/filesystem/rootfs /mnt7.以root用户启动cutecom,将cutecom配置改为115200 bps,8位,1位停止位,无校验,xmodem,no line end;8.使用bootloader重新下载Linux核心映像,启动核心运行后,察看是否成功加载nfs上的root文件系统;9.启动Linux核心运行,察看结果;10.linux核心能够运行到加载root步骤,说明bootloader正常运行;11.将bootloader烧写到flash中,重启目标板电源,察看bootloader是否烧写正常,下载核心测试;目标板linux系统正常运行到命令行模式下,能够正常输入linux命令,说明实验成功。
0 引言随着信息技术的飞速发展,人们对电子产品智能化、便捷化、人性化要求也不断提高,触摸屏作为一种人性化的输入输出设备,在我国的应用范围非常广阔,是极富吸引力的多媒体交互没备。
目前,触摸屏的需求动力主要来自于消费电子产品,如手机、PDA、便携导航设备等。
随着触摸屏技术的不断发展,它在其他电子产品中的应用也会得到不断延伸。
现在市面上已有的触摸屏控制器普遍价格比较高且性能相对比较固定,一些场合下无法满足用户的实际需求。
本文基于上述考虑,根据电阻式触摸屏的工作原理,选用51系列单片机作为控制核心,设计一种实用且低成本的触摸屏控制系统。
1 触摸屏的工作原理触摸屏由触摸检测部件和触摸屏控制器件组成(如图1所示);触摸检测部件用于检测用户触摸位置,接收后送触摸屏控制器;而触摸屏控制器的主要作用是从触摸点检测装置上接收触摸信息送给控制器,它同时能接收控制器发来的命令并加以执行。
触摸屏的主要3大种类是:电阻技术触摸屏、表面声波技术触摸屏、电容技术触摸屏。
其中,电阻式触摸屏凭借低廉的价格以及对于手指及输入笔触摸的良好响应性,涵盖了100多家触摸屏元件制造商中的2/3,成为过去5年中销售量最高的触摸屏产品。
在这里根据要设计应用的触摸屏控制器,重点介绍一下四线电阻式触摸屏。
电阻触摸屏的屏体部分是一块与显示器表面相匹配的多层复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透明的导电层,上面再盖有一层外表面硬化处理、光滑防刮的塑料层,它的内表面也涂有一层透明导电层,在两层导电层之间有许多细小(小于千分之一英寸)的透明隔离点把它们隔开绝缘。
当手指触摸屏幕时,平常相互绝缘的两层导电层就在触摸点位置有了一个接触,因其中一面导电层接通Y轴方向的5 V均匀电压场,使得侦测层的电压由零变为非零,这种接通状态被控制器侦测到后,进行A/D转换,并将得到的电压值与5 V相比即可得到触摸点的Y轴坐标,同理得出X轴的坐标,这就是四线电阻式触摸屏基本原理,其原理如图2所示。
收录这个文章的主要目的是打算在嵌入式LINUX下,亲自做平台上的触摸屏驱动[文件名] Touch.c[功能] 8051单片机驱动ADS7846/ADS7843芯片[简介] ADS7846/7843芯片适合用在4线制触摸屏,它通过标准SPI协议和CPU通信,操作简单,精度高,当触摸屏被按下时(即有触摸事件发生)则ADS7846向CPU发中断请求,CPU接到请求后,应延时一下再响应其请求,目的是为了消除抖动使得采样更准确。
如果一次采样不准确,可以尝试多次采样取最后一次结果为准,目的也是为了消除抖动。
[原作者] 鞠春阳[版本] v1.8#include "reg51.h"#include "intrins.h"sbit DCLK=P1^6; //根据用户自己的定义sbit CS=P2^2;sbit DIN=P2^3;sbit DOUT=P2^4;sbit BUSY=P2^5;delay(unsigned char i--){while(i--);}void start() //SPI开始{DCLK=0;CS=1;DIN=1;DCLK=1;CS=0;}WriteCharTo7843(unsigned char num) //SPI写数据{unsigned char count=0;DCLK=0;for(count=0;count<8;count++){num<<=1;DIN=CY;DCLK=0; _nop_();_nop_();_nop_(); //上升沿有效DCLK=1; _nop_();_nop_();_nop_();}}ReadFromCharFrom7843() //SPI 读数据{unsigned char count=0;unsigned int Num=0;for(count=0;count<12;count++){Num<<=1;DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效DCLK=0; _nop_();_nop_();_nop_();if(DOUT) Num++;}return(Num);}void ZhongDuan() interrupt 0 //外部中断0 用来接受键盘发来的数据{unsigned int X=0,Y=0;delay(10000); //中断后延时以消除抖动,使得采样数据更准确start(); //启动SPI// while(BUSY); //如果BUSY信号不好使可以删除不用delay(2);WriteCharTo7843(0x90); //送控制字10010000 即用差分方式读X坐标详细请见有关资料// while(BUSY); //如果BUSY信号不好使可以删除不用delay(2);DCLK=1; _nop_();_nop_();_nop_();_nop_();DCLK=0; _nop_();_nop_();_nop_();_nop_();X=ReadFromCharFrom7843(); //读X轴坐标WriteCharTo7843(0xD0); //送控制字11010000 即用差分方式读Y坐标详细请见有关资料DCLK=1; _nop_();_nop_();_nop_();_nop_();DCLK=0; _nop_();_nop_();_nop_();_nop_();Y=ReadFromCharFrom7843(); //读Y轴坐标CS=1;}main(){TMOD=0x11; // 记数器0 计数器1 都以16 位记数TCON=0x00;IE=0x83; //1000 0001 EA=1中断允许,IP=0x01;while(1);//等待触摸中断}。
触摸屏芯片ADS7846/ADS7843驱动程序(C51)/*[文件名] Touch.c[功能] 8051 单片机驱动ADS7846/ADS7843 芯片[简介] ADS7846/7843 芯片适合用在4 线制触摸屏,它通过标准SPI 协议和CPU 通信,操作简单,精度高,当触摸屏被按下时(即有触摸事件发生)则ADS7846 向CPU 发中断请求,CPU 接到请求后,应延时一下再响应其请求,目的是为了消除抖动使得采样更准确。
如果一次采样不准确。
[原作者] 鞠春阳[版本]v1.1b[最后修改时间] 2004 年3 月31 日9:11*/ #include “reg51.h”#include “intrins.h”sbit DCLK=P1;sbit CS=P2 ; sbit DIN=P2;sbit DOUT=P2;sbit BUSY=P2 ; delay(unsigned char i--) { while(i--); } void start() //SPI 开始{ DCLK=0; CS=1; DIN=1; DCLK=1; CS=0; }WriteCharTo7843(unsigned char num) //SPI 写数据{ unsigned char count=0; DCLK=0; for(count=0;count8;count++) { num=1; DIN=CY; DCLK=0;_nop_();_nop_();_nop_(); //上升沿有效DCLK=1; _nop_();_nop_();_nop_(); } } ReadFromCharFrom7843() //SPI 读数据{ unsigned char count=0; unsigned int Num=0; for(count=0;count12;count++) { Num=1; DCLK=1;_nop_();_nop_();_nop_(); //下降沿有效DCLK=0; _nop_();_nop_();_nop_();if(DOUT) Num++; } return(Num); }void ZhongDuan() interrupt 0 //外部中断0 用来接受键盘发来的数据{ unsigned int X=0,Y=0; delay(10000); //中断后延时以消除抖动,使得采样数据更准确start(); //启动SPI // while(BUSY); //如果BUSY 信号不好使可以删除不用delay(2); WriteCharTo7843(0x90); //送控制字10010000 即用差分方式读X 坐标详细请见有关资料// while(BUSY); //如果BUSY 信号不好使可以删除不用delay(2); DCLK=1; _nop_();_nop_();_nop_();_nop_(); DCLK=0;。
触摸屏驱动软件安装方法:
按装驱动程序前,请确认触摸屏信号线连接正常
第一步:将驱动程序安装光盘打开, 选择setup 安装程序.
第二步:根据对话框提示继续安装
鼠标点击下一步
鼠标点击我接受
选择安装
最后点击完成。
请重新启动计算机。
第三步:触摸屏校正程序
用鼠标点击出现以上菜单
选择菜单第一项,点击控制界面选项,进入控制界面首页
选择工具选项
点击进阶定位开关按钮
使其按钮颜色变成黄色,打开成功。
返回控制界面首页,选择设定按钮进行触摸屏定位矫正。
进入四点校正界面
用手指或校正笔压住红点进行校正,如校正时未压准红
点,有可能产生漂移,建议校正时尽量压准红点。
用手指或校正笔压住红点进行校正,如校正时未压准红点,有可能产生漂移,建议校正时尽量压准红
点。
用手指或校正笔压住红点进行校正,如校正时未压准红点,有可能产生漂移,建议校正时尽量压准红
点。
用手指或校正笔压住红点进行校正,
如校正时未压准红点,有可能产生漂
移,建议校正时尽量压准红点。
点击保存退出。
校正完成,任意点一下,退出。
触摸屏ADS7843驱动程序设计//===================================================================== // ADS7843 驱动程序(串行)//硬件连接: DCLK ——P0^0;// CS ——P0^1;// DIN ——P0^2;// BUSY ——P0^3// DOUT ——P0^4// PENIRQ——P3^2;// VDD--逻辑电源(+5V)// VSS--GND(0V)//ADS7843.c//writer:谷雨2008年7月23日于EDA实验室//=====================================================================#i nclude //STC单片机头文件#i nclude#define uint unsigned int#define uchar unsigned charsbit DCLK = P0^0; //时钟信号,下降沿有效sbit CS = P0^1; //片选信号,低电平有效sbit DIN = P0^2; //串行数据输入sbit BUSY = P0^3; //忙信号sbit DOUT = P0^4; //串行数据输出sbit PENIRQ = P3^2; //键盘中断请求信号,低电平(负边沿)有效void Tranfer(char Data);uint average(uint a[8]);//===================================================================== ===============//函数名称:void delay(uint us)//函数功能:延时子函数//入口参数:us 延时时间//出口参数:无//===================================================================== ===============void delay(uint us){while(us--);}//===================================================================== ===============//函数名称:void ADS7843_start(void)//函数功能:ADS7843启动//入口参数:无//出口参数:无//===================================================================== ===============void ADS7843_start(void){DCLK=0;CS=1;DIN=1;DCLK=1;CS=0;}//===================================================================== ===============//函数名称:void ADS7843_wr(uchar dat)//函数功能:写ADS7843//入口参数:dat 写入的数据//出口参数:无//===================================================================== ===============void ADS7843_wr(uchar dat){uchar count;DCLK=0;for(count=0;count<8;count++){dat<<=1;DIN=CY;DCLK=0;_nop_();_nop_();_nop_();DCLK=1;_nop_();_nop_();_nop_();}}//===================================================================== ===============//函数名称:uint ADS7843_rd(void)//函数功能:读ADS7843//入口参数:无//出口参数:读回的坐标值//===================================================================== ===============uint ADS7843_rd(void){uchar count=0;uint dat=0;for(count=0;count<12;count++){dat<<=1;DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效DCLK=0; _nop_();_nop_();_nop_();if(DOUT)dat++;}return(dat);}//===================================================================== ===============//函数名称:void intr0_int()//函数功能:外中断0中断服务函数//入口参数:无//出口参数:无//===================================================================== ===============void intr0_int() interrupt 0 using 2{uint X=0,Y=0,a[4],i,avex,avey,x[8],y[8];IE=0; //关中断delay(100); //中断后延时以消除抖动,使得采样数据更准确if(!PENIRQ){for(i=0;i<8;i++) //进行8次数据采集{ADS7843_start();delay(2);ADS7843_wr(0x90);//送控制字10010000 即用差分方式读X坐标delay(2);DCLK=1;_nop_();_nop_();_nop_();_nop_();DCLK=0;_nop_();_nop_();_nop_();_nop_();X=ADS7843_rd(); //读X轴坐标x[i]=X;ADS7843_wr(0xD0); //送控制字11010000 即用差分方式读Y坐标DCLK=1;_nop_();_nop_();_nop_();_nop_();DCLK=0;_nop_();_nop_();_nop_();_nop_();Y=ADS7843_rd(); //读Y轴坐标y[i]=Y;CS=1;}avex=average(x); //X坐标数据处理a[0]=avex/1000; //发上位机观察结果a[1]=(avex-a[0]*1000)/100;a[2]=(avex-a[0]*1000-a[1]*100)/10;a[3]=avex%10;Tranfer(a[0]+48);Tranfer(a[1]+48);Tranfer(a[2]+48);Tranfer(a[3]+48);avey=average(y); //Y坐标数据处理a[0]=avey/1000; //发上位机观察结果a[1]=(avey-a[0]*1000)/100;a[2]=(avey-a[0]*1000-a[1]*100)/10;a[3]=avey%10;Tranfer(a[0]+48);Tranfer(a[1]+48);Tranfer(a[2]+48);Tranfer(a[3]+48);for(i=0;i<10;i++) //延时,在程序中根据具体情况改动delay(10000);}IE=0x81; //开中断}//===================================================================== ===============//函数名称:void init_serial()//函数功能:初始化串口//入口参数:无//出口参数:无//===================================================================== ===============void init_serial(){TMOD=0x22; //定时器T1使用工作方式2TH1=250; //设置初值TL1=250;TR1=1; //开始计时PCON=0x80; //SMOD=1;SCON=0x50; //工作方式1,波特率9600bit/s,允许接收TI=1;}//===================================================================== ===============//函数名称:void Tranfer(char Data)//函数功能:发送数据程序//入口参数:Data 要发送的数据//出口参数:无//===================================================================== ===============void Tranfer(char Data){while(TI==0);SBUF=Data;TI=0;}//===================================================================== ===============//函数名称:int main()//函数功能:主函数//入口参数:无//出口参数:无//===================================================================== ===============int main(){// uint b[4];TCON=0x01; //设置外部中断0下降沿触发EX0=1; //开外中断0EA=1; //开总中断init_serial();while(1);}//===================================================================== ===============//函数名称:uint average(uint a[8])//函数功能:数据处理程序,采集8次的数据,去掉最大值,去掉最小值,然后求平均//入口参数:数组首地址//出口参数:平均值//===================================================================== ===============uint average(uint a[8]){uint max,min,i,ave=0,sum=0;max=a[0];min=a[0];for(i=0;i<8;i++){if(maxif(min>a[i])min=a[i];sum+=a[i];}ave=(sum-min-max)/6;return ave;}。