当前位置:首页 > 单片机 > 单片机
[导读]实验目的:通过串口显示输入的电压值及采集按下触摸屏的(x,y)坐标值借此掌握S3C2410的ADC和触摸屏的使用。实验环境及说明:恒颐S3C2410开发板H2410。H24X0E扩展板上AIN0~AIN1输出悬空,通过外接可变电阻电路采样电压

实验目的:通过串口显示输入的电压值及采集按下触摸屏的(x,y)坐标值借此掌握S3C2410的ADC和触摸屏的使用。

实验环境及说明:恒颐S3C2410开发板H2410。H24X0E扩展板上AIN0~AIN1输出悬空,通过外接可变电阻电路采样电压值;外接的触摸屏接口实现扩展触摸屏完成相应操作本实验基于夏普3.5英寸LQ035Q7DB02。

实 验思路:开发板上电启动后,自动将NandFlash开始的4K数据复制到SRAM中,然后跳转到0地址开始执行。关闭看门狗、初始化SDRAM及 NandFlash控制器、设置MPLL来改变FCLK、HCLK、PCLK的值,设置堆栈,复制4KB后的16KB数据到SDRAM,之后进入main 函数中进行ADC及触摸屏的测试。

知识掌握:ADC(模数转换器)和Touch Screen(触摸屏)。
★S3C2410 ADC和TouchScreen概述:S3C2410内置1个8信道的10bit模数转换器,该ADC能以500KSPS的采样速率将外部的模拟信号转换 为10位的二进制数字量。同时ADC部分能与CPU的触摸屏控制器协同工作,完成对触摸屏绝对地址的测量。ADC和TouchScreen共用一个A/D 转换器,ADC可同时采样8路模拟输入信号,使用触摸屏时,AIN[7]、AIN[5]被用来测量XP/YP的电平,剩余的六个引脚可用来做一般ADC输 入。2410ADC和触摸屏功能框图如下:

★ADC和TouchScreen控制器的工作模式:
●ADC普通转换模式(Normal Converson Mode)---普通转换模式(AUTO_PST=0,XY_PST=0)是用来进行一般的ADC转换之用的,例如通过ADC测量电池电压等等。
● 独立X/Y轴坐标转换模式(Separate X/Y Position Conversion Mode)---独立X/Y轴坐标转换模式其实包含了X轴模式和Y轴模式2种模式。 首先进行X轴的坐标转换(AUTO_PST=0,XY_PST=1),X轴的转换资料会写到ADCDAT0寄存器的XPDAT中,等待转换完成后,触摸屏 控制器会产生相应的中断。 然后进行Y轴的坐标转换(AUTO_PST=0,XY_PST=2),Y轴的转换资料会写到ADCDAT1寄存器的YPDAT中,等待转换完成后,触摸屏 控制器会产生相应的中断。
●自动X/Y轴坐标转换模式(Auto X/Y Position Conversion Mode)---自动X/Y轴坐标转换模式(AUTO_PST=1,XY_PST=0)将会自动地进行X轴和Y轴的转换操作,随后产生相应的中断。
● 中断等待模式(Wait for InterruptMode)---在系统等待"Pen Down",即触摸屏按下的时候,其实是处于中断等待模式。一旦被按下,实时产生"INT_TC"中断信号。每次发生此中断都,X轴和Y轴坐标转换资料都 可以从相应的资料寄存器中读出。
●闲置模式(Standby Mode)---在该模式下转换资料寄存器中的值都被保留为上次转换时的资料。
★ADC两种启动方式:以手工启动和读结果时就自动地启动下一次转换;以查询状态位和发中断方式获知转换是否结束。ADC的操作只涉及3个寄存器:
●ADCCON--- 设置ADCCON寄存器,选择输入信号通道,设置A/D转换器的时钟(A/D时钟=PCLK/(PRSCVL+1))。A/D时钟最大为2.5MHz,且 应小于PCLK的1/5;设置ADCCON寄存器,启动转换(设置READ_START位则读转换数据(读ADCDAT0寄存器)时即启动下一次转换;否 则可通过设置ENABLE_START位来启动A/D转换);ADCCON各位含义(ENABLE_START---置1启动ADC转换,置0无操作; RESR_START---置1允许读操作启动ADC转换,置0禁止读操作启动ADC转换; STDBM---置1将ADC置为闲置状态(模式),置0将ADC置为正常操作状态;SEL_MUX---选择需要进行转换的ADC信道; PRSCV---ADC转换时钟预分频参数;PRSCEN---ADC转换时钟使能; ECFLG---ADC转换完成标志位(只读)。为1ADC转换结束,为0ADC转换进行中)。
●ADCTSC---设置ADCTSC寄存器,使 用设为普通转换模式,不使用触摸屏功能;ADCTSC各位含义(XY_PST---对X/Y轴手动测量模式进行选择;AUTO_PST---X/Y轴的自 动转换模式使能位;PULL_UP---XP端的上拉电阻使能位;XP_SEN---设置nXPON输出状态;XM_SEN---设置XMON输出状 态;YP_SEN---设置nYPON输出状态;YM_SEN---设置YMON输出状态)。
●ADCDAT0---完成ADC转换后,读取 ADCDAT0寄存器获得数值(如果使用查询方式,则可不断读取ADCCON寄存器的ECFLG位来确定是否转换结束;否则可以使用INT_ADC中断, 发生INT_ADC中断时表示转换结束);ADCDAT0各位含义(XPDATA---X轴转换资料寄存器;XY_PST---选择X/Y轴自动转换模 式;AUTO_PST---X/Y轴自动转换使能位;UPDOWN---选择中断等待模式的类型。为0按下产生中断,为1释放产生中断)。
★触摸屏操作还涉及到以下两个寄存器:
●ADCDLY---ADC转换周期等待定时器。
●ADCDAT1---同ADCDAT0。

关键代码解析:
★head.S头文件来初始化,设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
.equMEM_CTL_BASE, 0x48000000
.text
.global _start
_start:
@中断向量表处理函数,只给出复位和普通中断模式的处理函数,其它异常未使用
b Reset
...
b HandleIRQ
@0x1c: 快中断模式的向量地址
HandleFIQ:
b HandleFIQ

Reset: @复位处理
bldisable_watch_dog@关门喂狗
blmem_control_setup @设置存储控制器
ldr sp, =4096 @设置栈指针,以下C函数调用前需要设好栈
bl init_clock@设置MPLL,改变FCLK、HCLK、PCLK
bl init_nand@初始化NandFlash
@将NandFlash中地址4096开始的代码复制到SDRAM中
ldrr0, =0x30000000@目标地址=0x30000000,SDRAM起始地址
movr1, #4096@源地址=4096,连接时代码在4096开始处
movr2, #16*1024@复制长度=16K,对于本实验足够
blread_nand @调用C函数read_nand
blclean_bss@清除bss段
msr cpsr_c, #0xd2 @进入中断模式
ldr sp, =0x31000000 @设置中断模式栈指针
msr cpsr_c, #0xdf@进入系统模式
ldr sp, =0x34000000 @设置系统模式栈指针
ldr lr, =ret_initirq @设置返回地址
ldr pc, =init_irq@初始化中断
ret_initirq:
msr cpsr_c, #0x5f @设置I-bit=0,开IRQ中断
ldr lr, =halt_loop@设置返回地址
ldr pc, =main@调用main函数
halt_loop:
b halt_loop
★main.c文件实现实现串口选择ADC和TouchScreen操作,主要代码:
#include
#include
#include
int main()
{
char c;
init_uart0();//波特率115200,8N1(8个数据位,无校验位,1个停止位)
while (1)
{
printf("rn~~~~~~ Test ADC and Touch Screem ~~~~~~rn");
printf("[A] Test ADCnr");
printf("[T] Test Touch Screemnr");
printf("Enter your selection: ");
c = getc();
putc(c);
switch (c)
{
case 'a':
case 'A':
{
Test_Adc();//操作ADC
break;
}
case 't':
case 'T':
{
Test_Ts();//操作TouchScreen
break;
...
}
★adc_ts.c ADC和触摸屏的测试函数,主要代码:
...
/*
* 使用查询方式读取A/D转换值。
* 输入参数ch: 模拟信号通道,取值为0~7
*/
static int ReadAdc(int ch)
{
//选择模拟通道,使能预分频功能,设置A/D转换器的时钟 = PCLK/(49+1)
ADCCON = PRESCALE_EN | PRSCVL(49) | ADC_INPUT(ch);
//清除位[2],设为普通转换模式
ADCTSC &= ~(1<<2);
//设置位[0]为1,启动A/D转换
ADCCON |= ADC_START;
//当A/D转换真正开始时,位[0]会自动清0
while (ADCCON & ADC_START);
//检测位[15],当它为1时表示转换结束
while (!(ADCCON & ADC_ENDCVT));
//读取数据
return (ADCDAT0 & 0x3ff);
}
/*
* 测试ADC。通过A/D转换,测量可变电阻器的电压值
*/
void Test_Adc(void)
{
int vol0, vol1;
printf("Measuring the voltage of AIN0 and AIN1, press any key to exitnr");
while (!awaitkey(0))// 串口无输入,则不断测试
{
vol0 = (ReadAdc(0)*3)/1024;// 计算电压值
vol1 = (ReadAdc(1)*3)/1024;// 计算电压值
printf("AIN0 = %dAIN1 = %dr", vol0,vol1);
}
printf("n");
}
static void Isr_Tc(void)
{
if (ADCDAT0 & 0x8000)//ADCDAT0[15]为1表示触摸屏被松开
{
printf("rnStylus Up!!nr");
//wait_down_int();//进入"等待中断模式",等待触摸屏被按下
}
else
{
printf("rnStylus Down: ");
mode_auto_xy();//进入自动(连续)X/Y轴坐标转换模式
ADCCON |= ADC_START;//设置位[0]为1,启动A/D转换
}
// 清INT_TC中断
...
}
static void Isr_Adc(void)
{
printf("xdata = %4d, ydata = %4drn",(int)(ADCDAT0 & 0x3ff),(int)(ADCDAT1 & 0x3ff));
//wait_down_int();//进入"等待中断模式",等待触摸屏被松开
//清INT_ADC中断
...
}
void AdcTsIntHandle(void)
{
if (SUBSRCPND & BIT_SUB_TC)
Isr_Tc();
if (SUBSRCPND & BIT_SUB_ADC)
Isr_Adc();
}
/*
*测试触摸屏,打印触点坐标
*/
void Test_Ts(void)
{
isr_handle_array[ISR_ADC_OFT] = AdcTsIntHandle;// 设置ADC中断服务程序
INTMSK &= ~BIT_ADC;//开启ADC总中断
INTSUBMSK &= ~BIT_SUB_TC;//开启INT_TC中断,即触摸屏被按下或松开时产生中断
INTSUBMSK &= ~BIT_SUB_ADC;//开启INT_ADC中断,即A/D转换结束时产生中断
//使能预分频功能,设置A/D转换器的时钟 = PCLK/(49+1)
ADCCON = PRESCALE_EN | PRSCVL(49);
/*
*采样延时时间 = (1/3.6864M)*50000 = 13.56ms
*即按下触摸屏后,再过13.56ms才采样
*/
ADCDLY = 50000;
wait_down_int();/*进入“等待中断模式”,等待触摸屏被按下*/
printf("Touch the screem to test, press any key to exit!nr");
getc();
// 屏蔽ADC中断
...
}

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

随着汽车电子技术的飞速发展,汽车电子设备触摸屏已经成为汽车信息娱乐系统、导航系统、车载通信系统等设备的核心组成部分。然而,复杂的电磁环境对汽车电子设备触摸屏的电磁兼容性(EMC)提出了更高的要求。为了使汽车电子设备触摸屏...

关键字: 汽车电子 触摸屏 电子设备

触摸屏显示器是每个现代支付系统和销售点(POS)终端的重要组成部分。触摸屏极大地提升了支付终端的美观度,同时提供了一种对手机、平板电脑和触摸屏笔记本电脑的用户来说都十分熟悉的现代化控制方式。尽管触摸屏拥有这些优点,但也增...

关键字: 触摸屏 POS显示器

现今我们常用的触摸屏可分为电阻式触摸屏、表面电容式触摸屏、红外式触摸屏、表面声波式触摸屏4 类。

关键字: 电阻 触摸屏 红外式触摸屏

电阻屏和电容屏的区别在原理、抗损能力、像素精度等方面

关键字: 电容 触摸屏 像素精度

生活中越来越多的事物开始需要用触摸屏操作,家电、车载导航等等。在日常生活中,触摸屏最常见的为电容式触摸屏,那么在操作它们的时候有什么注意事项呢。

关键字: 电容 触摸屏 车载导航

电容触摸技术被应用在广泛的电子产品从智能手机,冰箱和汽车。在许多应用中,电容式触摸传感器提供输入到一个专用的控制器芯片。微控制器直接参与当控制器集成为一个外围设备的MCU模具。

关键字: 电容 触摸屏 智能手机

触摸屏越来越多的应用于国民生产的各个领域用来实现手写输入、查询、控制等,这些触摸屏多被装在显示器(CRT)或液晶(LCD)上,触摸屏的种类也越来越多。

关键字: 电子器件 电阻 触摸屏

触摸屏通过感应人体电容来进行触摸位置的检测。具体来说,现代常见的电容式触摸屏采用了电容感应技术。触摸屏表面覆盖着一层透明的导电薄膜或玻璃,在触摸屏上进行触摸时,人体的电荷会改变触摸区域的电容量。

关键字: 触摸屏 校准算法 导电薄膜

电阻触摸屏的屏体部分是一块贴在显示器表面的多层复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透明的导电层(ITO,氧化铟),上面再盖有一层外表面硬化处理、光滑防刮的塑料层。

关键字: 触摸屏 ITO 氧化铟

电阻式触摸屏是一种传感器,它将矩形区域中触摸点(X,Y)的物理位置转换为代表X坐标和Y坐标的电压。很多LCD模块都采用了电阻式触摸屏,这种屏幕可以用四线、五线、七线或八线来产生屏幕偏置电压,同时读回触摸点的电压。

关键字: 触摸屏 触摸点 电压
关闭
关闭