基于ARM的触摸屏控制
摘要:本文介绍了基于ARM的触摸屏控制的设计思路、原理和实现方法。硬件电路主要由PHILIPS公司的ARM7TDMI-S微控制器LPC2290,FM7843控制器和SID13503控制器构成。利用C语言编写驱动和用户程序,通过触摸屏的FM7843控制器将触摸信号进行A/D转换,进而利用ARM芯片和彩色液晶屏SID13503控制器,将触摸动作在液晶屏上进行显示,最终实现了触摸屏和液晶屏的控制。该设计操作直观、简单、功耗小、提高了人机交互的友好性。
关键词:触摸屏; 液晶屏; ARM
The Control of Touch-screen Based on ARM
Abstract: 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 compose 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 design 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
1
目 录
摘要……………………………………………………………………………………………1 1 引言……………………………………………………………………………………3 2 总体设计……………………………………………………………………………………3 3 硬件设计部分……………………………………………………………………………3 3.1 彩色液晶显示器………………………………………………………………………3 3.2 彩色液晶屏驱动电路及SID13503控制器 ………………………………………………4 3.3 触摸屏原理..……………………………………………………………………………5 3.4 触摸屏驱动电路及FM7843控制器………………………………………………………5 4 软件设计部分................…………………………………………………………………6 4.1 触摸屏驱动程序设计....…………………………………………………………………6 4.2 彩色液晶屏驱动程序设计…………………………………………………………8 4.3 用户程序...………………………………………………………………………………..11 5 总结..………………………………………………………………………......13 参考文献………………………………………………………………………………14 附录一…………………………………………………………………………………………15 附录二…………………………………………………………………………………………18 附录三…………………………………………………………………………………………22 附录四…………………………………………………………………………………………26
2
1 引言
随着信息产业的迅猛发展,由于触摸屏操作直观、简单、功耗小、有利于提高人机交互的友好性等优点,而逐渐取代鼠标、键盘,在人机交互中成为主要输入设备[1]。因此LCD触摸屏变得也越来越普及,并成为当今的主流配置。而目前对触摸屏的研究性价比有所欠缺,人机交互的友好性体现不够,功耗较大,占用空间多,并且大部分来自国外且价格不菲,而本文利用PHILIPS公司的LPC2290芯片,极好的解决了这些缺点,设计出了性价比高、屏幕显示无闪烁、画面切换速度快、占用空间少、方便灵活、人机交换互性好、低功耗、快速准确的触摸屏系统。
2 总体设计
系统的总体设计框图如图1所示。
彩色液晶屏作为人机交换的最直接的交互画面,通过其内部的液晶屏控制器SID13503与LPC2290芯片相连,采用并行接口进行数据传送,对当前的触摸信息进行显示。
触摸屏紧贴在液晶显示屏的外表面,而触摸屏作为一种人机交换设备,当用户在触摸屏上有触摸动作时,触摸屏控制器通过A/D转换,将触摸信息传递给LPC2290芯片,LPC2290芯片处理信息后,控制液晶显示器进行相应的画面更新动作,实现人机交换功能。
液晶屏控制器SID13503LPC2290ARM触摸屏控制器FM843彩色液晶屏触摸屏
3
图1 系统的总体框图
3 硬件设计部分
3.1 彩色液晶显示器
液晶是一种在一定温度范围内呈现出即不同于固态、液态,又不同于气态的特殊物质,它即具有各向异性的晶体所特有的双折射性,又具有液体的流动性。液晶显示器件(英文简写为LCD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件[2]。液晶显示器是平板显示器件中的一种,具有低工作电压、微功耗、无辐射、小体积等特点,被广泛应用于各种各样嵌入式产品中。
本设计所用的点阵式图形液晶显示屏是LCD的一种,能够动态显示图形、汉字以及各种符号信息,为各种电子产品提供了友好的人机界面。随着STN和TFT液晶显示技术的成熟发展及制造成本的不断降低,点阵式图形液晶显示屏也就成为了嵌入式系统中最主要的图形显示设备。
3.2 彩色液晶屏驱动电路及SID13503控制器
本设计使用5.2英寸320x240彩色液晶屏,由于液晶屏内部没有液晶控制器,而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位总线方式操作SID13503(高8位数据被忽略)。 SID13503有两个片选引脚,一个是I/O片选引脚(用于内部寄存器操作),另一个是存储器片选引脚(用于显示存储器操作),所以用了IO_nCS3,IO_nCS2两个片选信号与其连接。如图2所示,当IO_nCS3 为低电平时,信号nIOCS有效,所以内部寄存器的起始地址为0x83800000;当IO_nCS2为低电平时,信号nMEMCS 有效,所以显示存储器的起始地址为0x83400000[3.2]。为了使用I/O接口呈现直接访问方式,故将SID13503的VD1接了一个10kΩ的上拉电阻。
在接5V电源时,SID13503的VIH=2V,所以可以直接使用LPC2290的总线与它相连,不需要加电平转换电路。由于SID13503使用的电源是5V,而LPC2290的I/O电压为3.3V,所以在数据总线上串接470Ω的保护电阻。
图2的具体详细电路见附录四
4
图2 彩色液晶屏驱动电路
3.3 触摸屏原理
触摸屏采用四线电阻式触摸屏(示意图如图3所示,测量原理如图4所示),四线电阻式触摸屏是电阻式家族中应用最广、最普及的一种[4],其由两个透明层构成,其中一层在屏幕的左右边缘各有一条垂直总线,另一层在屏幕的底部和顶部各有一条水平总线
[5]
。透明层的内表面均涂了薄薄一层导电材料,当触摸屏表面受到的压力(如通过触笔
或手指进行按压)足够大时,顶层与底层之间会产生接触,从而使电阻层发生接触。当在Y方向的电极对上施加一确定的电压,而X方向电极对上不加电压时,在Y平行电压场中,触点处的电压值可以在X+(或X-)电极上反映出来,通过测量X+电极对地的电压大小,便可得知触点的Y坐标值。同理,当在X电极对上加电压,而Y电极对上不加电压时,通过测量Y+电极的电压,便可得知触点的X坐标。
X层Y层Y-VccR1 触摸点(P) 触摸点(P)到A/DX+Vcc Y+Y-R2GND X-X+Y-Y+ Y+ 到A/D X+ Y-GND X-X-X+Y层X层Y+R3R4
图3 四线电阻式触摸屏结构示意图 图4 四线电阻式触摸屏测量原理
3.4 触摸屏驱动电路及FM7843控制器
5
彩色液晶屏上带有触摸屏(四线电阻式触摸屏),用于检测屏幕触摸输入信号,有利于提高人际交互性的友好性。因此在使用触摸屏时,须要一个A/D转换器将模拟信号转换成数字信号,这里使用触摸屏控制器FM7843来完成这一功能,其A/D转换精度有8位和12位,本设计利用12位精度。在进行A/D转换后,通过SPI接口把转换结果输出到LPC2290。FM7843的工作电源为2.7-5V,这里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]。
函数DelayNo(),用来实现短软件延时,延时参数值越大,延时越久。 函数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位的转换结果,返回值为读出的数据。
6
#include \
#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() IO2CLR = FM7843_DCLK /* 操作时序控制宏(即延时控制值) */ #define DELAY_200NS
5
/*实现短软件延时,延时参数值越大,延时越久*/
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 FM7843_IOInit(void) {
FM7843_CSS(); // CS = 1 FM7843_DCLKC(); // DCLK = 0 FM7843_DINC();
// DIN = 0
DelayNo(DELAY_200NS);
7
}
/*对FM7843的PENIRQ引脚测量,返回当前此引脚的电平值, 返回为0表示PENIRQ为低电平状态,否则为高电平*/ FM7843_IRQR() {
…….见附表一 }
/*对FM7843进行读写操作。作按照FM7843规定,24Clocks,先写8位控制数据,然后读取12位的转换结果,返回值为读出的数据。*/ FM7843_WriteRead() {
……见附表一
}
4.2 彩色液晶屏的驱动程序设计
库文件config.h中包含了对SID13503的最基本的定义。
LCDDRIVE.C是彩色液晶屏的驱动程序,功能是实现彩色液晶屏的驱动程序通过操作彩色液晶屏控制器SID13503,控制256色RGB伪彩色液晶显示屏,其中使用LPC2290芯片控制,8位总线接口,SID13503的寄存器地址为0x838000xx,显示存储器的地址为0x834xxxxx[7]。
显示缓冲区的定义(见附表一)。
S1D13503_Init()是彩色液晶屏控制器的寄存器初始化函数(见附表一),其功能对彩色液晶屏控制器SID13503寄存器0--D进行初始化(使用查表方法),彩色液晶屏型号为320*240 ,256色单屏彩屏。其中同样使用了函数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为要填充的颜色数据。
LCD_UpdatePoint()是LCD的画图函数, 功能是实现在指定位置上画点,并刷新某一点,x表示指定点所在列的位置,y表示指定点所在行的位置,当画点在指定地址时,实现其功能,当指定地址超出有效范围,则操作失败。
8
与LCM相关的GUI接口函数(见附表二) #include \{ ......
/* 定义显示缓冲区(可根据情况定义或直接使用LCM显示存储空间) */ 见附表一 }
/* 对彩色液晶屏控制器SID13503寄存器0--D进行初始化*/ S1D13503_Init(void) {
...... 见附表一 }
/*初始化彩色液晶屏控制器SID13503的调色板*/ void S1D13503_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_TAB[i]; // 设置红色调色板 *REG_Point2 = LUT_GRN_TAB[i]; // 设置绿色调色板 *REG_Point2 = LUT_BLU_TAB[i]; // 设置蓝色调色板
} }
/* 实现LCM初始化,将LCM初始化为纯图形模式*/ void LCD_Initialize(void) {
S1D13503_Init();
// 初始化LCM工作模式
9
S1D13503_LutInit(); // 初始化调色板 }
/* 实现LCD以图形方式进行填充,填充起始地址为0X0000,dat为要填 充的颜色数据*/
void LCD_FillAll(TCOLOR dat) {
volatile uint16 *DAT_Point;
uint32 i, j; /* 开始复制填充数据 */
DAT_Point = (void *) S1D13503_DAT; for(i=0; i for(j=0; j { *DAT_Point++ = dat; } } } /* 实现在指定位置上画点,并刷新某一点,x表示指定点所在列的位置,y表示指定点所在行的位置,当画点在指定地址时,实现其功能,当指定地址超出有效范围,则操作失败*/ void LCD_UpdatePoint(uint32 x, uint32 y) { volatile uint16 *DAT_Point; uint32 addr; 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_buf[y][x]; } 10 // 置地址指针 // 历遍所有行 // 历遍所有行 // 输出数据 {..... /*与LCM相关的GUI接口函数*/ 见附表二 } 4.3 用户程序 本程序实现读取触摸屏的动作,并显示一个方点在对应的液晶屏幕上。程序运行时,首先进行必要的初始化[8],即初始化GPIO、初始化LCM、将液晶屏片选信号CS置低、填充液晶屏幕背景色并校准屏幕,然后判断是否有触摸动作,如没有则继续等待,直到有触摸输入时,读取触摸动作并判断触摸是否有效,如无效则返回继续等待触摸,若有效,蜂鸣器响一声,获取当前触摸坐标并进行校准,最后将触摸结果在液晶屏上显示。流程图如图6所示。 开始初始化GPIO初始化LCM填充屏幕背景色校准屏幕判断下一次触摸液晶屏显示通过基准点校准Y通过基准点校准X获取当前坐标蜂鸣器响一声 触摸?否 无效是 判断触摸是否有效 有效 图6 用户程序流程图 #include \ void GPIO_Initialize(void); void GetLCD_XY(uint16 *vx, uint16 *vy); void DelayNS(uint32 dly); uint8 Calibration(void); 11 uint16 errx1, erry1, errx2, erry2; // 一般存放基准点坐标 uint16 diffx, diffy; // 一般存放基准点坐标差值 uint16 x, y; // 一般存放当前坐标 本段程序名称main,其为程序的主函数,功能包括GPIO和LCM的初始化,填充颜色,校准屏幕,获取当前坐标,并进行显示[9]。 int main (void) { GPIO_Initialize(); // 初始化GPIO GPIO GUI_Initialize(); // 初始化LCM GUI_FillSCR(WHITE); // 填充白色背景 while(Calibration() != 1); // 校准屏幕 while(1) { GetLCD_XY(&x, &y); // 获取当前坐标 x = (x - errx1) * 280 / diffx + 20; // 通过基准点校准x y = (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); 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(),功能是初始化触摸屏和蜂鸣器的GPIO void GPIO_Initialize(void) { 12 …… 见附录三 } 函数Calibration(),功能是获取校准基准点坐标,其中uint16 *errx,用于保存校准点x坐标(LCD)的变量指针,uint16 *erry,用于保存校准点y坐标(LCD)的变量指针 uint8 Calibration(void) { …… 见附录三 } 函数GetLCD_XY(),功能是读取触摸屏上触摸点的坐标,在读取过程中,程序会一直等待,直到有触摸输入[10]。其原理是先通测量y轴的触摸输入,判断是否有触摸动作。如果有,则行6次数据采集,并进行去极值平均滤波处理。最后还要判断触摸输入是否合法,只有当触摸输入合法时才返回。其中,x用于保存触摸点x坐标(LCD)的变量指针 ,y用于保存触摸点y坐标(LCD)的变量指针。 void GetLCD_XY(uint16 *vx, uint16 *vy) { …… 见附录三 } 本程序名称为DelayNS(),功能是实现长软件延时(dly毫秒,与程序运行速度有关),消除震颤,其中dly为延时参数,值越大,延时越久。 void DelayNS(uint32 dly) { …… 见附录三 } 函数Beep(),其功能实现控制蜂鸣器响一声。 void Beep(void) { …… 见附录三 } 五 总结 本设计使用PHILIPS公司的LPC2290的ARM 单片机,从触摸屏和液晶显示器的性能方面为出发点,通过C语言编程,来设计实现的四线电阻式触摸屏产品在实际应用中得到了很好的效果,实现了先进的触摸屏显示、控制技术,改善了传统的设备显示与控制方式,性价比高,低功耗,提高了人机交互的友好性,使设备更加人性化,有很强的应用 13 前景,相信其会变得也越来越普及,并成为当今的主流配置。 参考文献 [1] 欧庆于等. 基于S3C44B0X+uClinux的触摸屏设计. 计算机与数字工程[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].北京:北京航空航天大学出版社,2003: 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) 14 { uint8 dat[3]; DelayNo(1); if(IO0PIN&ADS7843_IRQ) dat[0] = 1; else dat[0] = 0; if(IO0PIN&ADS7843_IRQ) dat[1] = 1; else dat[1] = 0; if(IO0PIN&ADS7843_IRQ) dat[2] = 1; else dat[2] = 0; if((dat[0] + dat[1] + dat[2]) > 1) return(1); else return(0); } 函数ADS7843_WriteRead(),功能是对ADS7843进行读写操作。uint16 ADS7843_WriteRead(uint8 data) { uint8 i; uint16 ret_dat; data = data|0x80; // 设置S位 ADS7843_IOInit(); ADS7843_CSC(); // CS = 0 for(i=0; i<8; i++) { if( (data&0x80) != 0 ) ADS7843_DINS(); // DIN = 1 else ADS7843_DINC(); // DIN = 0 DelayNo(DELAY_200NS); ADS7843_DCLKS(); // DCLK = 1 DelayNo(DELAY_200NS); ADS7843_DCLKC(); // DCLK = 0 data = data<<1; } ADS7843_DINC(); // DIN = 0 DelayNo(DELAY_200NS * 3); ADS7843_DCLKS(); //DCL=1DelayNo(DELAY_200NS); ADS7843_DCLKC(); // DCLK = 0 15 ret_dat = 0 for(i=0; i<12; i++) { ret_dat = ret_dat<<1; DelayNo(DELAY_200NS); ADS7843_DCLKS(); // DCLK = 1 if( ADS7843_DOUTR() != 0 ) ret_dat = ret_dat | 1; DelayNo(DELAY_200NS); ADS7843_DCLKC(); } for(i=0;i<3;i++) { DelayNo(DELAY_200NS); ADS7843_DCLKS(); DelayNo(DELAY_200NS); ADS7843_DCLKC(); } DelayNo(DELAY_200NS); ADS7843_CSS(); return(ret_dat); } // DCLK = 0 if(i==6) DelayNo(DELAY_200NS * 2); // DCLK = 1 // DCLK = 0 // CS = 1 #include \ /* 定义显示缓冲区(可根据情况定义或直接使用LCM显示存储空间) */ TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX]; uint8 const INIT_TAB[14] = { 0x00, // 寄存器0 -- 00000000B (正常工作模式,即非测试模式) 0xBD, // 寄存器1 -- 10111101B (模式控制:打开显示单屏,屏蔽XSCL水平非显示周期输出,使能LCDENB,彩色8位LCD数据--无XCSL2,16位显示存储数据总线方式) 159, // 寄存器2 -- 159 (行字节控制)(每行显示占用的存储器字节数,即列参数) 0x0E, // 寄存器3 -- 00001110B (非节功模式,256彩色方式) 239, // 寄存器4 -- 239 (总行数) 0, // 寄存器5 -- 0 (WF翻转周期,为0时表示每一帧WF输出翻转一) 16 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 (显示域冗余宽度,正常操作模式) }; 函数S1D13503_Init(),功能是初始化S1D13503。 void S1D13503_Init(void) { volatile uint16 *REG_Point; uint8 i; REG_Point = (void *) S1D13503_REG; for(i=0; i<14; i++) { *REG_Point = INIT_TAB[i]; // 查表取出数据,然后赋值给S1D13503相应的寄 存器,实现初始化 REG_Point++; } } uint8 const LUT_RED_TAB[16] = { 0, 3, 5, 7, 9, 11, 13, 15, 0, 3, 5, 7, 9, 11, 13, 15 }; uint8 const LUT_GRN_TAB[16] = { 0, 3, 5, 7, 9, 11, 13, 15, 0, 3, 5, 7, 9, 11, 13, 15 }; uint8 const LUT_BLU_TAB[16] = { 0, 6, 10, 15,0, 6, 10, 15,0, 6, 10, 15 }; 附录二 与LCM相关的GUI接口函数 函数本段程序名称GUI_FillSCR(),其功能实现全屏填充,即直接使用数据填充显 17 // 共初始化14个寄存器 // 指向下一寄存器 示缓冲区,dat表示填充的数据 void GUI_FillSCR(TCOLOR dat) { uint32 i, j; /* 填充缓冲区 */ for(i=0; i for(j=0; j gui_disp_buf[i][j] = dat; } } /* 填充LCM */ LCD_FillAll(dat); } 函数GUI_Initialize(),其功能初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。 void GUI_Initialize(void) { LCD_Initialize(); // 初始化LCM模块工作模式,纯模式 // 初始化缓冲区为0x00,并输出屏幕 (清屏) } 函数GUI_ClearSCR(),其功能进行清屏。 void GUI_ClearSCR(void) { GUI_FillSCR(0x00); } 函数GUI_Point(),其功能实现在指定位置上画点,x表示指定 在列的位置,y指定点所在行的位置,color表示显示颜色(对于黑白色LCM 为0时灭,为1时显示) ,返回值为1时表示操作成功,为0时表示操作( 作失原因是指定地址超出有效范围)。 18 // 历遍所有行 // 历遍所有行 UI_FillSCR(0x00); uint8 GUI_Point(uint32 x, uint32 y, TCOLOR color) { /* 参数过滤 */ if(x>=GUI_LCM_XMAX) return(0); if(y>=GUI_LCM_YMAX) return(0); /* 设置缓冲区相应的点 */ gui_disp_buf[y][x] = 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_LCM_XMAX) return(0); if(y>=GUI_LCM_YMAX) return(0); /* 取得该点颜色(用户自行更改) */ *ret = gui_disp_buf[y][x]; return(1); } 函数GUI_HLine(),功能实现画水平线,其中x0表示水平线起点所在列的位置 ,y0 表示水平线起点所在行的位置,x1表示水平线终点所在列的位置,color显示颜色(对于黑白色LCM,为0时灭,为1时显示) ,LCM初始化对于单色、4级灰度的液晶,可通过修改此函数作图提高速度,如色LCM,可以一次更新8个点,而不需要一个点一个点的写到LCM中。 void GUI_HLine(uint32 x0, uint32 y0, uint32 x1, TCOLOR color) { uint32 bak; if(x0>x1) { 19 // 对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个点,而不需要一个点一个点的写到LCM中。 void GUI_RLine(uint32 x0, uint32 y0, uint32 y1, TCOLOR color) { uint32 bak; if(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表示不相同。由于颜色类型TCOLOR可以是结构类型,所以此处编写了比较函数。 int GUI_CmpColor(TCOLOR color1, TCOLOR color2) 20 // 逐点显示,描出水平线 // 对y0、y1大小进行排列,以便画图 // 逐点显示,描出垂直线 百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库基于ARM的触摸屏控制模板在线全文阅读。
相关推荐: