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

在人机交互系统中,键盘、触摸屏等输入设备是一个不可或缺的部分。对于手机、平板这些消费类电子而言,触摸屏以其非常良好的用户体验得到了广泛的应用。笔者此处就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:nt"

"ldr r1, =100000nt" // Arm clock为400M

"1:nt"

"subs r1, r1, #1nt" // 一个Arm clock

"bne 1bnt" // 跳转会清流水线,3个Arm clock

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

"bne 0bnt"

: : "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


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

IIC是Philips推出的芯片间串行传输总线,它以二根连线实现完善的全双工同步数据传送,可以极方便地构成多机系统和外围器件扩展系统。由于其接口简单灵活,很多外围器件均提供了IIC接口,如手机、平板常用的重力传感器

关键字: s3c2416 裸机开发 iic驱动

现在主要讲解一下在GCC移植UCGUI,Makefile工程如何加入目录,加入源码,c标准库,编译选项的设置。笔者的Makefile模板提取自uboot,工程中加入目录,加入源码都是很简单的,详细的介绍请参考前面章节”...

关键字: gcc s3c2416 ucgui 移植 裸机开发

jpeg格式是一种针对相片影像而广泛使用的一种失真压缩标准,其压缩技术十分先进,用有损压缩方式去除冗余的图像数据,在获得极高压缩率的同时,能展现十分丰富生动的图像,能用最少的磁盘空间得到较好的图像品质。由

关键字: s3c2416 移植 裸机开发 libjpeg

在消费电子产品中,往往都会用到音频系统来播放音乐、进行通话等多媒体应用,此外,对于一些需语音提示的产品,音频部分都是不可或缺的功能。笔者此处就s3c2416的音频驱动实现作一个简单的介绍。1. IIS音频总线s3c24

关键字: s3c2416 裸机开发 音频驱动

S3C2416裸机开发系列十八_音频驱动实现(2)标签:WM8960IIS音频驱动s3c2416裸机开发2014-06-10 09:50853人阅读评论(0)收藏举报分类:s3c2416裸机开发(24)版权声明:本文为博...

关键字: s3c2416 裸机开发 音频驱动

很多的嵌入式系统都需要人机交互,对于输出设备,LCD以其显示质量高、画面效果好等优点得到了极其广泛的应用。s3c2416包含了一个LCD控制器,笔者此处就s3c2416的LCD应用作一个简单的介绍。1、LCD控制器概述1...

关键字: s3c2416 裸机开发 rgb屏 驱动显示

在嵌入式设计中,由于Nand Flash具有大容量,擦写次数高,接口简单等优点,常用作固化存储器。S3C2416支持Nand启动,因此Nand存储器可以直接保存固化代码以及其它的数据。笔者在此简单的介绍Nand flas...

关键字: nand驱动 s3c2416 裸机开发 nand启动

笔者前面章节简单介绍了s3c2416启动代码的实现过程,启动代码就是用来处理cpu体系结构中一些底层内容,一个功能强大的启动代码是可以当作bootloader(如uboot)来用的。有了启动代码,用户就可以专注于用c来作...

关键字: mdk s3c2416 启动代码 裸机开发

启动代码是处理器上电复位后最先运行的一段代码。主要是用来把处理器初始化到一个确定的状态,为c运行环境作好准备。如设置异常向量表,初始化系统时钟,初始化外部内存,把用户代码拷贝到外部内存,初始化栈,清0全

关键字: s3c2416 启动代码 流水灯 裸机开发

S3C2416裸机开发系列十九_Fatfs下播放录音wav音频文件标签:wavfatfs音频播放s3c2416sd驱动2014-06-11 09:551938人阅读评论(0)收藏举报分类:s3c2416裸机开发(24)版...

关键字: s3c2416 裸机开发 播放录音 音频文件
关闭
关闭