ARM9(S3C2440) Touch Screen

发布者:平凡梦想最新更新时间:2022-04-27 来源: eefocus关键字:ARM9  S3C2440  Touch  Screen 手机看文章 扫描二维码
随时随地手机看文章

触摸屏工作原理


触摸屏分为:电阻式,电容式,声表面波式,红外线扫描式等类型,使用的最多的是4线电阻式的触摸屏。

 

 

触摸屏工作流程


(1)、设置触摸屏接口为等待中断模式,等待触摸屏被按下。


(2)、如果中断(INT_TC)发生,选择X,Y坐标转换模式(X/Y坐标分别转换模式,X/Y坐标自动转换模式),启动AD转换。


(3)、当AD转换完毕后,通过中断(INT_ADC),获取X/Y坐标,ADCDAT0 bit[9:0]-x坐标,ADCDAT1 bit[9:0]-Y坐标。


(4)、设置触摸屏接口为等待中断模式,等待触摸笔离开触摸屏。


(5)、返回步骤1,等待下次触摸笔被按下。

 

实验主要代码


main,c


/*主函数*/

int Main(void)

    int Scom=0;


    Set_Clk();

    Uart_Init(0,115200);

    Uart_Select(Scom);

   

    Test_Touchpanel();

   

    while(1);

    return 0;

}


/*触摸屏初始化*/

void Test_Touchpanel(void)

{undefined

  

    rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms

   

    /*设置AD转频率*/

    preScaler = ADC_FREQ;

    preScaler = 50000000/ADC_FREQ - 1; //PCLK=50M

    rADCCON = (1<<14)|(preScaler<<6); //ADCPRS En,PRSCVL

 


    /*设置触摸屏为等待中断模式,等待触摸笔被按下*/

    rADCTSC=0xd3;  //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En

   

    /*clear irq*/

    rSRCPND = 0x80000000;

    rINTPND = 0x80000000;

    ClearSubPending(BIT_SUB_TC);   //子中断也要清除

 

    pISR_ADC = (U32)AdcTsAuto;


    /*enable INT_TC irq*/

    rINTMSK = 0x7fffffff;    

    EnableSubIrq(BIT_SUB_TC);

}


/*************************************************

Function name: AdcTsAuto

Parameter    : void

Description  : 中断服务程序

Return   : void

Argument     : void

Autor & date : Daniel

**************************************************/

static void __irq AdcTsAuto(void)

{undefined


    U32  saveAdcdly;

 

    /****************stylus down************************/

    /*检测子中断源,判断是否是INT_TC中断,且触摸笔按下*/

    if(rSUBSRCPND & (BIT_SUB_TC))

    {undefined

 if( !(rADCDAT0&0x8000))

     Uart_Printf("nStylus downn");

 else

            Uart_Printf("nStylus upn"); 

    }

 

    /*pull-up disable,自动连续X,Y坐标转换*/

    rADCTSC = (1<<3)|(1<<2);

    saveAdcdly=rADCDLY;

    rADCDLY=40000;    //Normal conversion mode delay about (1/50M)*40000=0.8ms

 

 /*开始AD转换*/

 rADCCON|=0x1;                   //start ADC

    while(rADCCON & 0x1);  //check if Enable_start is low

   

 while(!(rADCCON & 0x8000));  //check if EC(End of Conversion) flag is high, This line is necessary~!!

 

 while(!(rSRCPND & 0x80000000));  //check if ADC is finished with interrupt bit


 /*获取X,Y坐标*/

 xdata=(rADCDAT0&0x3ff);

    ydata=(rADCDAT1&0x3ff);

   

    ClearSubPending(BIT_SUB_TC);

    //ClearPending(BIT_ADC);

    rSRCPND = 0x80000000;

 rINTPND = 0x80000000; 

 


    EnableSubIrq(BIT_SUB_TC);

    //EnableIrq(BIT_ADC);

    rINTMSK = 0x7fffffff;

    /****************stylus down************************/

   

   

    /****************stylus up**************************/


 /*设置触摸屏为等待中断模式,等待触摸笔抬起*/

    rADCTSC =0xd3;    //Waiting for interrupt

 rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

 

 while(1)  //to check Pen-up state

 {undefined

  if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit

  {undefined

     Uart_Printf("Stylus Up Interrupt~!n");

     break; //if Stylus is up(1) state

  }

 } 

 /****************stylus up**************************/

 

 Uart_Printf("count=%03d  XP=%04d, YP=%04dn", count++, xdata, ydata); 

 

 rADCDLY=saveAdcdly;

 /*设置触摸屏为等待中断模式,等待下次触摸笔按下*/

    rADCTSC =0xd3;    //Waiting for interrupt

   

 ClearSubPending(BIT_SUB_TC); 

    //ClearPending(BIT_ADC);

    rSRCPND = 0x80000000;

 rINTPND = 0x80000000;


    EnableSubIrq(BIT_SUB_TC);

    //EnableIrq(BIT_ADC);

    rINTMSK = 0x7fffffff;

}


关键字:ARM9  S3C2440  Touch  Screen 引用地址:ARM9(S3C2440) Touch Screen

上一篇:ARM9(S3C2440) LCD
下一篇:ARM9(S3C2440) ADC

推荐阅读最新更新时间:2024-11-10 11:43

s3c2440 MPLL & UPLL
S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是UPLL。 MPLL用于CPU及其他外围器件,UPLL用于USB。用于产生FCLK, HCLK, PCLK三种频率,这三种频率分别有不同的用途: FCLK是CPU提供的时钟信号。 HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器, DMA 等。 从S3C2440的DataSheet里可以看到,S3C2440最大支持400MHz的主频,但是这并不意味着一定工作在400MHz下面,可以通过设定MPLL, UPLL寄存器来设定CPU的工作
[单片机]
S3C2440各类端口操作函数简介
micro2440采用S3C2440处理器(和S3C2410区别不大),在其Linux源码中,和这个平台相关的代码主要在arch/arm/mach-s3c2410和include/asm-arm/arch-s3c2410中,相关驱动在drivers目录中。 (1)DM9000网卡驱动 kernel-2.6.13/drivers/net/dm9000x.c (2)串口(包括三个串口驱动0,1,2,对应设备名/dev/tts/0,1,2) kernel-2.6.13/drivers/serial/s3c2410.c (3)实时时钟RTC驱动 kernel-2.6.13/drivers/char/s3c2410-rtc.c (4)L
[单片机]
1.5.6_定时器中断程序示例
通过S3C2440内部的定时器,可以产生稳定的定时器中断,示例程序为每0.5s产生一次中断,在中断中循环点亮小灯。 首先,S3C2440内部的定时器运行示意图如下: 每来一个时钟脉冲,TCNTn的计数值就会减1。从定时器操作示意图可以看出,只在TCNTn降到0时,才发生中断,在TCNTn = TCMPn时,可以发生输出引脚输出变化,这可以用来输出不同占空比的PWM波。 定时器的时钟源是PCLK,PCLK经过8位的预分频和多路选择器,将时钟供给定时器。 设置Timer主要就步骤: 设置时钟; 设置初值; 加载初值,启动timer; 设置为自动加载; 设置中断相关。 具体的寄存器操作,查看S3C2440第十章的寄存
[单片机]
1.5.6_定时器中断程序示例
基于S3C2440的DM9000网卡驱动的移植
0 引言   以太网(Ethernet)是一种计算机局域网组网技术。在局域网中,多个节点是共享传输介质的,这就必须由某种机制来决定某个时刻哪个设备占用传输介质来传输数据,因此,局域网的链路层要有介质访问控制的功能,即数据链路层分为逻辑链路控制LLC子层和介质访问控制MAC子层 。   本文主要研究基于S3C2440的DM9000网卡驱动的移植。网络对于嵌入式系统来说是必不可少的,但是S3C2440没有集成以太网接口,所以要想使S3C2440具备以太网的功能,就必须扩展网卡接口。本文选择外接DM9000,使其可以与以太网相连接,并完成DM9000网卡驱动的移植。 1 Linux网络驱动层次   Linux网络驱动可以划分为4层,
[单片机]
基于OHCI协议的S3C2440 USB Host Driver之协议介绍(三)
OpenHCI通过两级仲裁在端点中选择哪一个服务。第一级是表级。每一个需要服务的端点类型在相应的类型表里。HC选择服务哪一个表。而在表内,端点都有差不多公平的机会被访问到。HCD通知设置HcPeriodicStart限制从帧开始到开始要服务周期表的时间。周期表服务时,当前帧下,中断表优先于同步表。当周期表服务完,控制和批量有可能会接着服务。 ED作为锚点,供一列TD依附在其上。当HC访问ED且找到一个有效的TD地址,HC完成与指定ED的单笔事务,TD表明了内存地址。 当一个TD所定义的所有数据都传输完,TD从他的ED上解下,且连到完成队列。 ED描述符 FA就是设备地址 EN就是端点地址 D为方向 S
[单片机]
基于OHCI协议的<font color='red'>S3C2440</font> USB Host Driver之协议介绍(三)
s3c2440定时器中断的应用
在前面的几篇文章中,每当程序需要延时时,我们是利用循环语句来实现。这种方法的延时简单,但不是很精确,就是说不能得到确切的一段时间的延时。因此当需要精确延时时,就不能采用这种方法了。一般是利用定时器来实现。在这里,我们就介绍一下s3c2440定时器的使用方法。 在讲解之前,先介绍一下s3c2440时钟系统。一般来说,MCU的主时钟源主要是外部晶振或外部时钟,而用的最多的是外部晶振。在正确情况下,系统内所使用的时钟都是外部时钟源经过一定的处理得到的。由于外部时钟源的频率一般不能满足系统所需要的高频条件,所以往往需要PLL(锁相环)进行倍频处理。在s3c2440中,有2个不同的PLL,一个是MPLL,另一个是UPLL。UPLL是给US
[单片机]
ARM9中断与PC
1, 假设当前是PC,PC-4,PC-8。当前 取指PC =当前PC,当前 译码PC =当前PC-4, 当前 执行PC =当前PC-8。例如,如下图所示,当前 取值PC =16,当前 解码PC =12,当前 执行PC =8。 2, 发生IRQ异常,执行保护操作,LR中保存由于FIQ或IRQ占先而没有被执行完的指令的地址的下一条地址(LR中保存的是当前PC的值,也就是取值的指令地址),即LR指向了指令地址=16的指令,但指令地址=12的指令还没有执行完,中断返回后还要继续执行 3, 进入中断服务程序 4, 中断返回前,对LR处理,LR=LR-4,指向之前已译码但没被执行的指令的地址(如果返回的时候直接返回PC,那么中
[单片机]
<font color='red'>ARM9</font>中断与PC
ARM-Linux s3c2440 之UART分析(四)
注册完成之后,设备与驱动是如何连接的呢? 原来在driver_register()注册中已经进行设备连接了。 串口是一种platform设备,在体系框架setup_arch()中完成设备注册,而且设备的注册先于驱动注册,最终串口设备与驱动的连接在driver_register() -- bus_add_driver()中完成。 int bus_add_driver(struct device_driver *drv) { intret; structdevice_driver *other; if(drv- bus- p- drivers_autoprobe)
[单片机]

推荐帖子

SparkRoad测评(9)-例程GAME测试
安路开发板中的较复杂的测试是GAME测试,该测试中引入了CPU和VGA的测试,当然CPU应该是软核的,这个cpu是什么指令集的不知道,有时间了研究一下,游戏的源码:好象在一个文件了。//加载rom程序initialbegin$readmemh("./sources/rtl/mcu/rom.o",rom_reg);end由于上次的VGA实验没有搞成,所以就多看了看VGA的源码,这次的VGA是640x480@60Hz的分辨率,而且使用了RAM作为显存,显示的程序在
bigbat 国产芯片交流
谁知道STM32控制电机的参考方案什么时候出来?
我很关心这个,望帮忙看看,广告上说4季度的,谁知道STM32控制电机的参考方案什么时候出来?LZ若确有具体项目可以与我们的业务人员联系,我们可以先安排与您的技术交流,并在套件推出后让您先得到。现在正在进行内部培训和测试我有个项目做自动化设备,要控制电机.我也想知这个我都问了快一年了,从STR75x到STM32我这里倒是有STR750电机控制套件.电
jinian601 stm32/stm8
用Verilog 实现一个16位超前进位加法器(实例)
modulecla16(a,b,s);//topmodule含有四个4位超前进位加法器子模块inputa,b;outputs;wirepp4,pp3,pp2,pp1;wiregg4,gg3,gg2,gg1;wireCp;wirep,g;claslicei1(p,p,p,p,g,g,g,g,1\'b0,Cp,Cp,Cp,pp1,gg1);claslicei2(p,p,p,p,g,g,g,g,Cp
settleinsh FPGA/CPLD
【GD32L233C-START评测】12. 硬件IIC驱动OLED
之前的帖子可以参考:【GD32L233C-START评测】1.开箱【GD32L233C-START评测】2.手把手创建新工程【GD32L233C-START评测】3.移植FreeRTOS到GD32L233【GD32L233C-START评测】4.移植RT-Thread到GD32L233【GD32L233C-START评测】5.IIC驱动OLED【GD32L233C-START评测】6.获取RTC时间并通过OLED显示【GD32L233C-STA
hehung GD32 MCU
数控电源-PCB
数控电源-PCB数控电源-PCB
feifei 电源技术
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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