基于嵌入式的测控设备在扩展点阵液晶屏时需要使用液晶显示控制器
The Design and Display Management of LCD Display Unit in Embedded System
摘要 基于嵌入式的测控设备在扩展点阵液晶屏时需要使用液晶显示控制器,汉字字库的组织和各种图形的显示也是必做的工作。结合嵌入式微控制器LPC2148和S1D13305液晶控制器的显示模块,是一种较为实用的方法。设计了相应的接口电路和对比度数字调节等电路,将液晶屏设置为字符、图形和光标3层“逻辑或”叠加的图形方式,将16和24两种点阵字库存储于LPC2148的Flash内,设计了显示驱动程序,字符输出、图形绘制、光标管理及日历时钟管理的子程序库。实现了单色320×240点阵液晶的显示管理。
关键词 嵌入式;微控制器;液晶显示模块;字模;图形
Abstract A LCD controller is needed when a control and measure device based on embedded MCU expands lattice LCD display. It is necessary to arrange Chinese character mask database and draw graph. It should be an available method that combining embedded MCU LPC2148 and LCD display unit which based on LCD controller S1D13305. In this paper, the interface circuit, LCD digital contrast adjustment circuit, etc. was given. LCD screen was set to 3 graphics layers combining in logic OR mode. Character, graph and cursor pattern put to different layers. 16 and 24 dots character mask database was stored in Flash of LPC2148. The display driver software and subprogram including character printing, graph drawing, cursor management and calendar and time management was designed. Display management of a mono 320x240 dots LCD was realized.
Keywords embedded; MCU; LCD display unit; characters mask; graphics
0 引言
随着技术的进步和生产制作成本的不断降低,越来越多的自动化仪表和测控装置采用嵌入式微控制器作为CPU,而以点阵式液晶显示模块作为其输出终端设备。目前,嵌入式微控制器的性能越来越高,一般都具有较高的时钟频率、大容量的存储器、充足的IO接口和多种多样的外设接口,尤其是嵌入式编程和调试技术,使得嵌入式系统的设计和开发变得相对容易,功能更加丰富,表现出巨大的优越性。而LCD显示方式,具有功耗低、显示直观、信息量大、图形、中西文文字使用灵活,作为人机交互手段广受使用者青睐[1]。
LPC2148是PHILIPS公司的一款基于ARM7TDMI-S内核的64引脚小型32/16位微控制器[2][3],以3.3V单电源供电,60MHz的CPU频率,片内包括512KB的Flash和32KB的SRAM存储器、通用I/O接口、A/D和D/A转换器、定时器/计数器、RTC实时时钟、PWM、UART、USB、I2C、SPI、SSP等多种功能单元。但LPC2148未配置液晶控制单元,不便于直接连接LCD面板,为了实现320×240点阵LCD面板的控制,需要外置LCD控制器。NS320240单色图形点阵液晶显示模块,结合了S1D13305液晶控制器和LCD面板,与LPC2148的接口只需要12根IO线,设计与应用简单、方便。嵌入式系统采用LCD显示模块,功能强、功耗低、价格廉,对于一般工业测控设备,两者相得益彰。
1 NS320240显示模块
精电公司的NS320240显示模块,LCD屏幕为320×240点阵,能容纳20列×15行16×16点阵汉字。全透反显、蓝底白字显示方式。8080接口,8位并行数据,带驱动负压、对比度调节和LED背光。其结构如图1所示,引脚功能如表1所列。
图1 NS320240显示模块结构框图
表1 NS320240显示模块接口功能
S1D13305是一个支持图形、文本及图形/文本混合显示模式的LCD控制器[4],支持8080系列和6800系列接口,图形模式下可有3个独立而重叠显示的屏幕层,最大支持640×256显示分辨率,内含160个5×7点阵符号字库,支持外扩8×16点阵RAM字库和8×16点阵ROM字库。与8080系列接口时,按表2接受命令或控制,表中列出了几个主要命令码。
表2 S1D13305命令控制
显示模块配置32KB显示帧存RAM,满足3层图形最高分辨率的数据存储。设置为一层文本方式时,可直接写入代码显示英文字母、数字等符号。设置为图形方式时,帧存的每一个字节位表示屏幕上的一个像素点,该位为1时表示像素点点亮,一行320个像素,需40个字节,每一层9600字节。显示模块未提供汉字字库,中文显示需由外部(LPC2148)提供字模数据,在图形方式下,以描点的方式处理汉字的显示。
实际应用中,为了支持字符、图形及光标图案的同时显示,将S1D13305设置为三层“逻辑或”图形方式,不使用其内部字库,层L1为中英文字符层,层L2为图形层,层L3为光标图案层,光标层设置为2Hz闪烁方式。三层的帧存数据独立,因此字符、图形、光标可独立操控,不会相互影响,如图2所示,三层以“逻辑或”方式叠加。外部字库全部存储在LPC2148 Flash中,包括8×16、12×24点阵各128个字符字模数据,16×16、24×24点阵各多达512个汉字字模数据,共60KB。
图2 三层“逻辑或”方式
2 LPC2148与显示模块的硬件连接
图3 LCD显示模块与LPC2148硬件连接
一种接口设计方案如图3所示,LPC2148的12个引脚分别连接到显示模块的8条数据线和4条控制线,通过引脚连接模块寄存器PINSEL0和PINSEL1设置为GPIO的P0.10~P0.21功能,再通过IO方向寄存器IO0DIR将其中控制线P0.10~P0.13置为输出方式,而数据线P0.14~P0.21在写命令和数据时置为输出方式、在读状态和读数据时置为输入方式。LPC2148对LCD的各种显示操控都由这12条GPIO接口线完成。
显示模块的复位线、LED背光均接至3.3V电源,即不用硬件复位,而通过下传命令实现LCD复位。LED背光也可接至另一个GPIO接口,用屏幕保护功能进一步降低功耗。
LCD的对比度调节由V0引脚输入可调负电压实现,显示模块Vout提供-23V电源。使用中设计一反相放大电路,由LPC2148的DA转换输出1.2~2V电压,变换后输出-10~-16V至V0,从而形成数字调节LCD显示对比度。
时钟电路用外部晶振11.0592MHz,经内部PLL电路调整为约55MHz的CPU操作时钟频率,同时支持ISP下载功能。系统复位电路采用带I2C存储器的电源监控芯片CAT1025,提高系统的可靠性。
3 LCD的软件设计
软件用C语言设计,在Keil uVision 3开发环境下编译调试,包括驱动程序和显示管理子程序库,应用程序通过调用显示管理子程序实现。主要驱动程序包括LCD写命令、写数据、读数据、初始化等操作,举例如下。
#define LCD_WR (1<<13) // P0.13
#define LCD_RD (1<<12) // P0.12
#define LCD_CE (1<<11) // P0.11
#define LCD_A0 (1<<10) // P0.10
void LCD_WriteCMD(uint32 cmd) // 写命令
{ IO0PIN = (IO0PIN & ~(0xFF << 14)) | (cmd << 14); // 输出命令吗
IO0SET = LCD_A0 | LCD_RD; // A0、 置高
IO0CLR = LCD_CE | LCD_WR; // 、 置低
IO0SET = LCD_WR | LCD_CE; // 、 置高
}
uint32 LCD_ReadData(void) // 读数据
{ uint32 t32;
IO0DIR = IO0DIR & ~(0xFF << 14); // 置P0.14~P0.21为输入
IO0SET = LCD_A0 | LCD_WR; // A0、 置高
IO0CLR = LCD_CE | LCD_RD; // 、 置低
t32 = (IO0PIN >> 14) & 0xFF; // 得到数据
IO0SET = LCD_CE | LCD_RD; // 、 置高
IO0DIR = IO0DIR | (0xFF << 14); // 置P0.14~P0.21为输出
return(t32);
}
void LCD_Init(void) // 初始化
{ // 设置P0.10~P0.21的GPIO功能和输出方向
// 写SYSTEM SET命令,置系统参数
// 写SCROLL和OVLAY命令,置3层“逻辑或”重叠图形模式
// 帧存写0,清LCD屏幕
// 开显示、开LED背光、对比度置中
}
设计的LCD子程序包括字符输出、图形绘制、光标管理、日历时钟显示管理等,如图4所示,举例如下。
图4 LCD子程序库
void LCD_printf(uint32 x, uint32 y, uint32 type, uint32 mode, ...); // 在坐标(x, y)处按printf( )函数输出,type选择字体大小,mode选择正反转
void LCD_Line(uint32 x1, uint32 y1, uint32 x2, uint32 y2, int32 op); // 两点(x1, y1)和(x2, y2)间画直线,op选择画或擦除
void LCD_Bar(uint32 x1, uint32 y1, uint32 x2, uint32 y2, int32 op); // 对角点(x1, y1)和(x2, y2)间画填充矩形
void LCD_Arc(uint32 x0, uint32 y0, uint32 r, uint32 a, uint32 b, int32 op); // 画圆弧,圆心(x0, y0),半径r,起、止角a、b
国标汉字字库包括6千多个字符,这里不可能也不必要将全部字模数据存储在LPC2148内。设计中根据实际使用到的汉字码,在PC上编程抽取字模,分为编码检索表和字模表存储Flash中。编码按内码大小顺序排列,字库检索时用对分法查表,然后得到字模数据。字符的反转显示,即是将字模的0和1全部取反后得到。图形函数为基本功能,由此可组合出更复杂的其它功能。对于一般工业监控场合,这些字符和图形功能已经足够使用了。
设计中注意到,由于各种图形(包括文字和光标)在屏幕上可以任意定位,因此大多时候向LCD帧存写入的并不是整字节数据,需要先读出帧存中相关的字节值,只修改所涉及到字节位,然后再写回到帧存。这样会降低总体处理速度,所以应尽可能判断出字节交界处,然后对整字节操作集中处理。超出显示区域的内容不作处理。
光标用于人机交互时的操作指示,文本光标一般需要闪烁。设计了大、小十字,横、竖线段、块形,箭头,手形等多种图案供使用。由于LCD中光标在单独的图形层,它的移动操作程序设计比较简单,闪烁则由S1D13305硬件完成。
日历时钟在每秒中断处理程序中实现,需要尽可能快的处理速度,同时避免在主程序显示字符时发生中断导致函数重入,日历时钟的字模和显示处理另外考虑。只取“0”~“9”、“一”~“六”、“日”、“–”、“:”等字符字模,将它们等高处理后,去掉多余的空字节。屏幕上定位后,先将字模数据做字节完整性剪裁,显示时全部采用整字节输出操作。
4 结语
本文所介绍的软、硬件设计以及单色点阵字符、图形显示方法也适用于其它类型微控制器的应用,适合于其他类型的LCD显示模块。对于多色或彩色LCD,也可方便地进行修改和移植。LPC2148没有内置LCD控制器,但有512KB大容量的Flash存储空间;S1D13305液晶控制器没有汉字字库,但具有多层图形叠加、图形滚动、闪烁等特点,两者的结合充分发挥了各自的优势。
本文作者创新点:介绍一种LCD显示模块与一款基于ARM内核的嵌入式微控制器的接口设计,设计了驱动程序及中西文字符显示、各种图形绘制、光标管理、日历时钟管理等子程序库。以此为基础的工业测控设备人机交互界面的开发将简单、灵活、高效。