基于不带字库的图形LCD模块汉字显示解决方案
- 格式:doc
- 大小:68.50 KB
- 文档页数:12
LCD12864原理与应用1、LCD12864简介:LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。
而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。
下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它的液晶驱动器为KS0108。
引脚功能:引脚符号状态引脚名称功能,输入芯片片选端,都是低电平有效CS1=0开左屏幕,CS1=1关左屏幕CS2=0开右屏幕,CS2=1关右屏幕RS输入数据/命令选择信号RS=1为数据操作,RS=0为写指令或读状态RW输入读写选择信号R/W=1为读选通,R/W=0为写选通E输入读写使能信号在E下降沿,数据被锁存(写)入液晶,在E高电平期间,数据被读出DB0—DB7三态数据总线数据或指令的传送通道输入复位信号,低电平时复位复位时,关闭液晶显示,使显示起始行为0,可以跟单片机的复位引脚RST相连,也可以直接接VCC,使之不起作用V0液晶显示器驱动电压-Vout-10V LCD驱动负电压与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。
这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。
此液晶有8页,一页有8行点阵点,左右各64列,共128列。
如下图所示:2、LCD12864中的几条重要指令(一)行(line)设置命令:由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。
(二)页(page)设置指令:起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。
(三)列(column)地址设置指令每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。
第24卷 第5期2009年10月液 晶 与 显 示Chinese Journal of Liquid Crystals and DisplaysVol 124,No 15Oct.,2009文章编号:100722780(2009)0520692206基于图形液晶显示器的汉字显示系统设计与仿真朱清慧1,2,陈绍东2,徐志强1(1.中国矿业大学环境与化学工程学院,北京 100083,E 2mail :0zhu @ ;2.南阳理工学院电子系,河南南阳 473004)摘 要:以图形液晶显示器L M3229为例,论述了单片机控制的汉字显示系统硬、软件设计思想和实现方法。
对汉字显示机理做了详细剖析,对16×16点阵汉字字形与不同的汉字取模方式下字模数据之间的对应关系及字模数据读取方式做了详细的分析和设计。
以两种汉字显示方式———文本方式和图形方式分别进行了显示程序设计和分析,比较了两种方式实现汉字显示的各自特点,同时对L M3229内显示RAM 的编址方式及CGRAM 的地址设置做了详细阐述。
在嵌入式系统设计平台Proteus ISIS 中对系统进行了设计与仿真,得到了理想的仿真结果,实现了系统最优化设计。
关 键 词:图形液晶显示器;液晶汉字显示;显示RAM 编址;汉字取模;系统仿真中图分类号:TN873+.93;TP368.1;TP337 文献标识码:A 收稿日期:2009203206;修订日期:20092042081 引 言图形液晶显示器与字符液晶显示器相比,内部结构和控制方法都更为复杂。
显示汉字需使用图形液晶显示器。
图形液晶显示器内部有控制器,可以接收计算机发送来的控制命令和数据,从而以不同方式来显示字符、汉字和图形[1]。
Proteus ISIS 是嵌入式系统设计与仿真平台,可以对单片机控制系统进行软、硬件设计和交互仿真[2]。
本系统设计以单片机为控制核心,以图形液晶显示器为显示部件,以图形和文本两种显示方式来设计汉字显示系统,把希望的汉字显示在液晶屏的指定位置上并在Proteus ISIS 中进行仿真。
1引言在基于单片机的智能系统中,汉字显示模块是很重要的一个组成部分,它应用广泛、操作容易、调试简便。
然而,在单片机上显示汉字也存在几个问题。
首先,单片机资源有限,我们不能为了显示汉字占用太多的资源;其次,汉字存储读取比较繁琐,使用不方便;第三,汉字是通过点阵显示出来的,往往与LCD写入方式不一样,这就得进行转换和调整。
值得注意的是,基于单片机的汉字显示不能在字符LCD上实现。
使用图形LCD有很多优点,不仅能显示汉字,而且可以实现汉字动态移动和上下滚屏,实现汉字与图形的混合显示,同时功耗低。
2基于单片机的汉字显示原理2.1汉字字模汉字一般是以点阵式存储的,如16×16,24×24点阵(即汉字的字模),每个汉字由32字节(16点阵)或72字节(24点阵)描述。
根据汉字的不同字体,也可分为宋体字模、楷体字模、黑体字模等等。
汉字的字模其实是汉字字形的图形化。
对于16点阵字模,就是把汉字写在一个16×16的网格内,汉字的笔画能过某网格时该网格就对应1,否则该网格对应0,这样每一网格均对应1或0,把对应1的网格连起来看,就是这个汉字。
汉字就是这样通过字节表示点阵存储在字库中的。
为了方便查找所需汉字的汉字字模,每个汉字都与一个双字节的内码一一对应。
通过汉字的内码可以计算出它的点阵起始字节。
现以16点阵为例说明。
先由内码计算出它在汉字库中的区位码,计算公式为:区码=内码第一字节-160位码=内码第二字节-160再由区位码可以得到它在汉字库中字模第一个字节的位置:(区码×94+位码)×32 于是,可以向后连续读出由32个字节组成的该字的点阵数据。
2.2汉字显示汉字占用资源太多(如16点阵,每个汉字就需32字节),因而通常把汉字库放在EEPROM里,需要显示某个汉字时,先算出它的区位码,再求出点阵起始位置,从EEPROM 中顺序调出该字的点阵数据,存在缓冲区里,最后依次送往LCD显示,描出该字。
关于字库和LCD的解决方案(2014.08.21)1.关于汉字显示和字符显示由于本车载系统采用的LCD型号LCM192643本身不带中文字库,所以采用点阵输入显示的方式,整个过程如下:(1)将欲显示在LCM模块上的汉字或字符,输入字模软件,并选择不同的字体及大小,从中提取出该字符或汉字的点阵。
(2)将点阵以数组的形式放入程序的存储区,在程序中以该数组名为实参调用LCM模块的驱动函数,便可将该字符或汉字显示在LCM模块的特定位置上。
Unsigned charda[32]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00};DisplayWord(da,1,4);2.关于本车载系统LCD显示的解决方案(1)由于每条公交线路站名固定,且用于报站的汉字和字符都是有限的,所以用字模软件将每一条所有车站以及报站所用的汉字(字符)取出,并以一定的规律(如按照车站的次序)放入程序的存储区中,等到需显示某个汉字或字符时再从中调用。
这样可以极大的节约单片机有限的存储空间,以及减少成本,并方便后续编程。
(2)为了能在LCM模块上显示大小不同的各种字体,我们将提供各种字体的显示提取程序。
比如想在LCM上显示16X12的字体,可以调用DisplayWord1612(),若想显示16X16的字体,可以调用DisplayWord1616()等等。
而不必将不同规范的字库都装入存储器中,以避免不必要的浪费。
(3)在车载系统的使用中,LCD必然有固定的人机界面,且界面一旦确定,所显示的字符大小和内容都是固定不变的,所以事先确定人机界面,然后按照人机界面上固定大小的字符到字模软件中提取点阵,并放入程序的存储区中。
二、LCD12864液晶的使用之无字库型(一)2011年02月15日星期二 14:07过年回家没办法联网,没办法上传LCD12864教程,还请大家见谅!现在就和大家一起LCD12864的使用!LCD12864分为两种,带字库和不带字库的,个人比较喜欢不带字库的,因为显示汉字的时候可以选择自己喜欢的字体,而带字库的液晶,只能显示GB2312的宋体,当然了,也可以显示其他的字体,不过不是液晶本身字库中带的了,而是用图片的形式显示。
本讲由于内容较多,故分两篇进行讲解,本人水平有限,难免有错误之处,还望大家批评改正!首先介绍下不带字库的LCD12864,现就以Proteus中的LCD12864为例进行讲解,Proteus 中AMPIRE128*64,其液晶驱动器为KS0108,我在网上搜了好就都没找到它的datasheet,不过我们可以找到类似的芯片的手册,它的控制逻辑和HD61202是类似的,我们可以网上下载它的datasheet进行参考。
与带字库液晶不同,此块液晶中含有两个液晶驱动器,一块驱动器控制64*64个点,左右显示,这就是为什么AMPIRE128*64引脚有CS1和CS2的原因。
学习液晶主要看的它的指令系统,再次先说明一下“页”的概念,此液晶有8页,一页有8行。
68/8=8;再介绍一下其他的几个重要指令:指令一、行设置命令由此可见其显示的其实行为0xC0,有规律的改变起始行号,可以实现滚屏的效果指令二、页(page)设置指令起始页为0xB8显示的RAM共64行,分为8页,每页有8行,刚才在上面已经讲过。
指令三、列(Y address)地址设置指令第一列为0x40一直到0x7F共64列,因为此液晶有128列,所以有两块驱动芯片驱动。
指令四、读状态指令Busy:为1内部忙,不能对液晶进行操作。
0--工作正常。
ON/OFF:1------显示关闭;0------显示打开RESET:1-----复位状态;0------正常。
无字库12864液晶屏滚动显示程序[转]#include<reg52.h>#include<intrins.h>#include<absacc.h>#define Lcd_Bus P0 //MCU P0<------> LCM#define Disp_On 0x3f//开显示#define Disp_Off 0x3e//关显示#define Col_Add 0x40//列地址#define Page_Add 0xb8//页地址#define Start_Line 0xc0//起始页sbit cs1=P2^3; //Master chip enablesbit cs2=P2^4; //Slave chip enablesbit Enable=P2^2; // mode Enable singlesbit Di=P2^0; //Data or Instrument Selectsbit RW=P2^1; //Write or Readsbit Lcd_Rst=P2^5; //Lcm reset/*****************************字模,此字体下对应的点阵为:宽x高=16x16*****************************/unsigned char code Chinese_character[][32]={{0x02,0xF2,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xF2,0x02,0x0 0 ,0x00,0x7F,0x28,0x24,0x22,0x21,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F, 0x00,0x00},/*"西",0*/{0x80,0x90,0x8C,0x84,0x84,0xF4,0xA5,0x86,0x84,0x84,0x84,0x84,0x94,0x8C,0x84,0x0 0,0x80,0x80,0x80,0x40,0x47,0x28,0x28,0x10,0x28,0x24,0x43,0xC0,0x40,0x00, 0x00,0x00},/*"安",1*/{0x00,0x42,0x62,0x5A,0xC6,0x10,0x54,0x54,0x54,0xFF,0x54,0x54,0x7C,0x10,0x10,0x0 0,0x40,0x23,0x14,0x08,0x17,0x28,0x29,0x49,0x49,0x7F,0x49,0x49,0x49,0x49, 0x40,0x00},/*"建",2*/{0x10,0x48,0x47,0xCC,0x54,0x44,0x14,0xE8,0x27,0x24,0x2C,0xF4,0x04,0x04,0x04,0x0 0,0x10,0x30,0x10,0x0F,0x88,0x48,0x30,0x0F,0x01,0x06,0x00,0x3F,0x40,0x40, 0x70,0x00},/*"筑",3*/{0x10,0x12,0x92,0x72,0xFE,0x51,0x91,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00x04,0x02,0x01,0x00,0xFF,0x00,0x04,0x04,0x04,0x02,0x02,0x02,0xFF,0x01, 0x01,0x00},/*"科",4*/{0x08,0x08,0x88,0xFF,0x48,0x28,0x00,0xC8,0x48,0x48,0x7F,0x48,0xC8,0x48,0x08,0x0 0,0x01,0x41,0x80,0x7F,0x00,0x40,0x40,0x20,0x13,0x0C,0x0C,0x12,0x21,0x60, 0x20,0x00},/*"技",5*/{0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x0 0,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0, 0x40,0x00},/*"大",6*/{0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x0 0,0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02, 0x02,0x00},/*"学",4*/{0x00,0x02,0x1C,0xE8,0x00,0x40,0x60,0x58,0x47,0x22,0x20,0x28,0x30,0xE0,0x40,0x0 0,0x02,0x02,0x7F,0x00,0x00,0x00,0x7F,0x21,0x21,0x21,0x21,0x21,0x7F,0x00, 0x00,0x00},/*"冶",0*/{0x40,0x40,0x20,0x20,0x50,0x48,0x44,0xC3,0x44,0x48,0x50,0x50,0x20,0x60,0x20,0x0 0,0x40,0x40,0x42,0x42,0x4A,0x72,0x42,0x7F,0x42,0x62,0x5A,0x42,0x42,0x40, 0x40,0x00},/*"金",1*/{0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x0 0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x00},/*"工",2*/{0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x0 0,0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44, 0x40,0x00},/*"程",3*/{0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x0 0,0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02, 0x02,0x00},/*"学",4*/{0xFE,0x02,0x32,0x4A,0x86,0x0C,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x0C,0x04,0x0 0,0xFF,0x00,0x02,0x04,0x83,0x41,0x31,0x0F,0x01,0x01,0x7F,0x81,0x81,0x81, 0xF1,0x00},/*"院",5*/{0x10,0x10,0xD0,0xFE,0x50,0x90,0x00,0x10,0x10,0x10,0xD0,0xFE,0x10,0x10,0x10,0x0 0,0x08,0x06,0x01,0xFF,0x00,0x01,0x10,0x08,0x04,0x43,0x80,0x7F,0x00,0x00, 0x00,0x00},/*"材",0*/{0x20,0x24,0xA8,0x70,0xFF,0x68,0xA4,0x20,0x42,0x8C,0x00,0x00,0xFF,0x00,0x00,0x00x08,0x06,0x01,0x00,0xFF,0x00,0x01,0x02,0x02,0x03,0x02,0x02,0xFF,0x01, 0x01,0x00},/*"料",1*/{0x00,0x08,0x08,0x08,0xFF,0x08,0x08,0xF8,0x00,0xF8,0x08,0x08,0x08,0xF8,0x0 0,0x00,0x40,0x20,0x18,0x07,0x00,0x20,0x40,0x3F,0x00,0x7F,0x10,0x10,0x10,0x3F, 0x00,0x00},/*"加",2*/{0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x0 0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x00},/*"工",4*/{0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x0 0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x00},/*"工",4*/{0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x0 0,0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44, 0x40,0x00},/*"程",5*/};unsigned char code E[][16]={{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x0 0},/*"C",0*/{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x0 0},/*"r",1*/{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x2 0},/*"a",2*/{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x0 0},/*"s",3*/{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x0 0},/*"y",4*/{0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x0 0},/*"b",5*/{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x0 0},/*"o",6*/{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x0 0},/*"y",7*/{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x0 0},/*"e",8*/};/***********************延时子程序***********************/void delay(unsigned int k){unsigned int i;unsigned int j;for(i=0;i<k;i++)for(j=0;j<20;j++);}/***********************写命令左***********************/ void write_cmd_1(unsigned char command){cs1=1;cs2=0;Di=0;RW=0;Lcd_Bus=command; //P0口delay(0);Enable=1;delay(0);Enable=0;}/***********************写命令右***********************/ void write_cmd_2(unsigned char command){cs1=0;cs2=1;Di=0;RW=0;Lcd_Bus=command;delay(0);Enable=1;delay(0);Enable=0;}/***********************写数据左***********************/ void write_data_1(unsigned char dis_data){cs1=1;cs2=0;Di=1;RW=0;Lcd_Bus=dis_data;delay(0);Enable=1;delay(0);Enable=0;}/***********************写数据右***********************/ void write_data_2(unsigned char dis_data){cs1=0;cs2=1;Di=1;RW=0;Lcd_Bus=dis_data;delay(0);Enable=1;delay(0);Enable=0;}/***********************清内存左***********************/void clear_1(void){unsigned char j,k;cs1=1;cs2=0;write_cmd_1(Page_Add+0);write_cmd_1(Col_Add+0);for(k=0;k<8;k++){write_cmd_1(Page_Add+k);for(j=0;j<64;j++)write_data_1(0x00);}}/***********************清内存右***********************/void clear_2(void){unsigned char j,k;cs1=0;cs2=1;write_cmd_2(Page_Add+0);write_cmd_2(Col_Add+0);for(k=0;k<8;k++){write_cmd_2(Page_Add+k);for(j=0;j<64;j++)write_data_2(0x00);}}/***********************显示汉字16*16左************************/void Chinese_disp_1(unsigned char pag,unsigned char col,unsigned char n) {unsigned char i=0;unsigned char j=0;cs1=1;cs2=0;for(i=0;i<2;i++){write_cmd_1(Page_Add+pag+i);write_cmd_1(Col_Add+col);for(j=0;j<16;j++)write_data_1(Chinese_character[n][16*i+j]);}}/***********************显示汉字16*16右***********************/void Chinese_disp_2(unsigned char pag,unsigned char col,unsigned char n) {unsigned char i=0;unsigned char j=0;cs1=0;cs2=1;for(i=0;i<2;i++){write_cmd_2(Page_Add+pag+i);write_cmd_2(Col_Add+col);for(j=0;j<16;j++)write_data_2(Chinese_character[n][16*i+j]);}}/***********************显示英文16*8左************************/void E_disp_1(unsigned char pag,unsigned char col,unsigned char n){unsigned char i=0;unsigned char j=0;cs1=1;cs2=0;for(i=0;i<2;i++){write_cmd_1(Page_Add+pag+i);write_cmd_1(Col_Add+col);for(j=0;j<8;j++)write_data_1(E[n][8*i+j]);}}/***********************显示英文16*8右***********************/void E_disp_2(unsigned char pag,unsigned char col,unsigned char n){unsigned char i=0;unsigned char j=0;cs1=0;cs2=1;for(i=0;i<2;i++){write_cmd_2(Page_Add+pag+i);write_cmd_2(Col_Add+col);for(j=0;j<8;j++)write_data_2(E[n][8*i+j]);}}/***********************液晶屏初始化***********************/ void init_lcd(){Lcd_Rst=0;delay(100);Lcd_Rst=1;delay(100);write_cmd_1(Disp_Off); write_cmd_2(Disp_Off);write_cmd_1(Page_Add+0); write_cmd_2(Page_Add+0);write_cmd_1(Start_Line+0); write_cmd_2(Start_Line+0);write_cmd_1(Col_Add+0); write_cmd_2(Col_Add+0);write_cmd_1(Disp_On); write_cmd_2(Disp_On);}/***********************LCD显示子程序***********************/ void display(void){unsigned char i;for(i=Start_Line;i<0xff;i++){Chinese_disp_1(0,0, 0);Chinese_disp_1(0,16,1);Chinese_disp_1(0,32,2);Chinese_disp_1(0,48,3);Chinese_disp_2(0,0, 4);Chinese_disp_2(0,16,5);Chinese_disp_2(0,32,6);Chinese_disp_2(0,48,7);//西安建筑科技大学Chinese_disp_1(2,16,8);Chinese_disp_1(2,32,9);Chinese_disp_1(2,48,10);Chinese_disp_2(2,0,11);Chinese_disp_2(2,16,12);Chinese_disp_2(2,32,13);//冶金工程学院Chinese_disp_1(4,16,14);Chinese_disp_1(4,32,15);Chinese_disp_1(4,48,16);Chinese_disp_2(4,0,17);Chinese_disp_2(4,16,18);Chinese_disp_2(4,32,19);//材料加工工程E_disp_1(6,24,0);E_disp_1(6,32,1);E_disp_1(6,40,2);E_disp_1(6,48,3);E_disp_1(6,56,4);E_disp_2(6,0,5);E_disp_2(6,8,6);E_disp_2(6,16,7);E_disp_2(6,24,8);//Crasyboyewrite_cmd_1(i);write_cmd_2(i);delay(3000);//调整滚动速度}//delay(60000);}/***********主程序************/ void main(void){ init_lcd();clear_1();clear_2();while(1){display();}}。
LCD12864(不带字库)LCD12864(不带字库)其实看了本版的1602教程以后很容易就可以掌握12864了。
刚才看到有网友要12864教程,俺就把博客里以前练习的一个程序弄过来,算作参考吧。
不足之处请见谅。
这个程序浪费了我很多时间,因为我一直没有找到datasheet,12864的型号实在太多了。
为了这个程序,我在网上找了很多相关的例程,但大多都是C语言写的,可惜俺没学过C,用起来不顺手,遂将其转成汇编,但是转后,程序运行不正常,郁闷啊。
好不容易找个汇编的吧,又写得很乱,没有头绪,没有datasheet,看起来很费劲,最后终于找到一个相关的datasheet,这才完成这个程序。
总结一下:与其费力分析别人的程序,不如看datasheet自己写。
下面总结一下datasheet。
→↑← ONE→且看datasheet:12864点阵型LCD简介12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4个(16×16点阵)汉字。
'700')this.width='700';if(this.height>'700')this.height='700';">在使用12864LCD前先必须了解以下功能器件才能进行编程。
12864内部功能器件及相关功能如下:1. 指令寄存器(IR) IR是用于寄存指令码,与数据寄存器数据相对应。
当D/I=0时,在E信号下降沿的作用下,指令码写入IR。
2.数据寄存器(DR) DR是用于寄存数据的,与指令寄存器寄存指令相对应。
当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7∽DB0数据总线。
基于不带字库的图形LCD模块汉字显示解决方案微计算机信息作者:刘红覃光华汪道辉摘要针对不带汉字字库的图形点阵液晶模块的系统,嵌入GB2312-80字库芯片,利用国标区位码和液晶模块的特点实现汉字和西文字符的混合显示。
本文介绍了汉字机内码与区位码的相互转换关系,以及利用T6963C作控制器的液晶模块YJ240D的基本原理,探讨了实际应用中此类液晶模块在嵌入式仪器仪表中混合显示的硬件设计和软件实现方法。
关键词液晶模块区位码汉字字模库引言目前,在嵌入式智能仪器仪表中,常用的LCD模块一般不带有字库,而实际应用中的人机界面需要显示汉字,如果直接把汉字点阵字库放在程序空间需要占有大量的程序空间,并且字库不一定完整。
本文以深圳莱德电子的LCD显示模块YJ240D和国标汉字库GB2312-80为例,介绍了一种基于无汉字字库的图形LCD模块汉字显示的解决方案。
1 单片机与液晶模块的接口1.1 YJ240D的基本结构YJ240D是一款图形点阵液晶显示模块,它由控制器T6963C、行驱动器、列驱动器及240×128全图形点阵液晶显示器组成。
可显示常用字符及图形,也可以显示15×8个(16×16点阵)汉字,内带32K显示缓冲数据存储器,可储存八屏图形显示数据。
5V单电源供电,模块内带负压发生器,用于驱动LCD,内带LED背光,通过调节VLCD的电压可以调节液晶的对比度。
T6963C 是***东芝公司专门为中等规模LCD模块设计的一款控制器,它通过外部MCU方便地实现对LCD驱动器和显示缓存的管理。
其特点为8位总线,内部有 128 个常用字符表,可管理外部扩展显示缓存64KB(本模块为32KB),并具有丰富的指令供MCU实现对LCD显示屏幕的操作与编辑YJ240D接口简单,可通过软件编程方便地对液晶控制,其硬件接口定义如表1表1 YJ240D的硬件接口1.2 YJ240D与单片机的接口图1为单片机和液晶显示器的接口示意图,其中用单片机的P1.2、P1.3来控制液晶模块的片选(CE)和指令/数据选择(C/D);P0口与液晶的8位数据线(P0-P7)相接;读(WR)写(RD)线分别与MCU的读写线相连。
1.3 YJ240D的读写时序该液晶模块与MCU的接口采用八位并行数据线,可交换命令和数据。
向液晶模块写时,如果C/D为高,表示向液晶模块传输命令;如果C/D为低,表示向液晶模块传输数据。
当从液晶读时,C/D必须为高,读出的值为模块内的状态字。
液晶模块的详细命令集可参见T6963C数据手册。
2 字库芯片与单片机的接口2.1 汉字的编码标准为了用0、1代码串表示汉字,规定了汉字的信息交换码:GB 2312-80,简称国标码,共有字符7445个,包括汉字和其他字符。
一级汉字3755个,按汉语拼音顺序排列;二级汉字3008个,按部首和笔画排列。
其他字符有常用符号、序号、GB1988图形字符集、希腊字符、制表符等。
国标码的每一个符号都用两个字节(16位二进制)代码来表示一个汉字。
1) 国标码:行、列各94(0-93),用先行后列的两个7位二进制数表示。
2) 区位码:由于二进制国标码表示不很方便,因此汉字也可用十进制区位码表示。
区、位各94(1-94),用先区后位的两个2位十进制数表示。
3) 机内码:是计算机内部表示汉字的代码,在微机中多用两字节(最高位为1)代码作为机内码。
2.2区位码和机内码的相互转换西文系统的交换码和机内码都采用美国标准信息交换码ASCII,用一个字节表示,一般只用低七位,可以表示128可符号。
在软件中嵌入的汉字经编译器编译后存放的格式为机内码。
区位码和机内码之间的转换关系可概括为:(区位码的十六进制表示)+A0A0H=机内码。
以汉字“大”为例,“大”字的区内码的十六进制表示为1453H,加上A0A0H得到机内码为B4F3H。
2.3 汉字字模库汉字的输出是将汉字的笔划离散化,用点阵来表示。
点阵的中每个点位只有两种状态:有笔画(1)、无笔画(0)。
描述汉字点阵信息的二进制代码集称为汉字的字模。
所有汉字和符号的点阵信息就组成了汉字库。
2.3 混合字符的显示在本系统中,每个汉字的显示采用16×16图形点阵方式显示。
国标GB2312-80一、二级汉字点阵库存放在一片ROM芯片AT27C040中,每个汉字占用32个字节。
当需要显示汉字时,首先根据区码和位码计算出该汉字点阵在ROM中存放的起始地址,然后从此地址连续的取出32个字节的汉字点阵,并写入LCD模块对应的地址中,就可以显示出该汉字。
根据汉字区位码和该汉字计算汉字在字库ROM位置的转换关系可概括为:起始地址=(区码×94+位码)×32在应用中,常需要汉字和英文字符混合显示,在软件处理时需要判断显示的内容是汉字的编码还是英文字符的编码,如果是汉字编码则根据其机内码计算区位码,并根据区位码计算出该汉字在字模中的起始地址。
图3是混合显示的软件流程图。
3 应用实例在某检测设备中,需要给用户显示电流、电压、频率值以及一些事件记录等。
用户的命令通过设备的8键键盘输入,显示的内容有汉字、数字和英文字符。
以下列出了显示汉字、数字和英文字符串部分软件/*-----------------------------------------------------------------------------------------混合显示一串汉字和英文字符row:行(1-8) column: 列(1-15)str:字符代码(标准机内码)指针---------------------------------------------------------------------------------------*/void DispStr(unsigned char row unsigned char column unsigned char *str) {while (*str){if (*str > 0xa0) //如果是汉字机内码 {if (column == 30) //如果是最后一列,则换行{row ++;column = 1;}DispHZ(row column str); //显示一个汉字 column += 2;str += 2;}else //如果是英文字符{DispChar(row * 2 column str); //显示一个英文字符column++;str++;}}/*----------------------------------------------------------------在指定位置显示一个汉字(16*16点阵)row:行(1-8) column: 列(1-29)str:汉字标准机内码指针LINE_CHAR = 30 一行的字符数-----------------------------------------------------------------*/ void DispHZ(unsigned char row unsigned char column unsigned char *str) {unsigned char idata i hz_buf[32];unsigned int StartAddr;//定位起始行StartAddr = (((row - 1) * 16) * LINE_CHAR + (column-1)) + 0x4000; GetMatrix(str hz_buf);for (i = 0; i < 16; i++){LCDInData( (unsigned char) (StartAddr) );LCDInData( (unsigned char) (StartAddr>>8) );LCDInCmd(0x24);LCDInData(hz_buf[i * 2]);LCDInCmd(0xc0);LCDInData(hz_buf[i * 2 + 1]);LCDInCmd(0xc4);StartAddr += LINE_CHAR;}}/*-----------------------------------------------------------------------------------从字库芯片中取汉字字模数据s: 汉字标准机内码指针hz_buf: 存放汉字字模数据缓冲区指针-------------------------------------------------------------------------------------*/void GetMatrix(unsigned char *s unsigned char *hz_buf){unsigned char i j k;unsigned long address;for (k = 0; k < 31; k++){i = *s -0xA1; //计算区码j = *(s + 1) -0xA1; //计算位码address = (((unsigned long)i * 94) + j)*32 + k; //计算该汉字在字模芯片中的起始位置high_addr = 1;P0 = (unsigned char) (address >> 16); //送高位地址high_addr = 0;P0 = 0xff;zk_cs = 0;*hz_buf = XBYTE[(unsigned int) address]; //取汉字模数据hz_buf++;zk_cs = 1;}}4 结束语在图形液晶模块中嵌入中文字库点阵字模芯片,其最大的特点是可以显示所有的一、二级汉字、硬件接口简单、软件编程容易、可混合显示汉字、英文字符和图形。
作为人机接口的一个重要部分,可被广泛应用在工业仪器仪表、监控装置、保护装置及汽车等各种领域中。
5 参考文献1 徐爱均彭秀华单片机高级语言C51应用程序设计电子工业出版社20012 莱德电子 YJ240D液晶模块手册3 Toshiba CMOS digital integrated circuit silicon monolithic T6963C dot matrix LCD control LSI 19974 GB2312-80《信息交换用汉字编码字符集》 19802009-3-16 15:03:49。