当前位置:首页 > 嵌入式 > 嵌入式硬件

介绍一种基于AVR单片机和硬件汉字库的VRAM 型彩色液晶显示模块的设计。给出彩色液晶显示器的显示原理、硬件接口设计框图以及硬件汉字库的制作和应用,同时给出基于C语言的程序设计模块,实现了应用VRAM 型液晶的模块化,便于移植在其他类型的单片机。

  1  引言

  随着电子技术的飞速发展,越来越多的领域应用到以单片机为控制核心、用液晶作为显示终端的数字化设备。彩色液晶显示器作为当代高新技术的结晶产品,不但具有超薄平面、显示信息丰富、色彩逼真的特点,而且还具有体积小、耗电省、寿命长、无辐射、抗震、防爆等其他类型显示器无可比拟的优点,因而是工控仪表、机电设备等行业更新换代的理想显示器件。因此基于单片机系统的彩色液晶显示模块的使用也越来越广泛。本文介绍一种基于AVR 单片机和硬件汉字库的彩色液晶显示模块,该模块实现了在彩色液晶显示器上显示不同颜色的中文、英文、数字及简单的画图功能。

  2  液晶显示器显示原理

  本模块采用的液晶显示器是河南友利华高科技有限公司生产的YD2502 彩色液晶VRAM 型显示器。它的点阵数是320 ×240 ,VRAM 容量是64 k ×8 位,由于屏幕上的任何一点都是由R(红) 、G(绿) 、B(蓝) 3 种颜色组成,且灰度不可调节,因此显示颜色为8 色。基本原理框图如图1所示。DC/ DC 转换器产生液晶所用各种驱动电压,DC/ AC 逆变器则用来点亮冷阴极背光灯, 显示驱动逻辑电路采用了优化逻辑电路,利用分时技术让显示与写入数据同时进行,实现了画面的高速更新,且互不干扰。其显示原理是:在显示器内部含有一个显示缓冲区与屏幕显示一一对应,使用时只需向缓冲区里写入相应的数据,屏幕上即可显示出对应的彩色图形或文字,也就是说该显示器可作为单片机系统的一个外部存储器就可以实现彩色信息的显示。

图1  YD2502 原理框图

  3  硬件系统设计

  3. 1  硬件总体设计

  本模块中使用的单片机是AVR 系列单片机中功能最强的A Tmega128 。该单片机具有丰富的片上资源如具有128 kB 在线可重复编程Flash、4 kB 的E2 PROM、4 kB 的内部SRAM、48 个I/ O 端口、34 个不同的中断源、可寻址64 kB 的地址空间、ISP 下载以及J TA G 仿真等功能。详细介绍请参考其数据手册。

  图2 是该模块硬件系统总体设计框图。由于YD2502 的显示缓冲区里的内容是不能读出的,为了保存写入内容,在该模块中还外扩了一片存储器芯片61LV5128 ,其存储容量为512 kB ,除了保存YD2502 显示缓冲区里的数据外,还为使用本模块的嵌入式系统提供了扩展应用。由于A Tmega128 的寻址范围只达到64 KB ,因此采用了分页管理技术来操作512 kB 的存储空间。在具体电路设计时,将A Tmega128 的PB3 ~ PB0连接到61LV5128 的高4 位地址线上,将512 kB的存储空间分成16 页,每页32 kB。硬件汉字库芯片AT29C040A 的存储容量也是512 kB ,与CPU的接口设计与61LV5128 是类似的,只需将片选信号和高4 位地址线接在不同的I/ O 口上就可以了。

图2  硬件设计图

3. 2  YD2502 的接口设计

  YD2502 的接口方式采用总线方式,外部引线包括数据总线(DB7~DB0) 、片选信号(/ CS) 、读写输入(/ RD、/ WR) 和寄存器选择信号(RS) ,可以直接挂接到单片机的总线上,作为单片机的某部分内存来使用。接口采用16 针插座,引脚定义请参阅其说明书。

  根据YD2502 可以作为单片机的外部存储器使用的接口特性,将A Tmega128 的读写信号线与YD2502 的读写信号线直接连接,具体接口设计原理如图3 所示。

图3  AT128 与YD2502 的接口

  3. 3  硬件汉字库的制作

  本模块使用了硬件汉字库,省去了利用汉字取模软件获取点阵数据的麻烦,而且还避免了为保存这些数据而开辟的大量程序存储空间。

  汉字库中要烧写的点阵文件是UCDOS 软件中的文件HZK16 ,该文件是16 ×16 的国际汉字点阵文件,文件中按汉字区位码从小到大依次存放国标区位码表中的所有汉字,每个汉字占用32字节,每个区为94 个汉字。汉字库芯片采用的是AT29C040A ,该芯片是ATMEL 公司生产的512 kB的Flash ROM。在制作时,烧写过程和普通的程序存储器的编程基本相同,只要注意选择正确的型号和在选择打开HZK16 的方式时用二进制方式就可以了,编程校验成功后,取下备用,硬件汉字库芯片就制作好了。

  实际上若显示HZK16 的文件属性,其大小为262 kB ,而AT29C040A 的存储容量为512 kB ,超出部分可以存储用户固定的汉字、字母和数字的代码,从而使显示内容更加灵活丰富。4  软件系统设计及实现

  4. 1  操作YD2502 的程序设计

  YD2502 的指令码格式如下:

  其中: CA1 ,CA0 组合功能为内部寄存器通道的选择,功能如下:

  DISP :显示控制位。

  当DISP 设置为“1”时,液晶显示模块为开显示状态。

  当DISP 设置为“0”时,液晶显示模块为关显示状态。

  X:表示未用位,可设为“0”。

  ATmega128 访问外部存储器的软件设计步骤是:先用extern 声明一个外部变量,再用map2ping_init 函数(外部存储地址分配函数) 分配给此变量一个外部存储地址(因A Tmega128 内部有4 kB 的SRAM 所以外部存储地址范围为1000H~0FFFFH) ,那么对该变量的操作就实现了CPU 对相应地址的外部存储空间的访问。

根据此步骤,对YD2502 写指令和写数据的具体函数如下:

  extern unsigned char LCD_DA TA ;

  void  mapping_init (void) {

  asm(“。 area memory (abs) n”

  “。 org 0x4000n ”  / / 分配给LCD_DA TA 的地址为4000H

  “ _LCD_DA TA : : . blkb 1 n”/ / 存储空间为1

  “。 text/ n”) ;}

  写指令函数如下:

  void  LCD_writeinstr (unsigned char data) {

  PORTD & = 0xFC ;    / / 置/ CS 为低电平,并且置RS 为低电平,处于写指令状态

  LCD_DA TA = data ; / / 送数据

  PORTD | = 0x03 ;} / / 置/ CS 和RS为高电平

  写数据函数如下:

  void  LCD_writedata (unsigned char data) {

  PORTD & = 0xFE ;   / / 置/ CS 为低,并且置RS 为高电平,处于写数据状态

  LCD_DA TA = data ; / / 送数据

  PORTD | = 0x01 ;} / / 置/ CS 为高电平除了上面两个基本的函数外,对YD2502 最基本的操作是往VRAM 里写数据,根据上面给出的指令码,具体函数如下:

  # define  HREG   0x09  / / 显示地址高8 位寄存器指令

  # define  L REG 0x08 / / 显示地址低8 位寄存器指令

  # define  DA TARW 0x0A / / 显示数据读写通道指令

  void  LCD_filldata ( unsigned int address ,

  unsigned char data) {

  unsigned char addrh ,addrl ;

  addrh = (char) (address > > 8) ;  / / 取内存地址的高8 位数据

  addrl = (char) (address &0xFF) ;  / / 取内存地址的低8 位数据

  LCD_writeinst r ( HREG) ;  / / 送显示地址高8 位寄存器指令

  LCD_writedata (addrh) ;  / / 送内存地址的高8 位数据

  LCD_writeinst r (L REG) ;  / / 送显示地址低8 位寄存器指令

  LCD_writedata (addrl) ;  / / 送内存地址的低8 位数据

  LCD_writeinst r (DA TARW) ;  / / 送显示数据读写通道指令

  LCD_writedata (data) ;}  / / 送数据

  4. 2  画点函数的实现

  要在液晶上实现显示字符和画图等功能,在屏幕上显示一个点是实现这些功能的基础。画点函数实现的步骤是:首先确定该点对应的VRAM中的内存位置,找到该点具体对应的数据位,填充显示颜色的数据,该点就按对应的颜色显示出来了。

  4. 2. 1  显示内存与屏幕点阵的对应关系

  YD2502 屏幕点阵为320 ×240 ,每一个点对应3 个像素(RGB) ,屏幕上8 个点对应内存3 个字节,一行对应320/ 8 ×3 = 120 个字节,其对应关系如下:

  其中R ,G,B 表示红、绿、蓝三原色,D7~D0 表示对应的数据位。

对于屏幕上坐标为( X , Y) 的点,其对应内存地址的计算方法为:

  当Y = 0 时  SRAM = 0EFH ×100H +[ IN T( X/ 8) ] ×3

  当Y > 0 时  SRAM = ( Y - 1) ×100H +[ IN T( X/ 8) ] ×3

  通过( X/ 8) 的余数得出具体的内存位置:

  当余数为0  则 RAM = SRAM  [ 1110 ,0000 ]

  当余数为1  则 RAM = SRAM  [ 0001 ,1100 ]

  当余数为2  则 RAM1 = SRAM  [ 0000 ,0011 ]

  RAM2 = SRAM + 1[1000 ,0000 ]

  当余数为3  则 RAM = SRAM + 1[0111 ,0000 ]

  当余数为4  则 RAM = SRAM + 1[0000 ,1110 ]

  当余数为5  则 RAM1 = SRAM + 1[0000 ,0001 ]

  RAM2 = SRAM + 2[1100 ,0000 ]

  当余数为6  则 RAM = SRAM + 2[0011 ,1000 ]

  当余数为7  则 RAM = SRAM + 2[0000 ,0111 ]

  其中[ ]内为“1”的位表示应该填充颜色的位置, SRAM 表示该点对应的基础地址, RAM、RAM1 和RAM2 表示该点对应的实际内存地址。

  当数据位为“1”时,对应色点为亮;为“0”时,对应色点为暗。通过RGB 三原色组合而得到的8 种颜色代码如下:

  例1 :若X 、Y 坐标为(7 ,0)

  SRAM = 0EFH ×100H + 0 = 0EF00H

  余数为7 ,则 RAM = 0EF00H + 2 = 0EF02H

  若此点为红色,则送入0EF02H 内存单元里的数据为[ 0EF02H] &11111000B + 00000100B

  例2 :若X 、Y 坐标为(15 ,5)

  SRAM = (5 - 1) ×100H + 1 ×3 = 403H

  余数为5 ,则 RAM1 = 403H + 1 = 404H

  RAM2 = 403H + 2 = 405H

  若此点为白色,则送入这两个单元的数据为

  [ 404H] &11111110B + 00000001B

  [ 405H] &00111111B + 11000000B

  4. 2. 2  画点函数的具体实现

  从例1 和例2 可以看出,要只显示一个色点,就必须知道该点对应的内存中的数据,而前面提到过内存中的数据是不能读出的,所以要将写入内存中的数据先保存起来,即在向YD2502 的显示缓冲区里写数据之前, 应先将此数据写入61LV5128 。若在坐标( X , Y) 处画颜色为color 的点,其具体函数如下:

  void  LCD_ disppixel ( unsigned int X , unsigned int Y ,unsigned char color) {

  unsigned int address ;

  unsigned char data ;

  address = LCD_pixeladdr ( X , Y) ;

  / / 计算该点对应的内存地址

  switch ( X %8) {

  case 0 : data = read _ exram ( ad2

  dress) ; / / 读取相应SRAM 中的数据

  data & = 0x1F; / / [1110 ,

  0000]保存其他点的数据

  data | = (color < < 5) ;

  / / 填充相应的颜色

  write _ exram ( data , ad2

  dress) ; / / 把修改好的数据写回到SRAM

  LCD_filldata (address ,da2

  ta) ; / / 把数据写到液晶显示缓冲区

  break ;

  ……

  case 7 : …; break ;}}

  以上只给出了余数是0 的情况,其他的情况可依此类推。计算内存地址的LCD_pixeladdr 函数可根据给出的内存地址计算方法编写,读写61LV5128 的read_exram 函数和write_exram 函数可根据具体的硬件设计编写,这里不再给出。

4. 3  显示汉字和其他功能的实现

  在屏幕上显示16 ×16 点阵汉字的基本步骤是:首先取得该汉字的32 个字节的点阵数据,再确定屏幕上显示的位置,利用画点函数即可显示该汉字。因本模块使用了硬件汉字库技术,所以汉字的点阵数据是从汉字库中获取的。

  在计算机汉字系统中,汉字是用机内码的形式存储的,将汉字机内码减去0A0A0H 就得到该汉字的区位码,通过区位码就可以找到该汉字点阵数据在汉字库中的位置。例如:汉字“中”的机内码是十六进制的“D6D0”,其中前两位“D6”表示机内码的区码,后两位“D0”表示机内码的位码。所以“中”的区位码为0D6D0H - 0A0A0H =3630H ,将区码和位码分别转换为十进制,得汉字“中”的区位码为“5448”。即“中”的点阵位于第54区的第48 个字的位置,在文件HZK16 中的位置为第32 ×[(54 - 1)×94 + (48 - 1)] = 160928D以后的32 个字节为“中”的点阵数据,用SUPER2PRO25 编程器读入文件HZK16 后利用其编辑功能中的缓冲区编辑查找到274A0H (160928D 的十六进制表示) 开始的32 个字节: 01H , 00H ,01H , 00H , 01H , 04H , 7FH , FEH , 41H , 04H ,41H , 04H , 41H , 04H , 41H , 04H , 7FH , FCH ,41H , 04H , 01H , 00H , 01H , 00H , 01H , 00H ,01H ,00H ,01H ,00H ,01H ,00H。这些数据与其点阵图形的对应关系如图4 所示,图中黑色方格表示二进制位“1”,即对应该显示的点,白色方格表示二进制位“0”,即不该显示的点。因此要在液晶屏幕上显示16 ×16 点阵的汉字,首先应找到该汉字在硬件汉字库中的位置,取出其后的32 个字节数据。取这32 个字节数据的函数如下:

图4  汉字“中”的点阵图形

  unsigned  char  chinese[ ] [ 2 ] = {“中”“, 国”} ;

  unsigned  char  buffer [32 ] ;

  void  LCD_ readdata ( unsigned char num2

  ber) {

  unsigned  char  temp1 ,temp2 , k ;

  unsigned  long  address , i ;

  temp1 = chinese  [ number ] [ 0 ] - 0xA0 ;/ / 把机内码转换成区位码

  temp2 = chinese  [ number ] [ 1 ] - 0xA0 ;

  address = 32 3 ( ( (long) temp1 - 1) 3 94 +( (long) temp2 - 1) ) ;  / / 计算该汉字在汉字库中的首地址

  k = 0 ;

  for ( i = address ; i < address + 32 ; i + + ) {

  data = read_exrom( i) ;

  buffer [ k ] = data ;

  k + + ; }}

  读A T29C040A 的read_exrom 函数可根据硬件设计编写,这里不再给出。

  取得这32 个字节数据后,下面的程序设计就比较容易了,这里只给出程序流程(如图5 所示) ,具体函数可根据此流程编写。其中( X , Y) 是该汉字显示的起始点, color 是该汉字的显示颜色,number 是该汉字在chinese 数组中的位置。显示英文和数字的函数可根据显示汉字的函数稍加改造后即可得到,这里不再详细分析。

图5  显示一个汉字程序流程图

  在本模块中也实现了在屏幕上画斜线、圆等功能,其具体实现过程就是在画点函数的基础上通过相应的算法来编写这些函数。画线和画圆算法比较多,在这里画线算法采用的是整数数字微分分析法,画圆算法采用的是贝森海姆算法。

  鉴于篇幅所限,这里不再具体分析。由于YD2502是点阵式液晶显示器, 还可以通过移植嵌入式GUI(如μC/ GUI) 软件,使其显示多种曲线,各种窗口对象,如按钮、编辑框、滑动条等更加丰富灵活的图形界面。

  5  结语

  以上程序均在ICCAVR 编译器里调试通过,实现了在液晶屏幕上正常显示各种颜色的汉字、英文、数字及简单的图形功能。在笔者参与开发的油田探测爆炸机设备中,采用了本液晶模块,达到了显示稳定,显示色彩丰富,人机界面友好的较理想的显示效果。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

单片机是一种嵌入式系统,它是一块集成电路芯片,内部包含了处理器、存储器和输入输出接口等功能。

关键字: 单片机 编写程序 嵌入式

在现代电子技术的快速发展中,单片机以其高度的集成性、稳定性和可靠性,在工业自动化、智能家居、医疗设备、航空航天等诸多领域得到了广泛应用。S32单片机,作为其中的佼佼者,其引脚功能丰富多样,是实现与外部设备通信、控制、数据...

关键字: s32单片机引脚 单片机

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

该系列产品有助于嵌入式设计人员在更广泛的系统中轻松实现USB功能

关键字: 单片机 嵌入式设计 USB

单片机编程语言是程序员与微控制器进行交流的桥梁,它们构成了单片机系统的软件开发基石,决定着如何有效、高效地控制和管理单片机的各项资源。随着微控制器技术的不断发展,针对不同应用场景的需求,形成了丰富多样的编程语言体系。本文...

关键字: 单片机 微控制器

单片机,全称为“单片微型计算机”或“微控制器”(Microcontroller Unit,简称MCU),是一种高度集成化的电子器件,它是现代科技领域的关键组件,尤其在自动化控制、物联网、消费电子、汽车电子、工业控制等领域...

关键字: 单片机 MCU

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

在当前的科技浪潮中,单片机作为嵌入式系统的重要组成部分,正以其强大的功能和广泛的应用领域受到越来越多行业的青睐。在众多单片机中,W79E2051以其卓越的性能和稳定的工作特性,成为市场上的明星产品。本文将深入探讨W79E...

关键字: 单片机 w79e2051单片机

单片机,又称为微控制器或微处理器,是现代电子设备中的核心部件之一。它集成了中央处理器、存储器、输入输出接口等电路,通过外部信号引脚与外部设备进行通信,实现对设备的控制和管理。本文将详细介绍单片机的外部信号引脚名称及其功能...

关键字: 单片机 微控制器 中央处理器

随着科技的飞速发展,单片机和嵌入式系统在现代电子设备中的应用越来越广泛。它们不仅提高了设备的智能化水平,还推动了各行各业的创新与发展。在单片机和嵌入式系统的开发中,编程语言的选择至关重要。本文将深入探讨单片机和嵌入式系统...

关键字: 单片机 嵌入式系统 电子设备
关闭
关闭