S3C2440触摸屏控制总结

发布者:huanli最新更新时间:2017-01-17 来源: eefocus关键字:S3C2440  触摸屏控制 手机看文章 扫描二维码
随时随地手机看文章

触摸屏控制原理,其实与ADC读取一个滑动变阻器中间触点电压的原理一样。只不过,读取触摸屏的X、Y方向上的电压需要两次,而且需要设置其工作模式以实现一个ADC读取两个通道的电压。

S3C2440的ADC控制是很简单的,与普通单片机控制ADC的方法没有多大区别。大概的操作步骤都是如下所示。

(1)设置控制寄存器ADCCON

(2)启动ADC转换

(3)等待转换结束

(4)读取转换结果

但是,S3C2440的触摸屏控制有什么工作模式,如等待中断模式,分离的x/y轴坐标转换模式,自动(连续)x/y轴坐标转换模式,普通转换模式。通过官方芯片资料理解这些模式,似乎还是一头雾水。经过测试,我对这些模式有了初步的认识。

(一) ADC&TC模式分析

ADC控制模式

普通模式+无操作模式(AUTO_PST = 0  XY_PST = 00)

这种模式用在ADC的普通操作,而非触摸屏控制,例如我们想读取AIN2通道的电压,就是用这种模式。除了这种模式以外的模式都是触摸屏控制模式。

 

触摸屏控制模式

     分离的x/y轴坐标转换模式

普通模式+测量X轴坐标(AUTO_PST = 0  XY_PST = 01)

这种模式只在X方向上测量电压。这种工作模式要求YM_SEN、YP_SEN、XM_SEN、XP_SEN分别为0、1、1、0,这四个控制位只有这样才能采集X方向上的电压。ADCTSC = 0x69。

 

普通模式+测量Y轴坐标(AUTO_PST = 0  XY_PST = 10)

这种模式只在Y方向上测量电压。这种工作模式要求YM_SEN、YP_SEN、XM_SEN、XP_SEN分别为1、0、0、1,这四个控制位只有这样才能采集Y方向上的电压。ADCTSC = 0x9A。

自动(连续)

 

x/y轴坐标转换模式

自动x/y轴坐标转换模式+无操作模式(AUTO_PST = 1  XY_PST = 00)

这种工作模式可以一次连续的采集两次电压,分别得到X方向上的和Y方向上的电压。这种模式似乎对YM_SEN、YP_SEN、XM_SEN、XP_SEN这四个信号没什么要求。ADCTSC = 0x0C。

     等待中断模式

普通模式+等待中断模式(AUTO_PST = 0  XY_PST = 11)

这种工作模式主要是用来检测触摸屏被按下或者被抬起。这种工作模式要求YM_SEN、YP_SEN、XM_SEN、XP_SEN分别为1、1、0、1,并且PULL_UP为0,即使能上拉。检测按下,ADCTSC = 0xD3;检测抬起 ADCTSC = 0x1D3。

 

可以看到,其实工作模式的决定在于ADCTSC中的AUTO_PST(ADCTSC [2]) 、XY_PST(ADCTSC [1:0])三位。理论上,共可以确定8种工作模式,实际上只用到了5种工作模式。

 

(二) ADCTSC的YM_SEN、YP_SEN、XM_SEN、XP_SEN四位的重要性

 

需要说明的是YM_SEN、YP_SEN、XM_SEN、XP_SEN这四个信号的重要性。起初,我在写程序过程中,设置完自动(连续)x/y轴坐标转换模式并且已经读取了X、Y方向上的值之后,直接通过读取ADCDAT0的UPDOWN位来判断是否已经抬起。结果,我发现即使已经抬起,但是UPDOWN位还是0,而不会变到1。出错的程序在红色那一行。 


static void Isr_Tc(void)

{

    printf("Stylus Down: ");

    mode_auto_xy();     /* 进入自动(连续) X/Y轴坐标转换模式 */

    

    /* 设置位[0]为1,启动A/D转换

     * 注意:ADCDLY为50000,PCLK = 50MHz,

     *       要经过(1/50MHz)*50000=1ms之后才开始转换X坐标

     *       再经过1ms之后才开始转换Y坐标

     */

    ADCCON |= ADC_START;

    // 检测位[15],当它为1时表示转换结束

    while (!(ADCCON & ADC_ENDCVT));

    // 打印X、Y坐标值    

    printf("xdata = %4d, ydata = %4d\r\n", (int)(ADCDAT0 & 0x3ff), (int)(ADCDAT1 & 0x3ff));


    while(!(ADCDAT0 & 0x8000));

    printf("Stylus Up!!\n\r");

    wait_down_int();         /* 进入"等待中断模式",等待触摸屏被按下 */

    // 清INT_TC中断

    SUBSRCPND |= BIT_SUB_TC;

    SRCPND    |= BIT_ADC;

    INTPND    |= BIT_ADC;

}


 

经过分析,我得知当YM_SEN、YP_SEN、XM_SEN、XP_SEN不是1、1、0、1时,触摸屏控制器就根本不能检测到触摸屏的抬起和按下(这是由触摸屏的工作原理决定的)。知道了错误原因,我在读取完X、Y方向上的值后,加入了“等待(抬起)中断模式”的代码,再来判断是否能检测到。结果,我发现当抬起时,UPDOWN位变为了1,证明了我的原因分析。修改的程序如下。

 


static void Isr_Tc(void)

{

    printf("Stylus Down: ");

    mode_auto_xy();     /* 进入自动(连续) X/Y轴坐标转换模式 */

    

    /* 设置位[0]为1,启动A/D转换

     * 注意:ADCDLY为50000,PCLK = 50MHz,

     *       要经过(1/50MHz)*50000=1ms之后才开始转换X坐标

     *       再经过1ms之后才开始转换Y坐标

     */

    ADCCON |= ADC_START;

    // 检测位[15],当它为1时表示转换结束

    while (!(ADCCON & ADC_ENDCVT));

    // 打印X、Y坐标值    

    printf("xdata = %4d, ydata = %4d\r\n", (int)(ADCDAT0 & 0x3ff), (int)(ADCDAT1 & 0x3ff));

    

    wait_up_int();

    while(!(ADCDAT0 & 0x8000));

    printf("Stylus Up!!\n\r");

    

    wait_down_int();         /* 进入"等待中断模式",等待触摸屏被按下 */

    // 清INT_TC中断

    SUBSRCPND |= BIT_SUB_TC;

    SRCPND    |= BIT_ADC;

    INTPND    |= BIT_ADC;

}


  

(三)触摸屏控制器ADCCON寄存器起到的作用

 

       无论是ADC操作,还是触摸屏操作都用到了ADCCON。它们都是用ADCCON的ENABLE_START来启动转换,ADC操作就是启动ADC对应通道的转换,触摸屏就是启动或者X方向通道,或者Y方向通道,或者X/Y两个通道的转换(启动一次转换读取两个通道的值分别保存在ADCDAT0、ADCDAT1中)。

它们都能通过ADCCON的ECFLG来读取是否转换结束。

 

(四)ADC&TC中断信号INT_ADC、INT_TC

 

          INT_ADC信号产生分四种情况如下:

      (1)普通ADC转换结束

      (2)触摸屏X方向转换结束

      (3)触摸屏Y方向转换结束

      (4)连续X/Y方向转换结束

        INT_TC信号产生分两种情况如下:

      (1)触摸屏被按下

      (2)触摸屏被抬起

  


关键字:S3C2440  触摸屏控制 引用地址:S3C2440触摸屏控制总结

上一篇:STM32与S3C2440的区别
下一篇:S3C2440的LCD虚拟显示测试

推荐阅读最新更新时间:2024-03-16 15:31

ARM9(S3C2440) UART
数据通信的方式 数据通信的方式基本分为: (1)、并行通信:多条数据线将数据的各位同属传送。 特点:传输速度快,适用于短距离通信。 (2)、串行通信:一条数据线将数据一位一位的顺序传送。 特点:线路简单,低成本,适用于远距离通信。 一: 异步通信: 以一个字符为传输单位,通信中两个字符间的时间间隔是不固定的,然而同一个字符中的两个相邻位之间的时间间隔是固定的。 二: 通信协议 指双方约定的一些规则。在异步通讯时,对数据格式有如下的约定:有空闲位,起始位,资料位,奇偶校验位,停止位。 (1)、起始位:先发送一个逻辑信号“0”信号,表示传输字符的开始。 (2)、数据位:紧接在起始位之后。数
[单片机]
ARM9(<font color='red'>S3C2440</font>) UART
基于AT89C51的液晶显示触摸屏控制设计
1 引 言 嵌入式触摸屏装置是人机交互设备,一般将触摸屏安装在液晶显示屏上面,利用微处理器对触摸屏与液晶显示屏进行控制,实现触摸屏对液晶显示屏的控制,方便、直观,取代了传统的键盘输入,成为嵌入式计算机系统的输入设备,广泛应用于电子产品与工业控制中。由于触摸屏边缘电阻不均匀,不易找到变化规律,难于实现触摸屏坐标与点阵式液晶显示屏相互对应,会出现触摸点与液晶显示屏显示信息错位,造成触摸控制信息不灵敏。本文基于AT89C51单片机和ADS7846芯片,辅以点阵式液晶显示屏,进行嵌入式触摸屏输入与显示系统的软硬件设计,实现触点测量与液晶屏上像素相对应,实现预期的控制功能,提高触摸控制的灵敏度。 2 液晶显示触摸屏的硬件设计 液
[单片机]
基于AT89C51的液晶显示<font color='red'>触摸屏</font><font color='red'>控制</font>设计
s3c2440液晶屏驱动 (内核自带) linux-4.1.24
自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev/s3c2410fb.c 先打开调试功能,这样内核在启动的时候,就可以输出这些信息,或者使用 dmesg 查看到这些信息。当然,你配置内核 make menuconfig 也可以打开,但是太麻烦了,不如这样。 1 #define CONFIG_FB_S3C2410_DEBUG 2 #define dprintk(msg...) 3 do { 4 if (debug) 5 printk(msg);
[单片机]
<font color='red'>s3c2440</font>液晶屏驱动 (内核自带) linux-4.1.24
S3C2440 Linux2.6 I2C驱动程序之框架和编写(二十八)
上一节 我们学习了: IIC接口下的AT24C02驱动分析:https://blog.csdn.net/xiaodingqq/article/details/81808875 接下来本节,学习Linux下如何利用linux下I2C驱动体系结构来操作AT24C02 1、I2C体系结构分析 1.1 首先进入linux内核的driver/i2c目录下,如下图所示: 其中重要的文件介绍如下: 1)algos文件夹(algorithms) 里面保存I2C的通信方面的算法 2)busses文件夹 里面保存I2C总线驱动相关的文件,比如i2c-omap.c、 i2c-versatile.c、 i2c-s3c241
[单片机]
<font color='red'>S3C2440</font> Linux2.6 I2C驱动程序之框架和编写(二十八)
S3C2440 开发板实战(3):编译概念 + LED点亮闪烁
基于我原先有STM32等单片机的基础,内容是结合我所新学习到的知识进行书写,所以基础知识可能不会涉及到请见谅。 一、LED点亮 我们直接通过C程序对寄存器进行操作(汇编语言使用尽量少),通过原理图可看出开发板上的LED对应的GPIO口为GPF4、5、6,所以这里首先以GPF4对应的LED进行点亮,从芯片手册寻找GPF4对应的寄存器(I/O port 章节),就可以看到S3C2440芯片控制IO口对应的寄存器为下图所示: GPIO寄存器 然后就是和单片机操作一样,对他进行一一设置,对于LED的电量只要利用GPFCON和GPFDAT寄存器这两就行, 1. 首先对GPFCON进行设置,查找GPFCON表找到GPF4,如下所示
[单片机]
<font color='red'>S3C2440</font> 开发板实战(3):编译概念 + LED点亮闪烁
Synaptics发布具有集成触控笔支持功能的Windows 8.1认证电容式触摸屏控制
Synaptics公司宣布率先向市场推出具有集成触控笔支持功能的Windows 8.1认证电容式触摸屏控制器,适用于智能手机、平板电脑和笔记本电脑触摸屏。Synaptics已将触控笔功能集成到该公司的最新ClearPad®触摸屏控制器中,以提供随时可用的手写笔功能,而无需使用多个分立系统元件,也不为OEM增加任何成本。 Synaptics ClearPad 7500系列触摸屏控制器预先集成了手写笔支持功能,可与现有触摸屏传感器配合使用,它提供了业界首个一体化解决方案,适用于那些希望利用高质量手写笔体验让其下一代设备占据市场优势的OEM。有了ClearPad 7500系列,我们无需再使用其他触控笔数字化器和控制器特定应用集成电路(AS
[单片机]
s3c2440裸机-电阻触摸屏编程(4.isr设计_4.2支持长按和滑动)
1.改进定时器 五. irq之定时器中断这记一节中,是在handle_irq_c()中去区分中断源,执行不同的isr。那现在通过register_timer注册对应的定时器中断服务程序,timer_irq进行执行不同的定时器中断服务程序。 #define TIMER_NUM 32 #define NULL ((void *)0) typedef void(*timer_func)(void); typedef struct timer_desc {   char *name;   timer_func fp; }timer_desc, *p_timer_desc; timer_desc timer_array ; in
[单片机]
S3C2440 测试程序(二)RTC显示实验
源代码: void RTC_Display(void) { U16 year ; U8 month, day ; // week U8 hour, minute, second ; RTC_Time_Set() ; 注: 初始日期和时间的设置 Uart_Printf( \nRTC TIME Display, press ESC key to exit !\n ) ; while( Uart_GetKey() != ESC_KEY ) { rRTCCON = 1 ; //RTC read and write enable year = 0x2000+rBCDYEAR ; //2012 month = rBCDMON
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved