S3C2416裸機(jī)開發(fā)系列十三_電容屏驅(qū)動(dòng)實(shí)現(xiàn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
在人機(jī)交互系統(tǒng)中,鍵盤、觸摸屏等輸入設(shè)備是一個(gè)不可或缺的部分。對(duì)于手機(jī)、平板這些消費(fèi)類電子而言,觸摸屏以其非常良好的用戶體驗(yàn)得到了廣泛的應(yīng)用。筆者此處就s3c2416 IIC接口電容屏的應(yīng)用作一個(gè)簡(jiǎn)單的介紹。
1. 觸摸屏概述目前嵌入式系統(tǒng)中常用的觸摸屏有兩種,一種是電阻式觸摸屏,另一種是電容式觸摸屏。電阻屏需要一定的壓力使屏幕各層發(fā)生接觸,兩層導(dǎo)電層在接觸點(diǎn)的位置電阻會(huì)發(fā)生變化,在X、Y兩個(gè)方向產(chǎn)生模擬的分壓值,這個(gè)分壓值通過觸摸屏控制器模數(shù)轉(zhuǎn)換,得到觸摸點(diǎn)的坐標(biāo)位置。因此,電阻屏只要有壓力接觸,就會(huì)有反應(yīng),也正因?yàn)殡娮杵列枰欢ǖ膲毫?,造成電阻屏表面容易磨損,敏感度較差,實(shí)現(xiàn)目前手機(jī)滑動(dòng)解鎖的功能是比較困難的。由于其實(shí)現(xiàn)機(jī)制,電阻屏只能夠單點(diǎn)觸摸,對(duì)環(huán)境使用要求不高,可以實(shí)現(xiàn)較精確位置的觸控。
電容屏在工作面四個(gè)角上引出電極,在導(dǎo)體層內(nèi)形成一個(gè)低電壓交流電場(chǎng)。用戶觸摸屏?xí)r,由于人體電場(chǎng)、用戶、觸摸屏表面形成一個(gè)耦合電容,對(duì)于高頻電流來說,電荷會(huì)通過這個(gè)耦合電容流向大地,這個(gè)很小的電流分從觸摸屏的四角上的電極中流出,并且流經(jīng)這四個(gè)電極的電流與手指到四角的距離成正比,控制器通過對(duì)這四個(gè)電流比例的精確計(jì)算,得出觸摸點(diǎn)的位置。因此,電容屏只對(duì)帶電物體的觸控具有反應(yīng),如牙簽、指甲、帶手套等是無法操作電容屏的。由于電容屏基于電荷進(jìn)行工作,因此只需手指輕觸即能得到輸入反應(yīng),敏感度高。但同時(shí)對(duì)周圍環(huán)境要求高,過于潮濕的環(huán)境(如浴室),有水滴在觸摸屏上等都可能造成電容屏無法正常工作。電容相對(duì)精度較低,無法通過手指觸控精細(xì)位置。此外,電容屏可以支持多點(diǎn)觸摸,幾乎成為手機(jī)、平板觸摸屏的首選,用以支持多點(diǎn)觸摸進(jìn)行圖片放大、旋轉(zhuǎn)等功能。
2. 電容屏驅(qū)動(dòng)實(shí)現(xiàn)筆者使用的電容屏驅(qū)動(dòng)IC為focaltech的ft5206,這款芯片可以最多支持真實(shí)5點(diǎn),即最多可同時(shí)檢測(cè)到5個(gè)點(diǎn)同時(shí)觸摸,接口支持IIC與SPI。
驅(qū)動(dòng)芯片檢測(cè)到一個(gè)有效的觸摸時(shí),將產(chǎn)生一個(gè)中斷控制信號(hào)。有兩種模式的中斷信號(hào)輸出,分別為查詢模式和觸發(fā)模式。查詢模式適用于只支持單點(diǎn)觸摸處理的軟件應(yīng)用中,除手機(jī)、平板所用的Android、ios外,大部分操作系統(tǒng)(或圖形系統(tǒng))并不很好地支持多點(diǎn)觸摸。采用這種有觸摸時(shí),中斷信號(hào)線拉低,無觸摸時(shí),中斷信號(hào)線拉高的模式將極好地應(yīng)用到這些軟件中。觸發(fā)模式就是在有觸摸時(shí),驅(qū)動(dòng)芯片會(huì)以一定頻率產(chǎn)生中斷信號(hào),以上報(bào)觸摸點(diǎn)的坐標(biāo)位置,通常這個(gè)上報(bào)頻率為100HZ左右(驅(qū)動(dòng)芯片固化),上報(bào)頻率過低可能會(huì)造成掉點(diǎn)。這樣可以保證識(shí)別多個(gè)點(diǎn)的觸摸。目前,主流手機(jī)、平板均是這種工作方式獲得多點(diǎn)觸摸的坐標(biāo)位置的。
筆者的電容屏模組采用的是IIC接口,因此,s3c2416電容屏驅(qū)動(dòng)實(shí)現(xiàn)需要以上一章節(jié)IIC驅(qū)動(dòng)為基礎(chǔ),在電容屏測(cè)試代碼中給出了5點(diǎn)觸摸畫布的實(shí)例,可以用5個(gè)指頭同時(shí)在畫布上作圖。本章節(jié)觸摸屏模塊代碼測(cè)試需要前面章節(jié)的啟動(dòng)代碼、IIC接口模塊、RGB屏驅(qū)動(dòng)模塊支持。
tp_ft5206.c模塊實(shí)現(xiàn)如下:
#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); // 清中斷標(biāo)志
TP_Press = 1; // 指示觸摸屏發(fā)生了按下
}
rSRCPND1 |= (1 << INT_EINT8_15);//Clear pending bit
rINTPND1 |= (1 << INT_EINT8_15);
}
static void Delay_ms(unsigned int nCount)
{
//延時(shí)1ms,共延時(shí)nCount(R0) ms
__asm__ __volatile__ (
"0:nt"
"ldr r1, =100000nt" // Arm clock為400M
"1:nt"
"subs r1, r1, #1nt" // 一個(gè)Arm clock
"bne 1bnt" // 跳轉(zhuǎn)會(huì)清流水線,3個(gè)Arm clock
"subs %0, %0, #1nt" // 調(diào)用者確保nCount不為0
"bne 0bnt"
: : "r"(nCount):"r1"
);
}
// 向電容屏內(nèi)部地址WriteAddr連續(xù)寫入Length字節(jié)數(shù)據(jù),數(shù)據(jù)位置在pData中
intTP_WriteBytes(unsigned char WriteAddr, unsigned char *pData,
int Length)
{
// 調(diào)用IIC寫,對(duì)電容屏內(nèi)部某一地址進(jìn)行連續(xù)寫
return IIC_WriteBytes(TP_SlaveAddr,WriteAddr, pData, Length);
}
// 向電容屏內(nèi)部地址ReadAddr連續(xù)讀入Length字節(jié)數(shù)據(jù),數(shù)據(jù)保存在pData中
intTP_ReadBytes(unsigned char ReadAddr, unsigned char *pData,
int Length)
{
// 調(diào)用IIC接口讀,對(duì)電容屏內(nèi)部某一地址進(jìn)行連續(xù)讀
return IIC_ReadBytes(TP_SlaveAddr, ReadAddr,pData, Length);
}
void TP_Reset()
{
rGPFDAT &= ~(1 << 5); // 拉低復(fù)位線
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作為復(fù)位控制信號(hào)
rGPFUDP |= (0x2 << 10); // TP_RST GPF5上拉
rGPFCON &= ~(0x3 << 10);
rGPFCON |= (0x1 << 10); // GPF5配置成輸出
TP_Reset(); //TP復(fù)位
// TP外部中斷入口函數(shù)加入到向量表
IRQ_Register(INT_EINT8_15, TP_EINT8_15_IRQ);
rEXTINT1 &= ~(0x7 << 16);
rEXTINT1 |= (0x2 << 16); // EINT12下降沿觸發(fā)
rINTMOD1 &= ~(1 << INT_EINT8_15);// EINT8_15 IRQ
rINTMSK1 &= ~(1 << INT_EINT8_15);// EINT8_15 開啟中斷
rEINTMASK &= ~(1 << 12); // EINT12使能中斷
}
模塊的頭文件內(nèi)容如下:
#ifndef__TP_FT5206_H__
#define__TP_FT5206_H__
#ifdef__cplusplus
extern"C" {
#endif
// TP IIC的7位從機(jī)地址
#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__*/
五指同時(shí)觸摸畫線效果:
3. 附錄TouchPanel_gcc.rar,五點(diǎn)觸摸畫線電容屏GCC測(cè)試工程
http://pan.baidu.com/s/1i37NU2x