




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于ARM的触摸屏控制 摘要:本文介绍了基于ARM的触摸屏控制的设计思路、原理和实现方法。硬件电路主要由PHILIPS公司的ARM7TDMI-S微控制器LPC2290,FM7843控制器和SID13503控制器构成。利用C语言编写驱动和用户程序,通过触摸屏的FM7843控制器将触摸信号进行A/D转换,进而利用ARM芯片和彩色液晶屏SID13503控制器,将触摸动作在液晶屏上进行显示,最终实现了触摸屏和液晶屏的控制。该设计操作直观、简单、功耗小、提高了人机交互的友好性。关键词:触摸屏; 液晶屏; ARM The Control of Touch-screen Based on ARM Abstr
2、act: This paper introduced the designing of thought and the achievement methods of the control of ARM touch-screen based on ARM. The hardware circuit consists of ARM7TDMI-S LPC2290 controller, FM7843 controller and SID13503 controller which are all produced by PHILIPS Corporation. The researchers co
3、mpose driven and user program in C language ,and utilize FM7843 controller of the touch-screen to proceed A/D converter, then use ARM chips and SID13503 controller of LCD screen to show the action of touching on the LCD screen, ultimately realize the control of touch-screen and LCD screen. This desi
4、gn is direct-viewing、simple、as well as costs less power and can improve the friendliness of human-computer interaction.Key word: touch-screen; LCD; ARM目 录摘要11 引言32 总体设计33 硬件设计部分33.1 彩色液晶显示器33.2 彩色液晶屏驱动电路及SID13503控制器 43.3 触摸屏原理.53.4 触摸屏驱动电路及FM7843控制器54 软件设计部分.64.1 触摸屏驱动程序设计.64.2 彩色液晶屏驱动程序设计84.3 用户程序.
5、115 总结.13参考文献14附录一15附录二18附录三22附录四261 引言随着信息产业的迅猛发展,由于触摸屏操作直观、简单、功耗小、有利于提高人机交互的友好性等优点,而逐渐取代鼠标、键盘,在人机交互中成为主要输入设备1。因此LCD触摸屏变得也越来越普及,并成为当今的主流配置。而目前对触摸屏的研究性价比有所欠缺,人机交互的友好性体现不够,功耗较大,占用空间多,并且大部分来自国外且价格不菲,而本文利用PHILIPS公司的LPC2290芯片,极好的解决了这些缺点,设计出了性价比高、屏幕显示无闪烁、画面切换速度快、占用空间少、方便灵活、人机交换互性好、低功耗、快速准确的触摸屏系统。2 总体设计系统
6、的总体设计框图如图1所示。彩色液晶屏作为人机交换的最直接的交互画面,通过其内部的液晶屏控制器SID13503与LPC2290芯片相连,采用并行接口进行数据传送,对当前的触摸信息进行显示。触摸屏紧贴在液晶显示屏的外表面,而触摸屏作为一种人机交换设备,当用户在触摸屏上有触摸动作时,触摸屏控制器通过A/D转换,将触摸信息传递给LPC2290芯片,LPC2290芯片处理信息后,控制液晶显示器进行相应的画面更新动作,实现人机交换功能。图1 系统的总体框图3 硬件设计部分 3.1 彩色液晶显示器液晶是一种在一定温度范围内呈现出即不同于固态、液态,又不同于气态的特殊物质,它即具有各向异性的晶体所特有的双折射
7、性,又具有液体的流动性。液晶显示器件(英文简写为LCD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件2。液晶显示器是平板显示器件中的一种,具有低工作电压、微功耗、无辐射、小体积等特点,被广泛应用于各种各样嵌入式产品中。本设计所用的点阵式图形液晶显示屏是LCD的一种,能够动态显示图形、汉字以及各种符号信息,为各种电子产品提供了友好的人机界面。随着STN和TFT液晶显示技术的成熟发展及制造成本的不断降低,点阵式图形液晶显示屏也就成为了嵌入式系统中最主要的图形显示设备。3.2 彩色液晶屏驱动电路及SID13503控制器本设计使用5.2英寸320x240彩色液晶屏,由于
8、液晶屏内部没有液晶控制器,而LPC2290本身也没有液晶控制器模块,所以需要外接一个彩色液晶控制器3.1。彩色液晶驱动电路如图2所示,液晶控制器型号为SID13503,采用5V电源供电。由于SID13503是可以硬件配置的,所以设计电路时根据需要对SID13503的VD0-VD15引脚进行设置。由于电路采用8位总线方式连接SID13503,所以SID13503的VD0没有上拉电阻,而且SID13503的DB8-DB15引脚要接VDD(即5V)。图2中,将SID13503的地址总线A1-A17与SID13503的AB0-AB16相连.这样连接有一个好处,就是LPC2290可以使用16位总线方式操
9、作SID13503(高8位数据被忽略)。 SID13503有两个片选引脚,一个是I/O片选引脚(用于内部寄存器操作),另一个是存储器片选引脚(用于显示存储器操作),所以用了IO_nCS3,IO_nCS2两个片选信号与其连接。如图2所示,当IO_nCS3 为低电平时,信号nIOCS有效,所以内部寄存器的起始地址为0x83800000;当IO_nCS2为低电平时,信号nMEMCS 有效,所以显示存储器的起始地址为0x834000003.2。为了使用I/O接口呈现直接访问方式,故将SID13503的VD1接了一个10k的上拉电阻。在接5V电源时,SID13503的VIH2V,所以可以直接使用LPC2
10、290的总线与它相连,不需要加电平转换电路。由于SID13503使用的电源是5V,而LPC2290的I/O电压为3.3V,所以在数据总线上串接470的保护电阻。图2的具体详细电路见附录四图2 彩色液晶屏驱动电路3.3 触摸屏原理触摸屏采用四线电阻式触摸屏(示意图如图3所示,测量原理如图4所示),四线电阻式触摸屏是电阻式家族中应用最广、最普及的一种4,其由两个透明层构成,其中一层在屏幕的左右边缘各有一条垂直总线,另一层在屏幕的底部和顶部各有一条水平总线5。透明层的内表面均涂了薄薄一层导电材料,当触摸屏表面受到的压力(如通过触笔或手指进行按压)足够大时,顶层与底层之间会产生接触,从而使电阻层发生接
11、触。当在Y方向的电极对上施加一确定的电压,而X方向电极对上不加电压时,在Y平行电压场中,触点处的电压值可以在X(或X)电极上反映出来,通过测量X电极对地的电压大小,便可得知触点的Y坐标值。同理,当在X电极对上加电压,而Y电极对上不加电压时,通过测量Y电极的电压,便可得知触点的X坐标。 图3 四线电阻式触摸屏结构示意图 图4 四线电阻式触摸屏测量原理3.4 触摸屏驱动电路及FM7843控制器彩色液晶屏上带有触摸屏(四线电阻式触摸屏),用于检测屏幕触摸输入信号,有利于提高人际交互性的友好性。因此在使用触摸屏时,须要一个A/D转换器将模拟信号转换成数字信号,这里使用触摸屏控制器FM7843来完成这一
12、功能,其A/D转换精度有8位和12位,本设计利用12位精度。在进行A/D转换后,通过SPI接口把转换结果输出到LPC2290。FM7843的工作电源为2.75V,这里FM7843使用3.3V电压供电,A/D参考电源也是使用3.3V。FM7843接口电路如图5所示3.3。 图5 FM7843接口电路图4软件设计部分4.1 触摸屏的驱动程序设计库文件config.h中包含了对FM7843的最基本的定义,并对FM7843的控制I/O端口进行定义,同时调整DELYA_200NS的值,可以控制系统时钟的快慢,参数值越大越慢FM7843.C为FM7843驱动程序,功能实现FM7843的驱动6。函数Dela
13、yNo(),用来实现短软件延时,延时参数值越大,延时越久。函数TestDelayNo(),用来测试短软件延时,以便于产生正确的时序。函数FM7843_IRQR()(见附表一),对FM7843的PENIRQ引脚测量,返回当前此引脚的电平值, 返回为0表示PENIRQ为低电平状态,否则为高电平函数FM7843_IOInit(),初始化FM7843的控制I/O,初始化结果CS=1,DCLK=0,DIN=0。函数FM7843_WriteRead()(见附表一),对FM7843进行读写操作。作按照FM7843规定,24Clocks,先写8位控制数据,然后读取12位的转换结果,返回值为读出的数据。 #in
14、clude "config.h"#define FM7843_CSS()IO2SET = ADS7843_CS#define FMS7843_CSC()IO2CLR = ADS7843_CS#define FMS7843_DOUTR()(IO2PIN & ADS7843_DOUT)#define FM7843_DINS()IO2SET = ADS7843_DIN#define FM7843_DINC()IO2CLR = ADS7843_DIN#define FM7843_DCLKS()IO2SET = ADS7843_DCLK#define FM7843_DCLKC
15、()IO2CLR = FM7843_DCLK/* 操作时序控制宏(即延时控制值) */#define DELAY_200NS5 /*实现短软件延时,延时参数值越大,延时越久*/void DelayNo(uint32 i) for(; i>0; i-);/*测试短软件延时,以便于产生正确的时序*/void TestDelayNo(void) while(1) FM7843_DCLKS();DelayNo(DELAY_200NS);FM7843_DCLKC();DelayNo(DELAY_200/*初始化FM7843的控制I/O,初始化结果CS=1,DCLK=0,DIN=0 */ void
16、FM7843_IOInit(void) FM7843_CSS(); / CS = 1FM7843_DCLKC(); / DCLK = 0FM7843_DINC(); / DIN = 0DelayNo(DELAY_200NS);/*对FM7843的PENIRQ引脚测量,返回当前此引脚的电平值, 返回为0表示PENIRQ为低电平状态,否则为高电平*/FM7843_IRQR() .见附表一/*对FM7843进行读写操作。作按照FM7843规定,24Clocks,先写8位控制数据,然后读取12位的转换结果,返回值为读出的数据。*/FM7843_WriteRead()见附表一4.2 彩色液晶屏的驱动程序
17、设计库文件config.h中包含了对SID13503的最基本的定义。LCDDRIVE.C是彩色液晶屏的驱动程序,功能是实现彩色液晶屏的驱动程序通过操作彩色液晶屏控制器SID13503,控制256色RGB伪彩色液晶显示屏,其中使用LPC2290芯片控制,8位总线接口,SID13503的寄存器地址为0x838000xx,显示存储器的地址为0x834xxxxx7。显示缓冲区的定义(见附表一)。S1D13503_Init()是彩色液晶屏控制器的寄存器初始化函数(见附表一),其功能对彩色液晶屏控制器SID13503寄存器0-D进行初始化(使用查表方法),彩色液晶屏型号为320*240 ,256色单屏彩屏
18、。其中同样使用了函数uint8和 uint16,uint8表示无符号8位整型变量 ,uint16无符号16位整型变量。S1D13503_LutInit()是彩色液晶屏控制器调色板的初始化函数,其功能初始化彩色液晶屏控制器SID13503的调色板,其中调色板红、绿基色设置为0、3、5、7、9、11、13、15,蓝基色设置为0、6、10、15。LCD_Initialize()是LCM初始化函数,功能是实现LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0X0000。LCD_FillAll()是LCD的填充函数,功能是实现LCD以图形方式进行填充,填充起始地址为0X0000,dat为要填充的
19、颜色数据。LCD_UpdatePoint()是LCD的画图函数, 功能是实现在指定位置上画点,并刷新某一点,x表示指定点所在列的位置,y表示指定点所在行的位置,当画点在指定地址时,实现其功能,当指定地址超出有效范围,则操作失败。与LCM相关的GUI接口函数(见附表二)#include "config.h"./* 定义显示缓冲区(可根据情况定义或直接使用LCM显示存储空间) */见附表一/* 对彩色液晶屏控制器SID13503寄存器0-D进行初始化*/S1D13503_Init(void). 见附表一/*初始化彩色液晶屏控制器SID13503的调色板*/void S1D135
20、03_LutInit(void) volatile uint16 *REG_Point1;volatile uint16 *REG_Point2;uint8 i; REG_Point1 = (void *) S1D13503_REG;REG_Point1 += 0x0E;REG_Point2 = (void *) S1D13503_REG;REG_Point2 += 0x0F;for(i=0; i<16; i+) *REG_Point1 = i; / 设置为自动更换存取方式,设置地址*REG_Point2 = LUT_RED_TABi; / 设置红色调色板*REG_Point2 = LU
21、T_GRN_TABi; / 设置绿色调色板*REG_Point2 = LUT_BLU_TABi; / 设置蓝色调色板 /* 实现LCM初始化,将LCM初始化为纯图形模式*/void LCD_Initialize(void) S1D13503_Init(); / 初始化LCM工作模式S1D13503_LutInit(); / 初始化调色板/* 实现LCD以图形方式进行填充,填充起始地址为0X0000,dat为要填充的颜色数据*/void LCD_FillAll(TCOLOR dat) volatile uint16 *DAT_Point; uint32 i, j; /* 开始复制填充数据 */D
22、AT_Point = (void *) S1D13503_DAT; / 置地址指针 for(i=0; i<GUI_LCM_YMAX; i+) / 历遍所有行 for(j=0; j<GUI_LCM_XMAX; j+) / 历遍所有行 *DAT_Point+ = dat; /* 实现在指定位置上画点,并刷新某一点,x表示指定点所在列的位置,y表示指定点所在行的位置,当画点在指定地址时,实现其功能,当指定地址超出有效范围,则操作失败*/void LCD_UpdatePoint(uint32 x, uint32 y) volatile uint16 *DAT_Point;uint32 ad
23、dr;uint32 x1, y1; x1 = GUI_LCM_XMAX - x - 1; / 对于9111屏有效y1 = GUI_LCM_YMAX - y - 1; / 对于9111屏有效/* 找出目标地址 */addr = y1*GUI_LCM_XMAX + x1;DAT_Point = (void *) S1D13503_DAT;DAT_Point += addr;*DAT_Point = gui_disp_bufyx;/ 输出数据 . /*与LCM相关的GUI接口函数*/见附表二4.3 用户程序本程序实现读取触摸屏的动作,并显示一个方点在对应的液晶屏幕上。程序运行时,首先进行必要的初始化
24、8,即初始化GPIO、初始化LCM、将液晶屏片选信号CS置低、填充液晶屏幕背景色并校准屏幕,然后判断是否有触摸动作,如没有则继续等待,直到有触摸输入时,读取触摸动作并判断触摸是否有效,如无效则返回继续等待触摸,若有效,蜂鸣器响一声,获取当前触摸坐标并进行校准,最后将触摸结果在液晶屏上显示。流程图如图6所示。图6 用户程序流程图#include "config.h"void GPIO_Initialize(void);void GetLCD_XY(uint16 *vx, uint16 *vy);void DelayNS(uint32 dly);uint8 Calibratio
25、n(void);uint16 errx1, erry1, errx2, erry2; / 一般存放基准点坐标uint16 diffx, diffy; / 一般存放基准点坐标差值uint16 x, y; / 一般存放当前坐标本段程序名称main,其为程序的主函数,功能包括GPIO和LCM的初始化,填充颜色,校准屏幕,获取当前坐标,并进行显示9。int main (void) GPIO_Initialize(); / 初始化GPIOGPIO GUI_Initialize(); / 初始化LCM GUI_FillSCR(WHITE); / 填充白色背景 while(Calibration() !=
26、1); / 校准屏幕while(1)GetLCD_XY(&x, &y); / 获取当前坐标x = (x - errx1) * 280 / diffx + 20; / 通过基准点校准xy = (y - erry1) * 200 / diffy + 20; / 通过基准点校准y /* 通过点函数构成一个方点画在LCD上 */GUI_Point( x+1, y, BLACK);GUI_Point( x-1, y, BLACK);GUI_Point( x, y+1, BLACK);GUI_Point( x, y-1, BLACK);GUI_Point( x+1, y+1, BLACK)
27、;GUI_Point( x-1, y-1, BLACK);GUI_Point( x+1, y-1, BLACK);GUI_Point( x-1, y+1, BLACK);GUI_Point( x, y, BLACK);return 0;子程序GPIO_Initialize(),功能是初始化触摸屏和蜂鸣器的GPIOvoid GPIO_Initialize(void) 见附录三函数Calibration(),功能是获取校准基准点坐标,其中uint16 *errx,用于保存校准点x坐标(LCD)的变量指针,uint16 *erry,用于保存校准点y坐标(LCD)的变量指针uint8 Calibrat
28、ion(void) 见附录三函数GetLCD_XY(),功能是读取触摸屏上触摸点的坐标,在读取过程中,程序会一直等待,直到有触摸输入10。其原理是先通测量y轴的触摸输入,判断是否有触摸动作。如果有,则行6次数据采集,并进行去极值平均滤波处理。最后还要判断触摸输入是否合法,只有当触摸输入合法时才返回。其中,x用于保存触摸点x坐标(LCD)的变量指针 ,y用于保存触摸点y坐标(LCD)的变量指针。void GetLCD_XY(uint16 *vx, uint16 *vy) 见附录三本程序名称为DelayNS(),功能是实现长软件延时(dly毫秒,与程序运行速度有关),消除震颤,其中dly为延时参数
29、,值越大,延时越久。void DelayNS(uint32 dly) 见附录三 函数Beep(),其功能实现控制蜂鸣器响一声。void Beep(void) 见附录三五 总结 本设计使用PHILIPS公司的LPC2290的ARM 单片机,从触摸屏和液晶显示器的性能方面为出发点,通过C语言编程,来设计实现的四线电阻式触摸屏产品在实际应用中得到了很好的效果,实现了先进的触摸屏显示、控制技术,改善了传统的设备显示与控制方式,性价比高,低功耗,提高了人机交互的友好性,使设备更加人性化,有很强的应用前景,相信其会变得也越来越普及,并成为当今的主流配置。参考文献1 欧庆于等. 基于S3C44B0X+uCl
30、inux的触摸屏设计. 计算机与数字工程J, 2005, 12(3):165.2 周立功等. ARM 与嵌入式系基础教程M. 北京:北京航空航天大学出版社, 2005: 379-381.3 周立功等. ARM嵌入式系统实验教程(三) M. 北京:北京航空航天大学出版社, 2005: 21-22.4 陈辰等. ARM芯片S3C2410触摸屏驱动的研究与开发. 科学技术与工程J, 2006,3(2):327.5 王洪等. ARM HMS30C7202与触摸屏接口电路的设.计微计算机信息J, 2007,2(3):166.6 马忠梅. 单片机的C语言应用程序设计M.北京:北京航空航天大学出版社,200
31、3: 120-125.7 吴明晖等. 基于ARM的嵌入式系统开发与应用M. 北京: 人民邮电出版社, 2004: 72-74.8 刘显荣. 基于S3C2410的触摸屏控制.微计算机信息J,2007, 11(3):185.9 杜春雷. ARM体系结构与编程M. 北京: 清华大学出版社, 2003: 61-62.10 坛浩强. C程序设计(第二版)M. 北京: 清华大学出版社, 1999: 107-108.附录一函数ADS7843_IRQR(),实现对ADS7843的PENIRQ引脚测量,返回当前此引脚的电平值。uint8 ADS7843_IRQR(void) uint8 dat3;DelayNo
32、(1);if(IO0PIN&ADS7843_IRQ) dat0 = 1;else dat0 = 0;if(IO0PIN&ADS7843_IRQ) dat1 = 1;else dat1 = 0;if(IO0PIN&ADS7843_IRQ) dat2 = 1;else dat2 = 0;if(dat0 + dat1 + dat2) > 1) return(1);else return(0);函数ADS7843_WriteRead(),功能是对ADS7843进行读写操作。uint16 ADS7843_WriteRead(uint8 data) uint8 i;uint1
33、6 ret_dat;data = data|0x80; / 设置S位ADS7843_IOInit();ADS7843_CSC(); / CS = 0for(i=0; i<8; i+) if( (data&0x80) != 0 ) ADS7843_DINS();/ DIN = 1else ADS7843_DINC(); / DIN = 0DelayNo(DELAY_200NS);ADS7843_DCLKS(); / DCLK = 1DelayNo(DELAY_200NS);ADS7843_DCLKC(); / DCLK = 0data = data<<1;ADS7843
34、_DINC(); / DIN = 0DelayNo(DELAY_200NS * 3);ADS7843_DCLKS(); /DCL=1DelayNo(DELAY_200NS);ADS7843_DCLKC(); / DCLK = 0ret_dat = 0for(i=0; i<12; i+) ret_dat = ret_dat<<1; DelayNo(DELAY_200NS);ADS7843_DCLKS(); / DCLK = 1if( ADS7843_DOUTR() != 0 ) ret_dat = ret_dat | 1; DelayNo(DELAY_200NS);ADS784
35、3_DCLKC(); / DCLK = 0if(i=6) DelayNo(DELAY_200NS * 2); for(i=0;i<3;i+) DelayNo(DELAY_200NS);ADS7843_DCLKS(); / DCLK = 1DelayNo(DELAY_200NS);ADS7843_DCLKC(); / DCLK = 0 DelayNo(DELAY_200NS);ADS7843_CSS(); / CS = 1return(ret_dat);#include "config.h"/* 定义显示缓冲区(可根据情况定义或直接使用LCM显示存储空间) */TCOL
36、OR gui_disp_bufGUI_LCM_YMAXGUI_LCM_XMAX;uint8 const INIT_TAB14 = 0x00, / 寄存器0 - 00000000B (正常工作模式,即非测试模式)0xBD, / 寄存器1 - 10111101B (模式控制:打开显示单屏,屏蔽XSCL水平非显示周期输出,使能LCDENB,彩色8位LCD数据-无XCSL2,16位显示存储数据总线方式) 159, / 寄存器2 - 159 (行字节控制)(每行显示占用的存储器字节数,即列参数)0x0E, / 寄存器3 - 00001110B (非节功模式,256彩色方式)239, / 寄存器4 - 2
37、39 (总行数) 0, / 寄存器5 - 0 (WF翻转周期,为0时表示每一帧WF输出翻转一)0x00, / 寄存器6 - 00H (第一屏显示RAM地址低8位)0x00, / 寄存器7 - 00H (第一屏显示RAM地址高8位)0x00, / 寄存器8 - 00H (第二屏显示RAM地址低8位)0x00, / 寄存器9 - 00H (第二屏显示RAM地址高8位)239, / 寄存器A - 239 (显示一区占用行数)0, / 寄存器B - 0 (显示一区占用行数,高2位)10, / 寄存器C - 10 (水平默认不显示周期) 0 / 寄存器D - 0 (显示域冗余宽度,正常操作模式); 函数
38、S1D13503_Init(),功能是初始化S1D13503。void S1D13503_Init(void) volatile uint16 *REG_Point; uint8 i; REG_Point = (void *) S1D13503_REG;for(i=0; i<14; i+) / 共初始化14个寄存器 *REG_Point = INIT_TABi; / 查表取出数据,然后赋值给S1D13503相应的寄存器,实现初始化REG_Point+; / 指向下一寄存器uint8 const LUT_RED_TAB16 = 0, 3, 5, 7, 9, 11, 13, 15, 0, 3
39、, 5, 7, 9, 11, 13, 15;uint8 const LUT_GRN_TAB16 = 0, 3, 5, 7, 9, 11, 13, 15,0, 3, 5, 7, 9, 11, 13, 15;uint8 const LUT_BLU_TAB16 = 0, 6, 10, 15,0, 6, 10, 15,0, 6, 10, 15 ;附录二与LCM相关的GUI接口函数函数本段程序名称GUI_FillSCR(),其功能实现全屏填充,即直接使用数据填充显示缓冲区,dat表示填充的数据void GUI_FillSCR(TCOLOR dat) uint32 i, j; /* 填充缓冲区 */for
40、(i=0; i<GUI_LCM_YMAX; i+) / 历遍所有行 for(j=0; j<GUI_LCM_XMAX; j+) / 历遍所有行 gui_disp_bufij = dat; /* 填充LCM */ LCD_FillAll(dat);函数GUI_Initialize(),其功能初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。void GUI_Initialize(void) LCD_Initialize(); / 初始化LCM模块工作模式,纯模式UI_FillSCR(0x00); / 初始化缓冲区为0x00,并输出屏幕 (清屏) 函数GUI_ClearSCR(),
41、其功能进行清屏。void GUI_ClearSCR(void) GUI_FillSCR(0x00);函数GUI_Point(),其功能实现在指定位置上画点,x表示指定在列的位置,y指定点所在行的位置,color表示显示颜色(对于黑白色LCM为0时灭,为1时显示) ,返回值为1时表示操作成功,为0时表示操作(作失原因是指定地址超出有效范围)。uint8 GUI_Point(uint32 x, uint32 y, TCOLOR color) /* 参数过滤 */if(x>=GUI_LCM_XMAX) return(0);if(y>=GUI_LCM_YMAX) return(0); /*
42、 设置缓冲区相应的点 */gui_disp_bufyx = color;/* 刷新显示 */LCD_UpdatePoint(x, y);return(1);函数GUI_ReadPoint(),其功能读取指定点的颜色,x表示指定点在列的位置,y指定点所在行的位置,ret用于保存颜色值的指针,当出口参数返回0时表示指定地址超出有效范围。对于单色,设置ret的d0位为1或4级灰度则为d0、d1有效位RGB则d0-d7有效,RGB结构则R、G、B变量有效。int GUI_ReadPoint(uint32 x, uint32 y, TCOLOR *ret) /* 参数过滤 */ if(x>=GUI
43、_LCM_XMAX) return(0);if(y>=GUI_LCM_YMAX) return(0);/* 取得该点颜色(用户自行更改) */ *ret = gui_disp_bufyx;return(1);函数GUI_HLine(),功能实现画水平线,其中x0表示水平线起点所在列的位置 ,y0 表示水平线起点所在行的位置,x1表示水平线终点所在列的位置,color显示颜色(对于黑白色LCM,为0时灭,为1时显示) ,LCM初始化对于单色、4级灰度的液晶,可通过修改此函数作图提高速度,如色LCM,可以一次更新8个点,而不需要一个点一个点的写到LCM中。void GUI_HLine(uin
44、t32 x0, uint32 y0, uint32 x1, TCOLOR color) uint32 bak;if(x0>x1) / 对x0、x1大小进行排列,以便画图 bak = x1; x1 = x0; x0 = bak;Do GUI_Point(x0, y0, color);/ 逐点显示,描出水平线x0+;while(x1>=x0);函数GUI_RLine(),功能是实现画垂直线。其中x0表示垂直线起点所在列的位置,y0表示垂直线起点所在行的位置,y1表示垂直线终点所在行的位置, 对于单色、4级灰度的液晶,可通过修改此函数作图提高速度,如色LCM,可以一次更新8个点,而不需要
45、一个点一个点的写到LCM中。void GUI_RLine(uint32 x0, uint32 y0, uint32 y1, TCOLOR color) uint32 bak;if(y0>y1) / 对y0、y1大小进行排列,以便画图 bak = y1;y1 = y0;y0 = bak; do GUI_Point(x0, y0, color); / 逐点显示,描出垂直线y0+; while(y1>=y0);函数GUI_CmpColor(),其功能是判断颜色值是否一致,color1表示颜色值1,color2表示颜色值2,当出口参数返回1表示相同,返回0表示不相同。由于颜色类型TCOLO
46、R可以是结构类型,所以此处编写了比较函数。int GUI_CmpColor(TCOLOR color1, TCOLOR color2) if(color1=color2) return(1); else return(0);函数GUI_CopyColor(),其功能是进行颜色值复制,color1代表目标颜色变量,color2代表源颜色变量。由于颜色类型TCOLOR可以是结构类型,所以此处编写了复制函数。void GUI_CopyColor(TCOLOR *color1, TCOLOR color2) *color1 = color2; 附录三子程序GPIO_Initialize(),功能是初始
47、化触摸屏和蜂鸣器的GPIOvoid GPIO_Initialize(void)PINSEL0 = PINSEL0 & 0xFFFFCFFF;IO0DIR = BEEPCON;IO0SET = BEEPCON;IO2DIR = ADS7843_CS|ADS7843_DIN|ADS7843_DCLK; 函数Calibration(),功能是获取校准基准点坐标,其中uint16 *errx,用于保存校准点x坐标(LCD)的变量指针,uint16 *erry,用于保存校准点y坐标(LCD)的变量指针uint8 Calibration(void) uint16 sumx, sumy;uint16
48、 x, y, i;/* 获取左上角基准点 */GUI_HLine( 0, 19, 39, BLACK);GUI_RLine( 19, 0, 39, BLACK);sumx = 0;sumy = 0;for(i=0; i<16; i+)GetLCD_XY(&x, &y);sumx = sumx + x;sumy = sumy + y; errx1 = sumx >> 4;erry1 = sumy >> 4;GUI_HLine( 0, 19, 39, WHITE);GUI_RLine( 19, 0, 39, WHITE);if( (errx1<0x500) && (errx1>0x000) && (erry1<0x500) && (erry1>0x000) )Beep();elseBeep();Beep();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论