点阵液晶显示器的汉字显示原理与应用

发布时间:2012-03-13   来源:文档文库   
字号:
点阵式液晶显示屏显示汉字吴婷婷P201102094
引言世界中,有很多物质都可以看作是由很小很小的点(例如:分子、原子)组成的,当然,字符也不例外。假设我们把一个字符分成若干个可视的点组成,换句话来说,就是一个个点组成了我们看到的字符。假设您的电脑显示器是液晶的,每一个字符或图形都是由一个个的点组成的,只是这些点很小,小得让您不容易发现而已;由此,我们引入点阵字符的概念,从微观的电子信号0 1 ,到宏观可视的字符.
点阵式液晶显示器以重量轻,体积小,电压低,功耗小,显示内容丰富等特点正在被广泛的应用,点阵式液晶显示器的核心是其控制器,他的功能很强,能直接与微机接口,使用方便。与点阵液晶板,液晶显示驱动器,显示贮存器组合就可以构成完整的显示系统。
首先,从我们常用的计算机系统谈起,再扩展到我们要开发设计的点阵LCD&LED 显示系统中去,其实单片机系统的显示原理和计算机是一样的。在计算机中,所有的数据(包括指令等)都是以0 1 来表示的,这意味着,如果我们想要在显示器上显示字符,那么这些字符的信息将也会是以0 1 来保存显示的。
对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。那么计算机是如何来存贮显示字符的呢?
那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状。
例如英文A在字模的记载方式如图1所示
而中文“你”的字模图如下
每一个小方格代表一个点,黑色的为0 ,白色为1 ;单元内为一的点表示为点亮,单元内为0的位不亮,每一个点看作为一位(bit )。字节中能够显示的位数可用编程设置,范围是1-16如果小于8个字节,每个字节的低位不起显示作用,例如设置显示单元为6每个字节显示6位,那么屏幕上的显示单元为1x6点。
据此可以描绘出“你”字的位(bit 信息。采用行扫描的方式,每八位(bit )为一个字节,这里采用十六进制表示,这样就得到了字模数据。由上述的示例,我们可以清晰的了解到可视字符、位信息与字模数据之间的关系。清楚了上面的关系之后,我们就可以自己编写一个字模数据生成工具了。
点阵异常处理假设字符的点阵不是8 的倍数怎么办呢?通常情况下可以不计或在后面以4 0 补足8 位都可,例如:12x12 点阵的汉字,先假设对12x12的点阵字符进行扫描,第一行的前8位为一个字节,第一行的后面4位形成一个字节,以后的每行逐次类推,直到扫描到最后一行,行成一个完整可用的字模数据。
在编写软件代码之前必须要先掌握汉字取模的方法。要得到上表中的文字,我们可以借助取模软件来完成。目前点阵LCD的取模软件有很多,我们以本开发板配套的取模软件为例来介绍一下汉字的取模方法
打开取模软件出现如下显示界面
在文字输入区中输入文字,我们以输入一个欢迎的“豪”字为例,了解其取模过程。在文字输入区中输入“欢”后按CTRL+ENTER合键后就看到“欢”字已经在模拟显示区显示出来了

在“取模方式”中选择“C51格式”就可以在“点阵生成区”得到你要的汉字“豪”的显示代码。
放大显示代码可以清楚的看到
经过以上步骤后一个汉字就取模成功了,在程序中只要调用这段代码就可显示出汉字“豪”了,其它汉字也用同样的方法。取完要显示的全部汉字代码后我们就可以编程了
在计算机中如何显示一个字符其实字符的显示过程是字模数据创建的逆过程。首先我们要明白字模数据的排列扫描方式,然后再把16 进制的字模数据变成位(bit )信息,最后才能根据位信息按照字模数据给定的扫描方式逐个把点描绘出来,在计算机中显示一个“豪”字,我们可以使用字模软件来创建一个字模数据,
设定为行扫描、16x16 点阵、宋体、11 号字,创建如下字模数据:unsigned char hao0[]={0x00,0x00, 0x00,0x80, 0x3F,0xFC, 0x00,0x00,0x07,0xF0, 0x04,0x10, 0x3F,0xFE, 0x20,0x02,0x4F,0xF4, 0x05,0x20, 0x1A,0xC0, 0x04,0xA0,0x1B,0x58, 0x04,0x46, 0x19,0x80, 0x00,0x00};
C 语言全部显示代码描述如下:unsigned char cmp_w[8]={128,64,32,16,8,4,2,1}; // 于取位unsigned char hao0[]={ /* 字模数组*/0x00,0x00, 0x00,0x80, 0x3F,0xFC, 0x00,0x00,0x07,0xF0, 0x04,0x10, 0x3F,0xFE, 0x20,0x02,0x4F,0xF4, 0x05,0x20, 0x1A,0xC0, 0x04,0xA0,0x1B,0x58, 0x04,0x46, 0x19,0x80, 0x00,0x00};void FontDisplay(int x, int y, unsigned char * FontModule{/*x: 水平偏移坐标,y: 垂直偏移坐标*//*16x16 单个字符行扫描函数*/
for(int row=0;row<16;row++{for(int c=0;c<8;c++if((FontModule[row*2]&cmp_w[c]!=0putpixel(c+x,row+y,15;/* 画一个点*/for(c=0;c<8;c++if((FontModule[row*2+1]&cmp_w[c]!=0putpixel(c+8+x,row+y,15;}} main({/* 调用显示主程序*/FontDisplay(5,5, hao0 ;}
假设你的系统需要显示的字符不多,直接使用上面的代码或稍做修改,直接编译烧写到芯片里,即可满足一般点阵字符显示的需求,而不需要制作大的文件字库,节省有限的ROM 空间,编程又极其简单。假设我们要显示一串字符,把这一串字符拷贝到字模工具软件里,字模软件会为每个字符产生一个字模数组,我们在程序里按字符显示的顺序依次调用FontDisplay(int x,int y, unsigned char * FontModule 即可连续把字符显示出来
12864点阵型液晶显示屏为例12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4(16×16点阵汉字。下面对其简单的介绍1号管脚VSS----电源池(lever02号管脚VDD----电源电压(+5v3号管脚V0----液晶显示器驱动电压4号管脚D/I(RS---D/I=H”,表示DB7DB0为显示数据,D/I=L”,表示DB7DB0为显示指令数据
5号管脚R/W---R/W=H”,E=H”数据被读DB7DB0R/W=L”,E=H→L”数据被写到IRDR6号管脚E---R/W=L”,E信号下降沿锁DB7DB0R/W=H”,E=HDDRAM数据读到DB7DB07--14号管脚均为数据线15号管脚CS1---H:选择芯片(右半屏信号(H/L16号管脚CS2---H:选择芯片(左半屏信号(H/L17号管脚RET---复位信号(低电平复位)18号管脚VOUT---LCD驱动负电压(-10v19号管脚LED+---LED背光板电源20号管脚LED----LED背光板电源
在使用12864LCD前先必须了解以下功能器件才能进行编程。12864内部功能器件及相关功能如下:指令寄存器(IRIR是用于寄存指令码,与数据寄存器数据相对应。当D/I=0时,在E信号下降沿的作用下,指令码写入IR数据寄存器(DRDR是用于寄存数据的,与指令寄存器寄存指令相对应。当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7DB0数据总线。DRDDRAM之间的数据传输是模块内部自动执行的
忙标志:BFBF标志提供内部工作情况。BF=1表示模块在内部操作,此时模块不接受外部指令和数据。BF=0时,模块为准备状态,随时可接受外部指令和数据。显示控制触发器DFF此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY OFF),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。XY地址计数器:XY地址计数器是一个9位计数器。高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针X地址计数器为DDRAM的页指针,Y地址计数器为DDRAMY地址指针。
X地址计数器是没有记数功能的,只能用指令设置。Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1Y地址指针从063显示数据RAMDDRAM):DDRAM是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。DDRAM与地址和显示位置的关系见DDRAM地址表。Z地址计数器:Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器0
显示开关指令DB01时,LCD显示RAM中的内容;DB00时,关闭显示。
读状态指令BUSY1-内部在工作0-正常状态;ON/OFF1-显示关闭0-示打开;RESET1-复位状态0-正常状态;在BUSYRESET状态时,除读状态指令外,其它指令均不对液晶显示模块产生作用。在对液晶显示模块操作之前要查BUSY状态,以确定是否可以对液晶显示模块进行操作。
写数据指令
读、写数据指令每执行完一次读、写操作,列地址就自动增一。必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。
在调试前先将显示切换开关切换到LCD显示状态。下图为硬件原理图


先初始化#include#include#includesbit EN=P2^4;sbit RW=P2^3;sbit RS=P2^2;sbit CS2=P2^1;sbit CS1=P2^0;void delay1ms(uint num//软件定时1ms{uint j;uint i;for(j=num;j>0;j--for(i=112;i>0;i--;}void LCD_busy(//LCD忙状态,当DB7=1LCD忙,不能执行MCU指令{P1=0x00;RS=0;RW=1;
延时void LCD_command(uchar dat{LCD_busy(;RS=0;RW=0; //写指令EN处于下降沿P1=dat;EN=1;_nop_(;_nop_(;EN=0;}void LCD_data(uchar dat{LCD_busy(;RS=1;RW=0;//写数据,EN处于下降沿P1=dat;EN=1;_nop_(;_nop_(;EN=0;}
显示两屏内容void LCD_colum(uchar colum{colum=0x40|colum;//取得colum的低六位数据,并且将第七位数据置位0100 0000LCD_command(colum;}/*void setonoff(uchar dat{dat=0x3e|dat;LCD_command(dat; //0x3e为关闭液晶,0x3f为开启液晶此处可知dat=0表示关闭液晶显示;dat=1表示开启液晶显示。}
void choosescreen(uchar dat{switch(dat{case 0:CS1=0;CS2=0;break;//选择两屏case 1:CS1=0;CS2=1;break; //选择左屏case 2:CS1=1;CS2=0;break; //选择右屏default:break;}}
void cleanscreen(uchar dat{uchar i,j;choosescreen(dat;for(i=0;i<8;i++{LCD_page(i;//一屏信息共八页LCD_colum(0;//写入清屏的初始地址(位置)/*这是半屏信息共*/for(j=0;j<64;j++{LCD_data(0x00;}}}
void init({LCD_busy(;//choosescreen(0;//选择两屏//setonoff(0;//choosescreen(0;//选择两屏//setonoff(1;//choosescreen(0; //选择两屏cleanscreen(0;//清除两屏信息//LCD_line(0;}
下面为显示一个汉子的程序void desplay(uchar ss,uchar page,uchar colum,uchar *p{uint i;choosescreen(ss;//选择哪一屏信息LCD_page(page;//选择写入哪一页(一屏共八页)LCD_colum(colum;//选择哪一列(一屏共64列),一个汉字为16*16,即占用两页16列的空间大小for(i=0;i<16;i++{LCD_data(p[i];}/*此时已经在需要显示的位置写入了半个汉字*/LCD_page(page+1;LCD_colum(colum; for(i=0;i<16;i++{LCD_data(p[i+16];}

本文来源:https://www.2haoxitong.net/k/doc/d857eefb910ef12d2af9e7de.html

《点阵液晶显示器的汉字显示原理与应用.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式