S3C2416裸机开发系列十三_电容屏驱动实现

发布者:紫菜包饭最新更新时间:2016-12-12 来源: eefocus关键字:S3C2416  裸机开发  电容屏驱动 手机看文章 扫描二维码
随时随地手机看文章

在人机交互系统中,键盘、触摸屏等输入设备是一个不可或缺的部分。对于手机、平板这些消费类电子而言,触摸屏以其非常良好的用户体验得到了广泛的应用。笔者此处就s3c2416 IIC接口电容屏的应用作一个简单的介绍。

1. 触摸屏概述

目前嵌入式系统中常用的触摸屏有两种,一种是电阻式触摸屏,另一种是电容式触摸屏。电阻屏需要一定的压力使屏幕各层发生接触,两层导电层在接触点的位置电阻会发生变化,在X、Y两个方向产生模拟的分压值,这个分压值通过触摸屏控制器模数转换,得到触摸点的坐标位置。因此,电阻屏只要有压力接触,就会有反应,也正因为电阻屏需一定的压力,造成电阻屏表面容易磨损,敏感度较差,实现目前手机滑动解锁的功能是比较困难的。由于其实现机制,电阻屏只能够单点触摸,对环境使用要求不高,可以实现较精确位置的触控。

电容屏在工作面四个角上引出电极,在导体层内形成一个低电压交流电场。用户触摸屏时,由于人体电场、用户、触摸屏表面形成一个耦合电容,对于高频电流来说,电荷会通过这个耦合电容流向大地,这个很小的电流分从触摸屏的四角上的电极中流出,并且流经这四个电极的电流与手指到四角的距离成正比,控制器通过对这四个电流比例的精确计算,得出触摸点的位置。因此,电容屏只对带电物体的触控具有反应,如牙签、指甲、带手套等是无法操作电容屏的。由于电容屏基于电荷进行工作,因此只需手指轻触即能得到输入反应,敏感度高。但同时对周围环境要求高,过于潮湿的环境(如浴室),有水滴在触摸屏上等都可能造成电容屏无法正常工作。电容相对精度较低,无法通过手指触控精细位置。此外,电容屏可以支持多点触摸,几乎成为手机、平板触摸屏的首选,用以支持多点触摸进行图片放大、旋转等功能。

2. 电容屏驱动实现

笔者使用的电容屏驱动IC为focaltech的ft5206,这款芯片可以最多支持真实5点,即最多可同时检测到5个点同时触摸,接口支持IIC与SPI。

驱动芯片检测到一个有效的触摸时,将产生一个中断控制信号。有两种模式的中断信号输出,分别为查询模式和触发模式。查询模式适用于只支持单点触摸处理的软件应用中,除手机、平板所用的Android、ios外,大部分操作系统(或图形系统)并不很好地支持多点触摸。采用这种有触摸时,中断信号线拉低,无触摸时,中断信号线拉高的模式将极好地应用到这些软件中。触发模式就是在有触摸时,驱动芯片会以一定频率产生中断信号,以上报触摸点的坐标位置,通常这个上报频率为100HZ左右(驱动芯片固化),上报频率过低可能会造成掉点。这样可以保证识别多个点的触摸。目前,主流手机、平板均是这种工作方式获得多点触摸的坐标位置的。

笔者的电容屏模组采用的是IIC接口,因此,s3c2416电容屏驱动实现需要以上一章节IIC驱动为基础,在电容屏测试代码中给出了5点触摸画布的实例,可以用5个指头同时在画布上作图。本章节触摸屏模块代码测试需要前面章节的启动代码、IIC接口模块、RGB屏驱动模块支持。

tp_ft5206.c模块实现如下:

#include "s3c2416.h"

#include "IIC.h"

#include "tp_ft5206.h"

#include "Exception.h"

 

volatile unsigned char  TP_Press;

static void TP_EINT8_15_IRQ()

{  

    if (rEINTPEND & (1<<12)) { //EINT12中断处理

        rEINTMASK |= (1 << 12); // EINT12中断禁用  

        rEINTPEND |= (1 << 12); // 清中断标志

        TP_Press = 1; // 指示触摸屏发生了按下

    }

   

    rSRCPND1 |= (1 << INT_EINT8_15);//Clear pending bit

    rINTPND1 |= (1 << INT_EINT8_15);

 

}

 

static void Delay_ms(unsigned int nCount)

{

//延时1ms,共延时nCount(R0) ms

    __asm__ __volatile__ (

        "0:\n\t"   

        "ldr  r1, =100000\n\t"  // Arm clock为400M     

        "1:\n\t"

        "subs r1, r1, #1\n\t"  // 一个Arm clock

        "bne  1b\n\t"      // 跳转会清流水线,3个Arm clock

        "subs %0, %0, #1\n\t"   // 调用者确保nCount不为0

        "bne  0b\n\t"

        : : "r"(nCount):"r1"

    );

}

 

// 向电容屏内部地址WriteAddr连续写入Length字节数据,数据位置在pData中

intTP_WriteBytes(unsigned char WriteAddr, unsigned char *pData,

             int Length)

{  

    // 调用IIC写,对电容屏内部某一地址进行连续写

    return IIC_WriteBytes(TP_SlaveAddr,WriteAddr, pData, Length);

}

 

// 向电容屏内部地址ReadAddr连续读入Length字节数据,数据保存在pData中

intTP_ReadBytes(unsigned char ReadAddr, unsigned char *pData,

             int Length)

{

    // 调用IIC接口读,对电容屏内部某一地址进行连续读

    return IIC_ReadBytes(TP_SlaveAddr, ReadAddr,pData, Length);

}

 

void TP_Reset()

{

    rGPFDAT &= ~(1 << 5); // 拉低复位线

    Delay_ms(20);

    rGPFDAT |= (1 << 5);

    Delay_ms(200);

}

 

void TP_Init()

{

    rGPGUDP &= ~(0x3 << 8); //GPG4(EINT12)作为电容屏中断输入

    rGPGUDP |= (0x2 << 8); // TP_INT GPG4上拉  

    rGPGCON &= ~(0x3 << 8);

    rGPGCON |= (0x2 << 8); // GPG4配置成EINT12

   

    rGPFUDP &= ~(0x3 << 10); // GPF5作为复位控制信号

    rGPFUDP |= (0x2 << 10); // TP_RST GPF5上拉 

    rGPFCON &= ~(0x3 << 10);

    rGPFCON |= (0x1 << 10); // GPF5配置成输出

   

    TP_Reset(); //TP复位

    // TP外部中断入口函数加入到向量表

    IRQ_Register(INT_EINT8_15, TP_EINT8_15_IRQ);

    rEXTINT1 &= ~(0x7 << 16);

    rEXTINT1 |= (0x2 << 16); // EINT12下降沿触发

    rINTMOD1 &= ~(1 << INT_EINT8_15);// EINT8_15 IRQ

    rINTMSK1 &= ~(1 << INT_EINT8_15);// EINT8_15 开启中断

    rEINTMASK &= ~(1 << 12); // EINT12使能中断 

}

 

模块的头文件内容如下:

#ifndef__TP_FT5206_H__

#define__TP_FT5206_H__

 

#ifdef__cplusplus

extern"C" {

#endif

 

// TP IIC的7位从机地址

#define TP_SlaveAddr    0x38

   

#define TOUCH1_XH       0x03

#define TOUCH1_XL       0x04

#define TOUCH1_YH       0x05

#define TOUCH1_YL       0x06

#define ID_G_MODE       0xA4

 

extern void TP_Reset(void);

extern void TP_Init(void); 

extern int TP_WriteBytes(unsigned char WriteAddr,

                   unsigned char *pData, int Length);

extern int TP_ReadBytes(unsigned char ReadAddr,

                 unsigned char *pData, int Length);

extern volatile unsigned char TP_Press;

   

#ifdef__cplusplus

}

#endif

#endif/*__TP_FT5206_H__*/

 

五指同时触摸画线效果:

3. 附录

TouchPanel_gcc.rar,五点触摸画线电容屏GCC测试工程

http://pan.baidu.com/s/1i37NU2x


关键字:S3C2416  裸机开发  电容屏驱动 引用地址:S3C2416裸机开发系列十三_电容屏驱动实现

上一篇:S3C2416裸机开发系列十四_GCC下UCGUI的移植(1)
下一篇:S3C2416裸机开发系列十二_IIC驱动实现

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

arm-linux-gcc裸机程序开发(三)
一. 中断问题 中断对编写程序非常的重要,所以程序对中断处理的好坏将直接影响程序的优劣,对实时性要求较高的系统更是如此。对于ADS2.0,在编写中断处理程序的时候,只需要在程序前面加上 _irq 这个关键字,ADS就会自动为我们保存中断现场,等程序返回的时候自动恢复现场,细节无须我们关心。当然,也可以不加这个关键字,如果这样就得自己保存与恢复中断现场,考虑的问题就多了。arm-linux-gcc开发环境下,目前我还没有发现类似“_irq”这样的关键字可以通知编译器自动处理中断过程。因此,如果使用arm-linux-gcc编译带有中断的程序,就必须自己处理中断现场。除了保护中断现场外,程序还需要做的就是设置正确的中断向量表,
[单片机]
S3C2416裸机开发系列九_GCC启动代码工程应用实例
GNU是一个自由软件工程项目,目标在于创建一个完全兼容于 UNIX 的 自由软件 环境。GNU已经开发出了大部分UNIX系统的程序库和工具,如功能强大的文字编辑器Emacs,本章节涉及的GUN开发编译器GCC等。尤其是Linux与其它的GNU软件结合,诞生了GNU下完全自由免费的操作系统。GNU软件功能完善而强大,丝毫不输商业软件,其开源免费的特性也得到了世界各地程序员的积极响应,让GNU软件尤其是Linux得到了相当广泛的应用。s3c2416由于性能优越,用来运行Linux等GNU软件是完全没问题的,笔者此处应读者的要求,把s3c2416的启动代码工程移植到GCC交叉编译环境上,以方便读者在Linux下作进一步的开发。 1.
[单片机]
<font color='red'>S3C2416</font><font color='red'>裸机</font><font color='red'>开发</font>系列九_GCC启动代码工程应用实例
s3c6410串口裸机开发串口波特率计算
假设时钟选择为PCLK(S3C6410为66Mhz) 由以下两个公式可以帮助我们通过设置相关寄存器来决定串口波特率 公式1: 公式2: 我们可以先通过公式2算出DIV_VAL的值,然后将接近DIV_VAL的值赋给寄存器UBRDIVn,然后在根据公式1算出num of 1's in UDIVSLOTn。其中UDIVSLOTn的赋值可以根据下表来设置: 通过上述配置,就将UBRDIVn和UDIVSLOTn的值确定下来,从而得到我们想要的波特率bps 将此公式和表格列出,方便以后再做开发使用。 参考: S3C6410 datasheet
[单片机]
s3c6410串口<font color='red'>裸机</font><font color='red'>开发</font>串口波特率计算
Exynos4412裸机开发 —— UART
一、Exynos4412 UART 的特性 Exynos4412 中UART,有4 个独立的通道,每个通道都可以工作于中断模式或DMA 模式,即 UART 可以发出中断或 DMA 请求以便在UART 、CPU 间传输数据。UART 由波特率发生器、发送器、接收器和控制逻辑组成。 使用系统时钟时,Exynos4412 的 UART 波特率可以达到 4Mbps 。波特率可以通过编程进行 。 Exynos4412 UART 的通道 0有 256 字节的发送 FIFO 和 256 字节的接收FIFO ;通道 1、4有 64 字节的发送 FIFO 和 64 字节的接收FIFO;通道 2、3有 16 字节的发送FIFO 和 16 字节
[单片机]
Exynos4412<font color='red'>裸机</font><font color='red'>开发</font> —— UART
单片机裸机开发经验
在论坛里见到好多朋友学习裸机的时候都有一个习惯——做裸机开发时,过度依赖天嵌的裸机测试程序。怎么说呢,我觉得这样不是很好。尤其是对于一个新手。 也许是学习单片机出身的原因,我有一个毛病,就是对别人的代码不放心、凡事非得扣到底层。 一开始我看天嵌的裸奔三部曲,有一个体会——越看越迷茫。尤其是简单地修改了天嵌的程序,实现了显示几个自定义图片的时候。这里也算是给天嵌提一个建议吧。一般来讲,新手看到这里的感觉就是特迷茫:难道这就是学裸机程序吗?修改几行C代码?天嵌手册里说这样会迅速建立成就感,可是我丝毫没有。反而感到的是强烈的不安。毕竟天嵌的裸机程序对于一个新手来说太庞大,甚至会搞不清文件之间的关系。我们现在做的就是简单地修改几行现成的代
[单片机]
总有一款合适你--ARM下裸机开发环境大全
一.什么是裸机开发 裸机是一种通俗的讲法,就是指ARM设备上没有任何现成的程序来支持你的开发的软件运行。它是相对设备上有在操作系统的情况运行可执行程序而言的。 这两种程序有很大区别。在操作系统环境下,基本上跟桌面程序开发没有太多区别,而裸机程序需要自己初始化硬件环境来运行。因为必须有一小段汇编写的引导代码来初始化,并且直接操作硬件。 裸机程序一般采用少量汇编加C语言来编译(理论上C++可以了,但比较少)主要用来ARM汇编,硬件控制教学。硬件验证和驱动开发。 大型的程序bootloader,实时操作系统uCOS/Nclues严格讲也是裸机程序。 而且ARM的CPU的都有JTAG的在线硬件调试接口,通过JTAG硬件调试器,可以
[单片机]
三星6410裸机程序开发1:tiny6410开发板和裸机开发环境
目前,在帮别人开发一个短距离通信的无线接收模块,需求很简单,本来用简单的51单片机就可以搞定。可是人家偏偏指定要使用500MHz以上的CPU,而且采用裸奔的方式。 当时面对这种奇葩的要求,瞬间无语。幸好,对方允许使用友善之臂的tiny6410核心板。这样下来,开发这个收发器模块也就变得简单了。就权当自己练习吧! tiny6410开发板 硬件上,收发器模块使用tiny6410核心板(如下图所示),底板根据需求自行设计。这不仅可以缩短开发时间,降低开发难度,而且大大节省开发成本。 tiny6410核心板 由于硬件底板没有这么快设计出来,开发时间又短,因此考虑购买现成的6410开发板来开展前期的程序开发及调试工作。所以选择
[单片机]
三星6410<font color='red'>裸机</font>程序<font color='red'>开发</font>1:tiny6410<font color='red'>开发</font>板和<font color='red'>裸机</font><font color='red'>开发</font>环境
OK6410开发裸机DS18B20驱动
相信玩过51的童鞋应该都玩过DS18B20吧,虽然用在ARM11上面,但是操作还是一样,多了一点就是读写IO前需要切换IO方向,其实51在读取之前需要切换到高电平的,这个一般由编译器完成的, /************************************************************************************************************* * 文件名: ds18b20.c * 功能: S3C6410 DS18B20驱动 * 作者: cp1300@139.com * 创建时间: 2012年9月17日22:45 * 最后修改时间:
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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