触摸屏实验毕业设计(论文)word格式.doc

上传人:仙人指路1688 文档编号:4031364 上传时间:2023-04-01 格式:DOC 页数:29 大小:189.50KB
返回 下载 相关 举报
触摸屏实验毕业设计(论文)word格式.doc_第1页
第1页 / 共29页
触摸屏实验毕业设计(论文)word格式.doc_第2页
第2页 / 共29页
触摸屏实验毕业设计(论文)word格式.doc_第3页
第3页 / 共29页
触摸屏实验毕业设计(论文)word格式.doc_第4页
第4页 / 共29页
触摸屏实验毕业设计(论文)word格式.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《触摸屏实验毕业设计(论文)word格式.doc》由会员分享,可在线阅读,更多相关《触摸屏实验毕业设计(论文)word格式.doc(29页珍藏版)》请在三一办公上搜索。

1、触摸屏触摸屏实验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触摸屏原理 触摸屏按其工作原理的不同分为表面声波屏、电容屏、电阻屏和红外屏几种。常见的又数电阻触摸屏。如下图所

2、示,电阻触摸屏的屏体部分是一块与显示器表面非常配合的多层复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透明的导电层,上面再盖有一层外表面硬化处理、光滑防刮的塑料层,它的内表面也涂有一层透明导电层,在两层导电层之间有许多细小(小于千分之一英寸)的透明隔离点把它们隔开绝缘。 如图3-21所示,当手指或笔触摸屏幕时(图c),平常相互绝缘的两层导电层就在触摸点位置有了一个接触,因其中一面导电层(顶层)接通X轴方向的5V均匀电压场(图a),使得检测层(底层)的电压由零变为非零,控制器侦测到这个接通后,进行A/D转换,并将得到的电压值与5V相比即可得触摸点的X轴坐标为(原点在靠近接地点的那端): X

3、i=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触摸屏的控制 本系统触摸屏的控制是使用的F

4、M7843芯片。FM7843是4线电阻触摸屏转换接口芯片。它是一款具有同步串行接口的12位取样模数转换器。在125kHz吞吐速率和2.7V电压下的功耗为750W,而在关闭模式下的功耗仅为0.5W。因此,FM7843以其低功耗和高速率等特性,被广泛应用在采用电池供电的小型手持设备上。FM7843采用SSOP-16引脚封装形式,温度范围是-4085。为了完成一次电极电压切换和A/D转换,需要先通过SPI接口往FM 7843发送控制字,转换完成后再通过串口读出电压转换值。标准的一次转换需要24个时钟周期。由于SPI接口支持双向同时进行传送,并且在一次读数与下一次发控制字之间可以重叠,所以转换速率可以

5、提高到每次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值仅是对当

6、前触摸点的电压值的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是触摸屏返

7、回电压值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、触摸屏测试程序 见程序流程

8、图:坐标采样流程图获取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_D

9、OWN) & (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_ACT

10、ION_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;

11、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

12、;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 (u

13、HAL 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: 表示延时的时间,单位微

14、秒。如果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; /r

15、esolution=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(Ge

16、t 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, (

17、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

18、;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 string

19、256;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 FIN1200

20、0000static _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:

21、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 s3c241

22、0_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

23、(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/ua

24、rt.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_Uar

25、t_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 ULC

26、ON_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 *

27、/#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 fULCO

28、N_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 | UL

29、CON_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_I

30、NT_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

31、 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

32、)/* 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 */#d

33、efine 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_

34、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(f

35、UFCON_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

36、 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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号