s3c2440的触摸屏校正与测试

发布者:ph49635359最新更新时间:2016-05-03 来源: eefocus关键字:s3c2440  触摸屏  校正与测试 手机看文章 扫描二维码
随时随地手机看文章

 

  1. /******************************************************************** 
  2. * 文件名:main.c 
  3. * 功能:测试TFT屏的驱动函数 
  4. * 作者:jianqi 
  5. * 版本:v1.0  
  6. ********************************************************************/  
  7. #include"2440addr.h"  //包含2440相关寄存器的设置  
  8. #include"TFT.h"  
  9. #include"Touch.h"  
  10. #include"MMU.h"  
  11. #include"UART.h"  
  12.   
  13. volatile int A,B,C,D,E,F,K;  //校正参数  
  14.   
  15. int flagTS=0;  //触摸屏转换标志   
  16. int xdata,ydata;  //触摸屏A/D转换数据  
  17.   
  18. /******************************************* 
  19. * 名称:Touch_Int 
  20. * 功能:触摸屏中断程序,读取A/D转换的值 
  21. * 入口参数:无 
  22. * 出口参数:无  
  23. **********************************************/  
  24. void __irq Touch_Int(void) //中断函数  
  25. {  
  26.     rINTSUBMSK |= ((U32)0x1<<9);   //关闭中断服务          
  27.     if (rADCUPDN&(U32)0x01)   //触笔down  
  28.     {  
  29.         rADCUPDN=0;   //清除标志位  
  30.         Send_String("down");   //打印信息(调试用)  
  31.         rADCTSC = (1<<3)|(1<<2); //上拉无效,自动XY坐标转换模式  
  32.         rADCCON|=0x1;    //开始A/D转换  
  33.         while(rADCCON&0x1); //等待AD转换开始  
  34.         while(!(rADCCON&(1<<15))); //等待AD转换结束  
  35.         xdata=(rADCDAT0&0x3ff);  //保存A/D转换的x位置  
  36.         ydata=(rADCDAT1&0x3ff); //保存A/D转换的y位置  
  37.         flagTS=0;  
  38.         rADCTSC=0xd3|(1<<8);  //再次设置等待中断模式,目的判断触笔up   
  39.     }  
  40.     if((rADCUPDN>>1)&(U32)0x01)   //触笔up  
  41.     {  
  42.         rADCUPDN=0;  //清除标志位  
  43.         Send_String("up");  //打印信息(调试用)  
  44.         flagTS=1;  //一次接触完毕  
  45.         rADCTSC=0xd3;   //设置触摸屏为等待中断模式。  
  46.     }  
  47.     rSRCPND|=(U32)0x1<<31; //清中断标志  
  48.     rSUBSRCPND|=(U32)0x01<<9;  
  49.     rINTPND|=(U32)0x1<<31;  
  50.     rINTSUBMSK&=~((U32)0x1<<9); //打开中断服务  
  51.  }  
  52.   
  53. /******************************************* 
  54. * 名称:Delay 
  55. * 功能:延时 
  56. * 入口参数:无 
  57. * 出口参数:无  
  58. **********************************************/  
  59. void Delay(void)  
  60. {  
  61.     int i,j,k;  
  62.     for(i=0;i<20;i++)  
  63.     {  
  64.         for(j=0;j<100;j++)  
  65.         {  
  66.             for(k=0;k<1000;k++);  
  67.         }  
  68.     }  
  69. }  
  70.   
  71. /******************************************* 
  72. * 名称:Calibration 
  73. * 功能:触摸屏校正 
  74. * 入口参数:无 
  75. * 出口参数:无  
  76. **********************************************/  
  77. void Calibration(void)  
  78. {  
  79.        char i;  
  80.        int xt[3],yt[3];  
  81.        TFT_CLearScreen(0xFFFFFF);  
  82.        Draw_Cross(32,24,0xFF0000);          
  83.        Draw_Cross(160,216,0xFF0000);  
  84.        Draw_Cross(288,120,0xFF0000);  
  85.    
  86.        //依次读取三个采样点的坐标值  
  87.        for(i=0;i<3;i++)  
  88.        {      
  89.           while(flagTS==0)  
  90.          {  
  91.              Delay();  
  92.          }  
  93.           Send_String("Over");  
  94.           xt[i]=xdata;  
  95.           yt[i]=ydata;  
  96.           flagTS=0;               
  97.        }  
  98.    
  99. //计算参数  
  100.      K=(xt[0]-xt[2])*(yt[1]-yt[2])-(xt[1]-xt[2])*(yt[0]-yt[2]);  
  101.      A=(32-288)*(yt[1]-yt[2])-(160-288)*(yt[0]-yt[2]);  
  102.      B=(xt[0]-xt[2])*(160-288)-(32-288)*(xt[1]-xt[2]);  
  103.      C=yt[0]*(xt[2]*160-xt[1]*288)+yt[1]*(xt[0]*288-xt[2]*32)+yt[2]*(xt[1]*32-xt[0]*160);  
  104.      D=(24-120)*(yt[1]-yt[2])-(216-120)*(yt[0]-yt[2]);  
  105.      E=(xt[0]-xt[2])*(216-120)-(24-120)*(xt[1]-xt[2]);  
  106.      F=yt[0]*(xt[2]*216-xt[1]*120)+yt[1]*(xt[0]*120-xt[2]*24)+yt[2]*(xt[1]*24-xt[0]*216);  
  107. }  
  108.   
  109.   
  110. /******************************************* 
  111. * 名称:Touch_Screen_Init 
  112. * 功能:触摸屏中断初始化 
  113. * 入口参数:无 
  114. * 出口参数:无  
  115. **********************************************/  
  116. void Touch_Screen_Init(void)  
  117. {  
  118.     rADCDLY=50000;           //设置延时  
  119.     rADCCON=(1<<14)|(20<<6);  //设置A/D预分频  
  120.     rADCTSC=0xd3;      //设置等待中断模式  
  121.     rSUBSRCPND|=(1<<9);   
  122.     rSRCPND|=(1<<31);  
  123.     rINTPND|=(1<<31);  
  124.     rINTSUBMSK&=~(1<<9);  
  125.     rINTMSK&=~(1<<31);    //打开中断屏蔽  
  126. }  
  127.    
  128.  /******************************************* 
  129. * 名称:Clk_Set 
  130. * 功能:关于系统时钟的初始化 
  131. * 入口参数:无 
  132. * 出口参数:无 
  133. **********************************************/  
  134. void Clk_Set(void)  
  135. {   
  136.     int count;  
  137.     rUPLLCON=(56<<12)|(2<<4)|2;  //UCLK为48MHZ  
  138.     for(count=0;count<10;count++)  
  139.     {  
  140.         ;  
  141.     }  
  142.     rMPLLCON=(92<<12)|(1<<4)|1;  //FCLK为400MHZ  
  143.     rCLKDIVN=(0<<3)|(2<<1)|1;  //HCLK位100MHZ,PCLK为50MHZ  
  144.     rCAMDIVN=(0<<9); //PCLK=HCLK/4  
  145. }  
  146.   
  147.   
  148. /******************************************* 
  149. * 名称:Main 
  150. * 功能:测试TFT屏幕 
  151. * 入口参数:无 
  152. * 出口参数:无  
  153. **********************************************/   
  154. void Main(void)  
  155. {  
  156.     int x,y;  
  157.     MMU_Init();  //MMU初始化  
  158.     UART0_init();  //串口初始化  
  159.     TFT_Power_Enable(1); //TFT电源管理使能  
  160.     TFT_Contraller_Init();  //TFT初始化  
  161.     TFT_Video_ON(1);  //打开TFT  
  162.      pISR_ADC=(U32)Touch_Int; //注册触摸屏中断函数  
  163.      Touch_Screen_Init(); //触摸屏初始化   
  164.      Calibration(); //触摸屏校正  
  165.      TFT_CLearScreen((0x00<<11) | (0x00<<5) | (0x1f));  
  166.     //Paint_Picture(0,0,480,272,TQ_LOGO_480272_2);  
  167.     while(1)  
  168.     {  
  169.         if(flagTS)  
  170.        {  
  171.             flagTS=0;  
  172.             Send_String("OK");  
  173.             x=(A*xdata+B*ydata+C)/K;          //计算X轴坐标  
  174.             y=(D*xdata+E*ydata+F)/K;          //计算Y轴坐标  
  175.             Draws_Quare(x,y,0x00);   //在触摸坐标处绘制正方形  
  176.         }  
  177.     }  
  178. }  

 

 

关键字:s3c2440  触摸屏  校正与测试 引用地址:s3c2440的触摸屏校正与测试

上一篇:NANDFlashd的读写(基于s3c2440)
下一篇:利用中断改进UART功能

推荐阅读最新更新时间:2024-03-16 14:52

S3C2440裸机实验(4) -----IIC
花了两天的时间终于把这个搞定了,其实I2C的原理还是比较简单的,只是几个细节性的东西还是需要特别的注意,主要是需要注意一下几点: 1.rIICCON &= ~0x10; 清中断必须要在rIICDS = slvAddr; 和rIICSTAT = 0xf0; // 主设备,启动 之后 2.延时对于写外部的低速设备来说非常重要,比如while(flag)之后一定要加延时,还有在写数据时发现只能写入基数地址的数据,这也是由于延时导致的 3.开始调试的时候系统总是死在read的函数中,后来发现在数据手册的note中说当读取最后一个数据的时候一定不能返回ACK信号,而我却在程序中使用while(flag)来等待ACK引发中断,这不
[单片机]
裸机系列——IIS_DMA
s3c2440的IIS总线已经弄了好久,今天大概可以做个总结了吧,最近几天调试IIS弄了人有点疲惫,遇到了很多的问题,但是正是这些问题让我在成长。过多的情绪就不在表现了。进入今天的主题,IIS——DMA总结。 问题1、DMA物理地址 前面我调试DMA的时候也是调了好几天的DMA的UART通信一直得不到结果,后面上网搜了一些大概的信息,DMA需要传输时需要设置连续的物理地址,同时关于虚拟地址,物理地址,总线地址这些不明白,所以我就把#define buffer ((volatile unsigned short *)0x55000010)这种绝对地址当做唯一的物理地址。后面因为直接给个我认为的物理地址后程序不好弄就没调试了。
[单片机]
学习笔记 --- S3C2440 DMA操作原理
DMA(Direct Memory Access,直接内存访问)是一种不经过CPU而直接从内存存取数据的数据交换模式。在需要进行大量数据交换的场合,用好DMA,可以大大提高系统的性能,因为DMA操作几乎不占用CPU资源。s3c2440提供了4个通道的DMA 每个DMA通道能处理下面四种情况的数据传输: (1)源器件和目的器件都在系统总线 APB (2)源器件在系统总线,目的器件在外设总线 (3)源器件在外设总线,目的器件在系统总线 (4)源器件和目的器件都在外设总线 AHB 下面的DMA驱动程序使用的是第四种,内存属于AHB总线上的,我们打算在内存中开辟两个连续空间,分别作为源和目的。我们用两个方法将源中的数据写到目的中,一种
[单片机]
S3C2440在MDK4.22下使用printf向串口打印调试
背景知识: 串口的基本知识已经在上一篇讲过了。这里重点讲解如何在MDK4.22下使用printf函数,这样的话就可以很方便的打印调试信息,追踪。 这个知识来源于MDK自带的帮助手册。有现成的代码提供。 实现方式有2种,使用标准C库下裁剪合适的函数,使用微库C下裁剪合适的函数。 微库下的情况,在魔术棒那里要勾选上使用微库。然后需要定义如下结构和改写如下函数--FILE stdout fputc ferror。 标准库的情况,也是需要关注FILE stdout fputc ferror。注意网上很多文章说,在标准库下,需要关掉半主机模式,我尝试过,关掉后,需要定义_sys_exit函数,可以达到效果,但是如果不关掉半主机模式,和
[单片机]
S3C2440 开发板实战(6):网络配置 + 设置NFS
这篇的主要目的是将PC端(server)和开发板端(client)之间共享文件。 事先声明:本人的PC端是直接安装Ubuntu系统的,所以在操作的时候没有虚拟机这个概念。 linux版本:2.6.22.6 ---------------------------------------------------------------------------------------------------------------------------------- 一、硬件连接 唯一要求:client的网线应该连接上server或者是给server提供服务的router。 比如说我的硬件配置:开发板连接网线至P
[单片机]
基于Linux NFS的Web数码相框设计
   O 引言   随着数码相机和互联网的普及,越来越多的家庭拥有自己的媒体库。媒体库中既包含有自己拍摄的影像文件,也有从网络上下载的影像资料。然而展示影像资料的手段单一,主要通过PC来实现。因此未来构建以媒体库为中心的家庭多媒体网络,把多媒体资料在各式各样的家庭网络媒体终端上展示出来,将成为一种必然的趋势。媒体终端包括Web数码相框、网络数字电视等。   Web数码相框的提出正是为了设计一种家庭嵌入式网络媒体终端,但目前市场上常见的数码相框的网络可扩展性差,本设计方案的提出正是为了能够弥补这方面的不足,提高网络可扩展性。并在本设计方案的基础上构建网络数字电视等其他多功能终端实体。    1 技术方案   Web数
[嵌入式]
05-S3C2440学习之内核(移植)linux3.4.2移植(1) 简单移植+修改MTD分区+制作jffs2文件系统
一、框架介绍及简单修改 1.1 Bootloader如何引导内核 Bootloader的工作: (1)讲内核读入内存中 (2)存一些内核启动参数到指定位置,内核启动时去解析 (3)启动内核,传入机器ID 1.2、内核的启动流程: 首先 内核的最终目的是挂接根文件系统,并启动应用程序。 想启动应用程序—需要挂接根文件系统—装载驱动程序(flash、网卡)--要解析参数(文件系统在哪)--根据R1判断内核是否支持该ID—支持调用初始化相关函数 每个开发板都有不同的硬件参数 内核移植过程中要决定我这个内核支持哪些硬件开发板 我在内核里针对这个开发板给他一个ID。Uboot启动的时候传入和内核中设置好的匹配
[单片机]
05-S3C2440学习之内核(移植)linux3.4.2移植(1) 简单移植+修改MTD分区+制作jffs2文件系统
触摸屏与PLC在闭环控制的变频节能系统中的应用
1、 引言   触摸屏是一种新型可编程控制终端,是新一代高科技人机界面产品,适用于现场控制,可靠性高,编程简单,使用维护方便。在工艺参数较多又需要人机交互时使用触摸屏,可使整个生产的自动化控制的功能得到大大的加强。 PLC有着运算速度高、指令丰富、功能强大、可靠性高、使用方便、编程灵活、抗干扰能力强等特点。近几年,随着科学技术的不断进步,各行业对其生产设备和系统的自动化程度要求越来越高,采用现代自动化控制技术对减轻劳动强度、优化生产工艺、提高劳动生产率和降低生产成本起着很重要的作用。触摸屏结合PLC在闭环控制的变频节能系统中的应用是一种自动控制的趋势。 触摸屏和PLC在闭环控制的变频节能系统中的使用,可以让操作者在触
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved