




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
触摸屏触摸屏实验1 实验目的1了解触摸屏基本概念与原理。2理解触摸屏与lcd的密切配合。3编程实现对触摸屏的控制。2 实验内容q 编程实现触摸屏坐标到lcd坐标的校准q 编程实现触摸屏坐标采集以及lcd坐标的计算3 预备知识q 了解ads集成开发环境的基本功能q 学习触摸屏的原理q 了解触摸屏与显示屏的坐标转换q 熟悉2410,44b0和外部器件的spi通信方式。4 实验设备q uptech-2410s教学实验箱q ads仿真器和ads ide集成开发环境 q 串口连接线5 基础知识6触摸屏原理 触摸屏按其工作原理的不同分为表面声波屏、电容屏、电阻屏和红外屏几种。常见的又数电阻触摸屏。如下图所示,电阻触摸屏的屏体部分是一块与显示器表面非常配合的多层复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透明的导电层,上面再盖有一层外表面硬化处理、光滑防刮的塑料层,它的内表面也涂有一层透明导电层,在两层导电层之间有许多细小(小于千分之一英寸)的透明隔离点把它们隔开绝缘。 如图3-21所示,当手指或笔触摸屏幕时(图c),平常相互绝缘的两层导电层就在触摸点位置有了一个接触,因其中一面导电层(顶层)接通x轴方向的5v均匀电压场(图a),使得检测层(底层)的电压由零变为非零,控制器侦测到这个接通后,进行a/d转换,并将得到的电压值与5v相比即可得触摸点的x轴坐标为(原点在靠近接地点的那端): xi=lxvi / v(即分压原理) 同理得出y轴的坐标,这就是所有电阻触摸屏共同的最基本原理。 2触摸屏与2410或者44b0的接口方式 1)对自带触摸屏控制器的芯片如s3c2410,可以直接将相关的引脚设置为触摸屏功能引脚,和触摸屏直接相连。由2410自带的触摸屏控制器实现对触摸点坐标的采集。 2)外接a/d接口芯片的方式,如实验箱2410和3000都是采取的这种方式,外接一个a/d转换的芯片,将触摸屏相关引脚和a/d转换芯片引脚链接,由2410或3000通过spi等通信方式对a/d转换芯片发送控制命令,读取a/d转换的数据即触摸屏的按下的坐标。 3触摸屏的控制 本系统触摸屏的控制是使用的fm7843芯片。fm7843是4线电阻触摸屏转换接口芯片。它是一款具有同步串行接口的12位取样模数转换器。在125khz吞吐速率和2.7v电压下的功耗为750w,而在关闭模式下的功耗仅为0.5w。因此,fm7843以其低功耗和高速率等特性,被广泛应用在采用电池供电的小型手持设备上。fm7843采用ssop-16引脚封装形式,温度范围是-4085。为了完成一次电极电压切换和a/d转换,需要先通过spi接口往fm 7843发送控制字,转换完成后再通过串口读出电压转换值。标准的一次转换需要24个时钟周期。由于spi接口支持双向同时进行传送,并且在一次读数与下一次发控制字之间可以重叠,所以转换速率可以提高到每次16个时钟周期。如果条件允许,cpu可以产生15个clk的话(比如fpgas和asics),转换速率还可以提高到每次15个时钟周期。 fm 7843通过同步串口与arm通讯,可通过spisend函数(spi.c)向fm 7843发送数据(控制字);通过sendreaddata函数(spi.h)从fm 7843读出数据。将g端口的第12位(enint5)置0和1,可以打开、关闭fm7843。通过外部中断5可以判断是否有触摸动作,查询方式通过宏tchscr_ispennotdown()(main.c)判断是否有触摸动作。 5触摸屏与显示器的配合 fm 7843送回控制器的x与y值仅是对当前触摸点的电压值的a/d转换值,它不具有实用价值。这个值的大小不但与触摸屏的分辨率有关,而且也与触摸屏与lcd贴合的情况有关。而且,lcd分辨率与触摸屏的分辨率一般来说是不一样,坐标也不一样,因此,如果想得到体现lcd坐标的触摸屏位置,还需要在程序中进行转换。转换公式如下: x=(x-tchscr_xmin)*lcdwidth/(tchscr_xmax-tchscr_xmin) y=(y-tchscr_ymin)*lcdheight/(tchscr_ymax-tchscr_ymin) 其中,tchscr_xmax、tchscr_xmin、tchscr_ymax和tchscr_ymin是触摸屏返回电压值x、y轴的范围,lcdwidth、lcdheight是液晶屏的宽度与高度。编程步骤: 1、目标板初始化(可选,因为实验箱自带的初始化程序已设置) 1)设置目标板时钟(在bootloader里已经初始化了) 2)初始化串口0 2、触摸屏初始化(请参考手册中gpio和spi或sio相关寄存器的配置) 1)设置与触摸屏功能相关的gpio口功能为触摸屏功能(g12和f5) 2)配置与spi(2410)或sio(44b0)功能相关的gpio口(e1113)功能为spi或sio功能。(与fm7843 ad转换芯片通信) 3)初始化spi或sio功能(配置控制寄存器) 3、触摸屏测试程序 见程序流程图:坐标采样流程图获取x坐标流程图源代码:#include ./inc/lib.h#include #include inc/tchscr.h#include uhal/uhal.h#pragma import(_use_no_semihosting_swi) / ensure no functions that use semihosting u32 tchscr_getosxy(int *x, int *y)/获得触摸点坐标并返回触摸动作static u32 mode=0;static int oldx,oldy;int i,j;for(;)if(mode!=tchscr_action_down) & (mode!=tchscr_action_move) if(!(radcdat0&(115)/有触摸动作 tchscr_getscrxy(x, y);/得到触摸点坐标oldx=*x; oldy=*y;for(i=0;i40;i+) if(radcdat0&(115)/抬起 break;hudelay(20);if(i40)/在规定的双击时间之内抬起,检测是不是及时按下for(i=0;i60;i+) if(!(radcdat0&(115) subsrcpnd|=(19); if (i10) i=60;break;/如果单击后很短时间内按下,不视为双击 mode=tchscr_action_dbclick;for(j=0;j40;j+) hudelay(50);/检测到双击后延时,防止拖尾 break;hudelay(20); if(i=60)/没有在规定的时间内按下,视为单击mode=tchscr_action_click;else/没有在规定的时间内抬起,视为按下mode=tchscr_action_down; break;else tchscr_getscrxy(x, y);/得到触摸点坐标if(radcdat0&(125 |abs(oldy-*y)25)/有移动动作mode=tchscr_action_move;break;hudelay(10);oldx=*x;oldy=*y;return mode;void tchscr_test()u32 mode;int x,y;uart_printf(0,nplease touch the screenn);for(;)mode=tchscr_getosxy(&x, &y);switch(mode)case tchscr_action_click:uart_printf(0,action=click:x=%d,ty=%dn,x,y);break;case tchscr_action_dbclick:uart_printf(0,action=double click:x=%d,ty=%dn,x,y);break;case tchscr_action_down:uart_printf(0,action=down:x=%d,ty=%dn,x,y);break;case tchscr_action_up:uart_printf(0,action=up:x=%d,ty=%dn,x,y);break;case tchscr_action_move:uart_printf(0,action=move:x=%d,ty=%dn,x,y);break;hudelay(1000);/*事件定义*/ main function. /int main(void)armtargetinit(); / do target (uhal based arm system) initialisation /tchscr_init(); tchscr_test(); /* #说明: c库函数等定义添加udelay,微秒级延时函数*/#include ./inc/lib.h/#include ./inc/sys/mmu.h#include ./inc/macro.h#include ./inc/serial.h#include ./inc/reg2410.h#include #include #include #include #include /-system-/*100微秒级延时函数参数time: 表示延时的时间,单位微秒。如果time=0,则启用看门狗定时器,自动计算时间*/void hudelay(int time)static int delayloopcount=100;int i,adjust=0, curpc;if(time=0)time=adjust=200;delayloopcount = 400;/pclk/1m,watch-dog disable,1/64,interrupt disable,reset disablerwtcon = (pclk/1000000-1)8)|(23); rwtdat = 0xffff; /for first updaterwtcnt = 0xffff; /resolution=64us any pclk rwtcon = (pclk/1000000-1)8)|(23)|(10;time-)_asmmov curpc, pc;for(i=0;idelayloopcount;i+);_asmsub curpc, pc, curpc;if(adjust)rwtcon = (pclk/1000000-1)8)|(264us, 200*400 cycle runtime = 64*i usdelayloopcount = 8000000/(i*64); /200*400:64*i=1*x:100 - x=80000*100/(64*i) printk(get delay loop count successfully! the value is %d, , delayloopcount);printk(maybe %d mipsn, curpc*delayloopcount/400);/* uart */extern serial_driver_t* serial_drv;extern int numberofuartdrv;serial_loop_func_t getch_loopfunc=(serial_loop_func_t)null,(serial_loop_func_t)null,(serial_loop_func_t)null, (serial_loop_func_t)null;#define getch_loopfunc_num(sizeof(getch_loopfunc)/sizeof(serial_loop_func_t)int uart_init(int whichuart, int baud)if(whichuart=numberofuartdrv)return false;return serial_drvwhichuart-init(baud);int uart_sendbyte(int whichuart,int data)if(whichuart=numberofuartdrv)return false;return serial_drvwhichuart-write(data);void uart_sendstring(int whichuart, char *pt) while(*pt)if(*pt=n)uart_sendbyte(whichuart,r);uart_sendbyte(whichuart,*pt+); /if you dont use vsprintf(), the code size is reduced very much.void uart_printf(int whichuart, char *fmt,.)va_list ap;static char string256;va_start(ap,fmt);vsprintf(string,fmt,ap);uart_sendstring(whichuart, string);va_end(ap);/* #说明: s3c2410 cpu 时钟驱动*/#include #include #include #include #include ./inc/reg2410.h#include ./inc/serial.h/#include ./inc/sys/io.h#include ./inc/lib.h/* externl clock frequency used by cpu */#define fin12000000static _inline unsigned longcal_bus_clk(unsigned long cpu_clk, unsigned long ratio, int who)if (!who) /* pclk */switch (ratio) case 0:return (cpu_clk);case 1:case 2:return (cpu_clk/2);case 3:return (cpu_clk/4);default:return 0; else /* hclk */switch (ratio) case 0:case 1:return (cpu_clk);case 2:case 3:return (cpu_clk/2);default:return 0;/* * cpu clock = (mdiv + 8) * fin) / (pdiv + 2) * (1 sdiv) * fin = input frequency (to cpu) */unsigned long s3c2410_get_cpu_clk(void)unsigned long val = rmpllcon;return (get_mdiv(val) + 8) * fin) / (get_pdiv(val) + 2) * (1 get_sdiv(val);unsigned long s3c2410_get_bus_clk(int who)unsigned long cpu_clk = s3c2410_get_cpu_clk();unsigned long ratio = rclkdivn;return (cal_bus_clk(cpu_clk, ratio, who);#define mega(1000 * 1000)int s3c2410_cpu_init(void)fclk = s3c2410_get_cpu_clk();hclk = s3c2410_get_bus_clk(get_hclk);pclk = s3c2410_get_bus_clk(get_pclk);printk(cpu clock = %d.%03d mhz, fclk / mega, fclk % mega);printk( hclk = %d.%03d mhz, hclk / mega, hclk % mega);printk( pclk = %d.%03d mhzn, pclk / mega, pclk % mega);return 0;* #说明: 驱动程序定义添加串口驱动程序s3c2410_serialx_driver*/#include ./inc/macro.h#include ./inc/drivers.h/#include ./inc/sysdrv.h#include inc/uart.h#include inc/serial.h/*for serial drivers*/extern serial_driver_t s3c2410_serial0_driver, s3c2410_serial1_driver, s3c2410_serial2_driver;serial_driver_t* serial_drv=&s3c2410_serial0_driver, &s3c2410_serial1_driver, &s3c2410_serial2_driver;int numberofuartdrv=numberofarray(serial_drv);/struct_uart_bufferuart_buffernumberofarray(serial_drv);/* #说明: s3c2410串口驱动程序for ucos-ii*/#include #include #include #include #include ./inc/reg2410.h#include ./inc/serial.h/#include ./inc/sys/io.h#include .uhal/isr.h#define utrstat_tx_empty(1 2)#define utrstat_rx_ready(1 0)#define uart_err_mask0xf #define ulcon_ir(1 6)/* use infra-red mode */#define fulcon_parfld(3,3)/* what parity mode? */#define ulcon_parfmsk(fulcon_par)#define ulcon_par_nonefinsrt(0x0, fulcon_par) /* no parity */#define ulcon_par_oddfinsrt(0x4, fulcon_par) /* odd parity */#define ulcon_par_evenfinsrt(0x5, fulcon_par) /* even parity */#define ulcon_par_1finsrt(0x6, fulcon_par) /* parity force/checked as 1 */#define ulcon_par_0finsrt(0x7, fulcon_par) /* parity force/checked as 0 */#define ulcon_stop(1 2)/* the number of stop bits */#define ulcon_one_stop(0 2)/* 1 stop bit */#define ulcon_two_stop(1 2)/* 2 stop bit */#define fulcon_wlfld(2, 0)/* word length */#define ulcon_wlfmsk(fulcon_wl)#define ulcon_wl5finsrt(0x0, fulcon_wl)/* 5 bits */#define ulcon_wl6finsrt(0x1, fulcon_wl)/* 6 bits */#define ulcon_wl7finsrt(0x2, fulcon_wl)/* 7 bits */#define ulcon_wl8finsrt(0x3, fulcon_wl)/* 8 bits */#define ulcon_cfgmask(ulcon_ir | ulcon_par | ulcon_wl)#define ucon_clk_sel(1 10)/* select clock for uart */#define ucon_clk_pclk(0 10)/* pclk for uart baud rate */#define ucon_clk_uclk(1 10)/* uclk for uart baud rate */#define ucon_tx_int_type(1 9)/* tx interrupt request type */#define ucon_tx_int_pls(0 9)/* pulse */#define ucon_tx_int_lvl(1 9)/* level */#define ucon_rx_int_type(1 8)/* rx interrupt request type */#define ucon_rx_int_pls(0 8)/* pulse */#define ucon_rx_int_lvl(1 8)/* level */#define ucon_rx_timeout(1 7)/* rx timeout enable */#define ucon_rx_err_int(1 6)/* rx error status interrupt enable */#define ucon_loopback(1 5)/* to enter the loop-back mode */#define ucon_brk_sig(1 4)/* to send a break during 1 frame time */#define fucon_txfld(2,2)/* function to write tx data to the uart tx buffer */#define ucon_txfmsk(fucon_tx)#define ucon_tx_disfinsrt(0x0, fucon_tx)/* disable */#define ucon_tx_intfinsrt(0x1, fucon_tx)/* interrupt or polling */#define ucon_tx_dma0finsrt(0x2, fucon_tx)/* dma0 request */#define ucon_tx_dma1finsrt(0x3, fucon_tx)/* dma1 request */#define fucon_rxfld(2,0)/* function to read data from uart rx buffer */#define ucon_rxfmsk(fucon_rx)#define ucon_rx_disfinsrt(0x0, fucon_rx)/* disable */#define ucon_rx_intfinsrt(0x1, fucon_rx)/* interrupt or polling */#define ucon_rx_dma0finsrt(0x2, fucon_rx)/* dma0 request */#define ucon_rx_dma1finsrt(0x3, fucon_rx)/* dma1 request */#define fufcon_tx_trfld(2,6)/* trigger level of transmit fifo */#define ufcon_tx_trfmsk(fufcon_tx_tr)#define ufcon_tx_tr0finsrt(0x0, fufcon_tx_tr)/* empty */#define ufcon_tx_tr4finsrt(0x1, fufcon_tx_tr)/* 4-byte */#define ufcon_tx_tr8finsrt(0x2, fufcon_tx_tr)/* 8-byte */#define ufcon_tx_tr12finsrt(0x3, fufcon_tx_tr)/* 12-byte */#define fufcon_rx_trfld(2,4)/* trigger level of receive fifo */#define ufcon_rx_trfmsk(fufcon_rx_tr)#define ufcon_rx_tr4finsrt(0x0, fufcon_rx_tr)/* 4-byte */#define ufcon_rx_tr8finsrt(0x1, fufcon_rx_tr)/* 8-byte */#define ufcon_rx_tr12finsrt(0x2, fufcon_rx_tr)/* 12-byte */#define ufcon_rx_tr16finsrt(0x3, fufcon_rx_tr)/* 16-byte */#define ufcon_tx_req(1 2)/* auto-cleared after resetting fifo */#define ufcon_rx_req(1 1)/* auto-cleared after resetting fifo */#define ufcon_fifo_en(1 0)/* fifo enable */#define umcon_afc(1 4)/* enable auto flow control */#define umcon_send(1 0)/* when not-afc,set nrts 1:l 0:h level */#define utrstat_tr_emp(1 2)/* 1: transmitter buffer &shifter register empty */#define utrstat_tx_emp(1 1)/* transmit buffer reg. is empty */#define utrstat_rx_rdy(1 0)/* receive buffer reg. has data */#define uerstat_brk(1 3)/* break receive */#define uerstat_frame(1 2)/* frame error */#define uerstat_parity(1 1)/* parity error */#define uerstat_overrun(1 0)/* overrun error */#define ufstat_tx_full(1 9)/* transmit fifo is full */#define ufstat_rx_full(1 8)/* receive fifo is full */#define fufstat_tx_cntfld(4,4)/* number of data in tx fifo */#define ufstat_tx_cntfmsk(fufstat_tx_cnt)#define fufstat_rx_cntfld(4,0)/* number of data in rx fifo */#define ufstat_rx_cntfmsk(fufstat_rx_cnt)#define umstat_dcts(1 3)/* see page 11-16 */#define umstat_cts(1 0) */* ubrdivn = (int)(pclk/(bsp * 16)-1 orubrdivn = (int)(uclk/(bsp * 16)-1 */#define uart_txd0gpio_mode_alt0|gpio_h2|gpio_pullup_dis#define uart_rxd0gpio_mode_alt0|gpio_h3|gpio_pullup_dis#define uart_txd1gpio_mode_alt0|gpio_h4|gpio_pullup_dis#define uart_rxd1gpio_mode_alt0|gpio_h5|gpio_pullup_dis#define uart_txd2gpio_mode_alt0|gpio_h6|gpio_pullup_dis#define uart_rxd2gpio_mode_alt0|gpio_h7|gpio_pullup_distypedef struct unsigned int txio;unsigned int rxio;unsigned int clkcon;type_uart_def;static const type_uart_def uart_def=uart_txd0, uart_rxd0, clkcon_uart0, uart_txd1, uart_rxd1, clkcon_uart1, uart_txd2, uart_rxd2, clkcon_uart2;#define serial_isr(n)(irq_rxd#n)/串口中断号_inline static int serial_init(int ndev, int baudrate)int div=s3c2410_get_bus_clk(get_pclk);div=( (int)(div/16/baudrate) -1 );/baud rate divisior register/configure io for uartset_gpio_ctrl(uart_defndev.txio);set_gpio_ctrl(uart_defndev.rxio);/setup uart clockrclkcon |= uart_defndev.clkcon;buart(ndev, oubrdiv) = div;buart(ndev, oumcon) = 0;/reset and configure fifobuart(ndev, oufcon) = ufcon_tx_req | ufcon_rx_req;buart(ndev, oufcon) = ufcon_fifo_en | ufcon_tx_tr8 | ufcon_rx_tr4;/buart(ndev, oufcon) = 0;/enable uartbuart(ndev, oulcon) = ulcon_wl8;buart(ndev, oucon) = ucon_clk_pclk | ucon_tx_int_pls | ucon_rx_int_pls | ucon_tx_int | ucon_rx_int |ucon_rx_timeout;return 0;_inline static int serial_read(int ndev)return buart(ndev, ourxhl);_inline static int serial_write(int ndev, int ch)/while(!(buart(ndev, outrstat) & 0x2); /wait until thr is empty.while(buart(ndev, oufstat) & ufstat_tx_full);/ wait when tx fifo fullbuart(ndev, outxhl) = ch;return 0;_inline static int serial_poll(int ndev)return (buart(ndev, oufstat) & ufstat_rx_cnt) != 0);_inline static int serial_flush_input(int ndev)int tmp;while(buart(ndev, oufstat) & ufstat_rx_cnt)tmp=buart(ndev, ourxhl);/reset rx fifobuart(ndev, oufcon) |= ufcon_rx_req;return 0;_inline static int serial_flush_output(int ndev)while(!(buart(ndev, outrstat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高三生物省考试卷及答案
- 自考(网络教育)安全监测监控技术考试试题及答案
- 肿瘤微环境调控-第16篇-洞察与解读
- 护理管理学自考试题及答案
- 交通限制效果评估-洞察与解读
- 2025年事业单位招聘考试综合类面试真题模拟试卷真题模拟精讲
- 2025年事业单位招聘考试综合类无领导小组讨论面试真题模拟试卷:时事热点挑战篇
- 2025年事业单位教师招聘化学学科专业知识试卷:试题解析与答案
- 2025年事业单位招聘考试综合类职业能力倾向测验真题模拟试卷(心理学)
- 2025年上海市浦东新区事业单位招聘考试综合类结构化面试真题模拟试卷(含解析)
- 2025年重庆高考高职分类考试中职数学试卷真题(含答案详解)
- 泌尿外科专科护士汇报
- 2025至2030年中国军用锂电池组市场现状分析及前景预测报告
- 代理记账合同(内账)
- 质量部安全生产职责内容
- 超声引导下置管技术规范与临床应用
- 2025版心肺复苏术指南
- 2025至2030中国电动机制造市场需求趋势及前景运行状况分析报告
- 取样员考试试题及答案
- 2025年湖南省中考地理试卷真题(含答案)
- 汽修店考核管理制度
评论
0/150
提交评论