2440裸机编程之十 触摸屏

发布者:清新自然最新更新时间:2019-11-09 来源: 51hei关键字:裸机编程  触摸屏 手机看文章 扫描二维码
随时随地手机看文章

触摸屏由于其体积小、轻便和接口简单的特点,成为一种在嵌入式系统中应用广泛的输
入设备。本实例首先介绍四线电阻式触摸屏的结构和工作原理,然后介绍S3C2440A 通过内
部集成的触摸屏控制寄存器的设置,来完成对触摸屏触摸位置坐标的读取。





典型触摸屏的工作组件一般由3 部分组成。两层透明的阻性导体层、两层
导体之间的隔离层和电极。阻性导体层选用阻性材料,如将铟锡氧化物(1TO)涂在衬底上构
成,或者上层衬底用塑料,下层衬底用玻璃。隔离层为粘性绝缘液体材料,如聚脂薄膜。电
极选用导电性能极好的材料(如银粉墨)构成,其导电性能大约为ITO 的1 000 倍。









工作原理:见下图
1.获取X坐标:X+和X-加上正负电压,X方向就会形成电势梯度网络;Y-接高阻,Y+接输入,一旦屏幕上某点被按下,绝缘液体被排开,上下两个导体层在此点导通,Y+获取此点在X方向上的电势,即此点的X坐标,通过ADC转换成数字量输入给系统。
同理
1.获取Y坐标:Y+和Y-加上正负电压,Y方向就会形成电势梯度网络;X-接高阻,X+接输入,一旦屏幕上某点被按下,绝缘液体被排开,上下两个导体层在此点导通,X+获取此点在Y方向上的电势,即此点的Y坐标,通过ADC转换成数字量输入给系统。
这样,通过ADC转换成数字量输入给系统。






这里做个试验,笔尖接触 触摸屏,然后串口打印坐标值。
注意X测量时,依据上述原理,XP接参考电平,XM接地,YP接ADC通道5,YM接高阻,上拉功能取消,这些都在寄存器中设置ADCTSC。
同理,Y测量时,YP接参考电平,YM接地,XP接ADC通道7,XM接高阻,上拉功能取消.
其他用到的是ADC相关的寄存器。
//********************************************************************

#define adc_frequency 2000000

U16 x_tsc,y_tsc;

void Main(void)
{     
    int i;
    ……硬件初始化……

Uart_Printf("n触摸屏中断+坐标提取实验n");

tsc_int_init();   //触摸屏中断初始化
tsc_init();    //触摸屏初始化
while(1);

}

void  tsc_int_init(void)  //触摸屏中断初始化
{
rSUBSRCPND |= 1<<9;     //INT_TC清0

rSRCPND |= 1<<31;     //INT_ADC清0
rINTPND |= 1<<31;     //INT_ADC清0

pISR_ADC = (U32)TSC_ISR;   //申请中断向量

rINTMSK = rINTMSK & ~(1<<31);  //禁止ADC的屏蔽

rINTSUBMSK = rINTSUBMSK & ~(1<<9); //禁止TSC的屏蔽

rADCTSC = 0x0d3 ;     //等待中断模式的特定设置
}


void   TSC_ISR(void) __irq    //触摸屏中断例程
{
rINTMSK |= 1<<31;     //ADC中断的屏蔽
rINTSUBMSK |=  1<<9 | 1<<10;  //TSC和ADC_S中断屏蔽

tsc_get();       //得到触点坐标
Uart_Printf("x=%d,y=%dn",x_tsc,y_tsc);

rSUBSRCPND |= 1<<9;     //INT_TC清0
rSRCPND |= 1<<31;     //INT_ADC清0
rINTPND |= 1<<31;     //INT_ADC清0
  
rINTMSK = rINTMSK & ~(1<<31);  //禁止ADC的屏蔽
rINTSUBMSK = rINTSUBMSK & ~(1<<9); //禁止TSC的屏蔽
rINTSUBMSK = rINTSUBMSK & ~(1<<10); //禁止ADC_S的屏蔽

}


void tsc_init(void)      //触摸屏初始化
{
rADCDLY= 0x5000;//必须要延时
rADCCON = (PCLK/adc_frequency - 1)<<6 | 1<<14 ;    //设置ADC频率,预分频有效
}

void tsc_get(void)
{
rADCCON = rADCCON & ~(7<<3) | 7<<3 ;     //选择XP通道
rADCTSC = (0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|1 ; //X测量模式:YM=Z, YP=AIN[5] ,XM=GND, XP=V, PULL_UP=DISABLE, NORMAL, X-position (ENABLE=GND/V)
    rADCCON|=0x1;             //启动ADC
while(rADCCON & 0x1);         //等待启动
    while(!(rADCCON & 0x8000));        //等待是否转换完毕
x_tsc = rADCDAT0&0x3FF;         //得到转换结果
  
rADCCON = rADCCON & ~(7<<3) | 5<<3 ;     //选择YP通道
rADCTSC = (1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|2 ; //Y测量模式:YM=GND, YP=V ,XM=Z, XP=AIN[7], PULL_UP=DISENBLE, NORMAL, Y-position (DISABLE=AIN/Z)
rADCCON|=0x1;             //启动ADC
while(rADCCON & 0x1);         //等待启动
    while(!(rADCCON & 0x8000));        //等待是否转换完毕
y_tsc = rADCDAT1&0x3FF;         //得到转换结果

tsc_int_init();      //触摸屏中断初始化
Delay(10);
while(!((rADCDAT0 & 0X8000) & (rADCDAT1 & 0X8000) ));//等待笔尖抬起
}


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


结果如图:







下面做个LCD和触摸屏TSC结合的实验,每当触摸屏某点被按下,在LCD的此点显示一个小正方形。
注意LCD的XY坐标与TSC的XY坐标不一样,需要转化,我研究了一下之间的关系,不是太精准,仅供参考:(x_lcd, y_lcd) = ( 1.0084*y_tsc - 150,-0.82*x_tsc +600,12345)。
//********************************************************************

#define adc_frequency 2000000



#define CLKVAL (6)  //VCLK=HCLK÷[(CLKVAL+1)×2]
#define PNRMODE (3)  //TFT LCD panel
#define BPPMODE (12) //16 bpp for TFT
#define ENVID (1)  //输出和控制 有效

#define VBPD (29)  //垂直同步信号后肩
#define LINEVAL (480) //垂直尺寸
#define VFPD (13)  //垂直同步信号前肩
#define VSPW (3)  //垂直同步信号脉宽

#define HBPD (40)  //水平同步信号后肩
#define HOZVAL (800) //水平尺寸
#define HFPD (40)  //水平同步信号前肩

#define HSPW (48)  //水平同步信号脉宽

#define FRM565 (1)  //565格式
#define PWREN (1)  //GPG供电使能(用于掉电模式)
#define BSWP (0)     //字节不交换:
//#define HWSWP (1)     //半字交换 16位用不到


#define OFFSIZE (0)  //若不用虚拟屏幕,则为0
#define PAGEWIDTH (HOZVAL)//虚拟屏幕的宽 单位半字 若不用虚拟屏幕,则和实际一致


U16 x_tsc,y_tsc;



void Main(void)
{     
    int i;
    ……硬件初始化……

Uart_Printf("n触摸屏和LCD综合实验nn");
Uart_Printf(" 触摸处将显一个方块nn");

tsc_int_init();   //触摸屏中断初始化
tsc_init();    //触摸屏初始化
lcd_init();    //LCD初始化

//test();

while(1);

}

void test(void)
{
int i;
for(i=50;i<480;i+=50)
  zhengfangxing(400,i,3000);
  
}

void  tsc_int_init(void)  //触摸屏中断初始化
{
rSUBSRCPND |= 1<<9;     //INT_TC清0

rSRCPND |= 1<<31;     //INT_ADC清0
rINTPND |= 1<<31;     //INT_ADC清0

pISR_ADC = (U32)TSC_ISR;   //申请中断向量

rINTMSK = rINTMSK & ~(1<<31);  //禁止ADC的屏蔽

rINTSUBMSK = rINTSUBMSK & ~(1<<9); //禁止TSC的屏蔽

rADCTSC = 0x0d3 ;     //等待中断模式的特定设置
}


void   TSC_ISR(void) __irq    //触摸屏中断例程
{
rINTMSK |= 1<<31;     //ADC中断的屏蔽
rINTSUBMSK |=  1<<9 | 1<<10;  //TSC和ADC_S中断屏蔽

tsc_get();       //得到触点坐标
Uart_Printf("x=%d,y=%dn",x_tsc,y_tsc);

zhengfangxing( 1.0084*y_tsc - 150,-0.82*x_tsc +600,12345);//实验获得转换关系,精度有待提高

rSUBSRCPND |= 1<<9;     //INT_TC清0
rSRCPND |= 1<<31;     //INT_ADC清0
rINTPND |= 1<<31;     //INT_ADC清0
  
rINTMSK = rINTMSK & ~(1<<31);  //禁止ADC的屏蔽
rINTSUBMSK = rINTSUBMSK & ~(1<<9); //禁止TSC的屏蔽
rINTSUBMSK = rINTSUBMSK & ~(1<<10); //禁止ADC_S的屏蔽

}


void tsc_init(void)      //触摸屏初始化
{
rADCDLY= 0x5000;//必须要延时
rADCCON = (PCLK/adc_frequency - 1)<<6 | 1<<14 ;    //设置ADC频率,预分频有效
}

void tsc_get(void)
{
rADCCON = rADCCON & ~(7<<3) | 7<<3 ;     //选择XP通道
rADCTSC = (0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|1 ; //X测量模式:YM=Z, YP=AIN[5] ,XM=GND, XP=V, PULL_UP=DISABLE, NORMAL, X-position (ENABLE=GND/V)
    rADCCON|=0x1;             //启动ADC
while(rADCCON & 0x1);         //等待启动
    while(!(rADCCON & 0x8000));        //等待是否转换完毕
x_tsc = rADCDAT0&0x3FF;         //得到转换结果
  
rADCCON = rADCCON & ~(7<<3) | 5<<3 ;     //选择YP通道
rADCTSC = (1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|2 ; //Y测量模式:YM=GND, YP=V ,XM=Z, XP=AIN[7], PULL_UP=DISENBLE, NORMAL, Y-position (DISABLE=AIN/Z)
rADCCON|=0x1;             //启动ADC
while(rADCCON & 0x1);         //等待启动
    while(!(rADCCON & 0x8000));        //等待是否转换完毕
y_tsc = rADCDAT1&0x3FF;         //得到转换结果

tsc_int_init();      //触摸屏中断初始化
Delay(10);
while(!((rADCDAT0 & 0X8000) & (rADCDAT1 & 0X8000) ));//等待笔尖抬起
}




void lcd_init(void)
{
rGPCCON = 0xAAAAAAAA;         //LCD功能
rGPDCON = 0xAAAAAAAA;         //LCD功能
rGPGCON = rGPGCON & ~(3<<8) | 3<<8 ;     //LCD电源功能

rLCDCON1 = rLCDCON1 & ~(0x3ff<<8) | CLKVAL<<8 ;   //LCD频率
rLCDCON1 = rLCDCON1 & ~(0x3<<5) | PNRMODE<<5 ;   //显示模式
rLCDCON1 = rLCDCON1 & ~(0xf<<1) | BPPMODE<<1 ;   //BPP模式(每个像素用几位表示)
rLCDCON1 = rLCDCON1 & ~(1) | 0 ;     //关闭输出

rLCDCON2 = rLCDCON2 & ~(0xff<<24) | VBPD<<24 ;   //与LCD属性一致
rLCDCON2 = rLCDCON2 & ~(0x3ff<<14) | (LINEVAL-1)<<14 ; //垂直尺寸
rLCDCON2 = rLCDCON2 & ~(0xff<<6) | VFPD<<6 ;   //与LCD属性一致
rLCDCON2 = rLCDCON2 & ~(0x3f) | VSPW ;     //与LCD属性一致

rLCDCON3 = rLCDCON3 & ~(0x7f<<19) | HBPD<<19 ;   //与LCD属性一致
rLCDCON3 = rLCDCON3 & ~(0x7ff<<8) | (HOZVAL-1)<<8 ;  //水平尺寸
rLCDCON3 = rLCDCON3 & ~(0xff) | HFPD ;     //与LCD属性一致

rLCDCON4 = rLCDCON4 & ~(0xff) | HSPW ;     //与LCD属性一致

rLCDCON5 = rLCDCON5 & ~(1<<11) | FRM565<<11 ;   //模式:565或5551
rLCDCON5 = rLCDCON5 & ~(1<<3) | PWREN<<3 ;    //供电引脚使能 ( GPG4 )
rLCDCON5 = rLCDCON5 & ~(1<<1) | BSWP ;     //字节是否交换


rLCDSADDR1 = rLCDSADDR1 & ~(0x1ff<<21) | ( ( (U32)pixel>>22 )&0x1ff )<<21 ;       //缓存区首地址高位[30:22]->rLCDSADDR1[29:21]
rLCDSADDR1 = rLCDSADDR1 & ~(0x1fffff) | ( (U32)pixel>>1 )&0x1fffff ;        //缓存区首地址低位[21:1]->rLCDSADDR1[20:0]

rLCDSADDR2 = rLCDSADDR2 & ~(0x1fffff) | ( ((U32)pixel+LINEVAL*HOZVAL*2)>>1 )&0x1fffff ;    //缓存区(尾地址+1)低位[21:1]->rLCDSADDR2[20:0]

rLCDSADDR3 = rLCDSADDR3 & ~(0x7ff<<11) | OFFSIZE<<11 ;            //虚拟屏幕偏移长度
rLCDSADDR3 = rLCDSADDR3 & ~(0x7ff) | PAGEWIDTH ;             //虚拟屏幕宽度

rLCDCON1 = rLCDCON1 & ~(1) | ENVID ;                //开启输出,这个要最后做,不然有问题
}

[1] [2]
关键字:裸机编程  触摸屏 引用地址:2440裸机编程之十 触摸屏

上一篇:2440裸机编程之十一 GPRS
下一篇:2440裸机编程之九 LCD液晶显示器

推荐阅读最新更新时间:2024-11-07 08:44

S3C2440 音频解码芯片WM8976声卡驱动移植、madplay测试
1. WM9876接口和工作原理 本节使用了JZ2440开发板移植WM9876驱动,其结构如下图所示,最后利用madplay工具测试音频文件。 IIS和控制接口; WM9876声卡是负责录音、播音、调节音量和声音合成等的一种多媒体板卡。包括两种接口:IIS接口(提供音频接收和发送)、控制接口(控制音量大小,使能各个输出通道等) 1)当我们播放声音时,将数字信号传入I2SDO脚,声卡便通过解码,产生模拟信号到喇叭/耳机; 2)当我们录音时,声卡便获取麦克风的模拟信号,编码出数字信号到I2SDI引脚上。 ----------- 接口说明 ---------------- ----------- 接口说明
[单片机]
S3C<font color='red'>2440</font> 音频解码芯片WM8976声卡驱动移植、madplay测试
Jlink烧写JZ2440的Nor Flash
一、需要Jlink烧写Nor Flash。 这只能在windows下操作。 a.开发板设置为Nor Flash启动,连接电脑,上电。 b.启动j-flash。J-flash操作如下: 在J-Flash里操作: 1.选择菜单“File - Open - Open Project…”,打开附件里的s3c2440.jflash。 图 打开S3C2440工程 2.选择菜单“Target - Connect” 图 连接开发板 3. 选择菜单“File - Open”,打开要烧写的二进制文件,比如u-boot.bin,并且在“Start address”里输入0。 图 打开bin文件 4. 选择菜单“
[单片机]
Jlink烧写JZ<font color='red'>2440</font>的Nor Flash
分大小屏版本 传锤子T3或9月开卖
    随着疑似锤子T3的系统截图的曝光,不少人都推测该机有可能会很快与我们见面。不过,根据业内人士@潘九堂在微博上说法,锤子新机已经有几款在路上,大屏小屏顶配标配全都有,再坚持几个月,新学期可以用上新锤子。因此,如果此次爆料的消息属实的话,则意味着锤子T3将在9月份正式开卖。 9月份开卖   有关锤子T3手机的 发布时间,过去业内人士@潘九堂便曾经在微博上披露称,锤子T3大约要3-5个月才能发布,所以外界普遍推测锤子T3至少最快也要到八月份才会与我们见 面,而如果新机进展不顺利的话,则有可能要到十月份才能登场。而现在,@潘九堂则再次爆料称:“你锤已经有几发在路上,大屏小屏顶配标配全都有,再坚持几 个月,新学期可以用上新锤子”。
[手机便携]
浅谈S3C2440的中断寄存器及中断过程
S3C2440一共有60个中断源,其中有15个子中断源,它们与SUBSRCPND寄存器中的每一位相对应,其他45个中断源与SRCPND中的每一位相对应。要注意的是EINT4~7对应的是同一位SRCPND ,而EINT8~23对应的也是SRCPND 一位。 1 S3C2440的中断寄存器 中断分两大类:外部中断和内部中断。 1.1 外部中断寄存器 24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体可参考datesheet数据手册。 寄存器: EX
[单片机]
浅谈S3C<font color='red'>2440</font>的中断寄存器及中断过程
基于Internet的触摸屏数据库远程监控系统
引言     网络通信技术已经改变了人们的生活,同时也正在改变工业自动化的方方面面。因此,中国 电器 工业协会通用低压 电器 分会在《低压电器新产品发展总体思路》中明确提出:“全面实现低压电器主要产品网络化、智能化、可通信化。要求我国第3代低压电器主要产品、第4代低压电器,全部实现网络化、智能化、可通信,能与多种 现场总线 连接,也可直接与工业以太网连接。”鉴于此,近年来,基于 现场总线 、以太网和直联网(Internel)技术的可编程控制器(Programmable Logic Condoner, PLC )、触摸屏(Human Machlne Interface,HMI)、变额器,智能开戈等各类智能低压电器得到了民足发展,在智
[嵌入式]
iSuppli:未来触摸屏技术呈流行趋势
【eNet硅谷动力消息】据国外媒体报道,市场调研公司iSuppli最新报告称,由于受苹果iPhone手机流行的影响,触摸屏技术已经成为手机行业的热门话题。   调查公司预期,今年全球触摸屏的发货量将达到3.41亿个,销售收入达到34亿美元,到2012年全球触摸屏发货量有望增长二倍。2013年之   前触摸屏的销售量有望达到8.33亿个,年复合增长率为19.5%;销售收入达到64亿美元,年复合增长率为13.7%。   2007年,在所有触摸屏产品中,电容性触摸屏增长最快,发货量达到1050万个,销售收入为2.22亿美元。调查公司预期电容性触摸屏将仍   然保持高增长率,2013年之前的发货量将达到1.24亿个,销售收入为
[工业控制]
基于S3C2440的测试系统数字稳压电源设计
0 引言 直流稳压电源是一种比较常见的电子设备,一直被广泛地应用在电子电路、实验教学、科学研究等诸多领域。近年来,嵌入式技术发展极为迅速,出现了以单片机、嵌入式ARM为核心的高集成度处理器,并在自动化、通信等领域得到了广泛应用。电源行业也开始采用内部集成资源丰富的嵌入式控制器来实现数字稳压电源的控制系统。数字稳压电源是用脉宽调制波(PWM)来控制MOS管等开关器件的开通和关闭,从而实现电压电流的稳定输出。数字稳压电源还具备自诊断功能,能实现过压过流保护、故障警告等。 相比之前的模拟电源,数字稳压电源大大减少了在模拟电源中常见的误差、老化、温度漂移、非线性不易补偿等诸多问题,提高了电源的灵活性和适应性。将SAMSUNG公司的嵌
[单片机]
基于S3C<font color='red'>2440</font>的测试系统数字稳压电源设计
按钮从此从汽车上消失?看智能汽车仪表盘都能做些啥
据国外媒体报道,现在是时候宣布按钮的死亡了吗? 如果你到近年来的任何概念车里看一看(如BMW i型、讴歌Precision以及大众T-Cross Breeze),就会发现大片的仪表盘取代传统按钮或者旋钮。现在工程师们正在开始采用这一设计进行车型生产。     根据汽车行业研究公司IHS Automotive的一项研究,在未来五年内,方向盘控制、 语音识别 、 触摸屏 和姿态控制的全球销量将大幅跃升。 以下是IHS公司按类别对其年销售额增量的预测: 方向盘,上升近11% 语音识别,上涨12% 触摸屏,增长13% 姿态控制,上涨35% 传统控制按钮,上涨2%     据IHS分析师M
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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