1602LCD点阵字符_自定义字符_测试
LCD1602 自定义字符
LCD1602 自定义字符2011-09-06 20:40:55| 分类:1602|举报|字号订阅用户自定义字符的应用:我们从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。
它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM 的字符码规定0-2位为地址,3位无效,4-7全为零。
因此CGRAM的字符码只有最后三位能用也就是8个字节了。
等效为0000X111,X为无效位,最后三位为000-111共8个。
如果我们要想显示这8个用户自定义的字符,操作方法和显示CGROM的一样,先设置DDRAM位置,再向DDRAM写入字符码,例如“A”就是41H。
现在我们要显示CGRAM的第一个自定义字符,就向DDRAM写入00000000B(00H),如果要显示第8个就写入00000111(08H),简单吧!好!现在我们来看怎么向这八个自定义字符写入字模。
有个设置CGRAM地址的指令如下图:从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。
例如第一个自定义字符的字模地址为01000000-01000111八个地址。
我们向这8个字节写入字模数据,让它能显示出“℃”地址:01000000数据:00010000 图示: ○○○■○○○○0100000100000110 ○○○○○■■○0100001000001001 ○○○○■○○■0100001100001000 ○○○○■○○○0100010000001000 ○○○○■○○○0100010100001001 ○○○○■○○■0100011000000110 ○○○○○■■○0100011100000000 ○○○○○○○○图示:下面我们写一段程序让这8个自定义字符显示出一个心的图案:# include <reg51.h>unsigned char table1[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心图案unsigned char table[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//字符℃#define CLEARSCREEN LCD_write_command(0x01)/**************定义接口************************/#define LCDIO P2sbit LCD1602_RS=P3^0;sbit LCD1602_RW=P3^1;sbit LCD1602_EN=P3^2;/**************定义函数************************/void LCD_write_command(unsigned char command);//写入指令函数void LCD_write_dat(unsigned char dat);//写入数据函数void LCD_set_xy( unsigned char x, unsigned char y );//设置显示位置函数void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);//显示一个字符函数void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char*s);//显示字符串函数void LCD_init(void);//初始化函数void delay_nms(unsigned int n);//延时函数/********************************************//************初始化函数****************/void LCD_init(void){CLEARSCREEN;//clear screenLCD_write_command(0x38);//set 8 bit data transmission mode LCD_write_command(0x0c);//open display (enable lcd display) LCD_write_command(0x80);//set lcd first display address CLEARSCREEN;//clear screen}/****************************************************//**************写指令函数********************************/void LCD_write_command(unsigned char command){LCDIO=command;LCD1602_RS=0;LCD1602_RW=0;LCD1602_EN=0;LCD1602_EN=1;delay_nms(10);}/***************************************************/ /****************写数据函数************************/ void LCD_write_dat(unsigned char dat){LCDIO=dat;LCD1602_RS=1;LCD1602_RW=0;LCD1602_EN=0;delay_nms(1);LCD1602_EN=1;}/****************************************************//***************设置显示位置**************************/ void LCD_set_xy( unsigned char x, unsigned char y ) {unsigned char address;if (y == 1)address = 0x80 + x;elseaddress =0xc0+ x;LCD_write_command(address);}/***************************************************//****************显示一个字符**********************/void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat){LCD_set_xy( x, y );LCD_write_dat(dat);}/**********************************************//***************显示字符串函数***************/void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s) {LCD_set_xy( X, Y );while (*s){LCD_write_dat(*s);s ++;}}/***********************************************//********** 延时**********************/void delay_nms(unsigned int n){unsigned int i=0,j=0;for (i=n;i>0;i--)for (j=0;j<10;j++);}/**************************************//***********主函数**************/void main(void){unsigned char i,j,k,tmp;LCD_init();delay_nms(100);tmp=0x40;//设置CGRAM地址的格式字k=0;for(j=0;j<8;j++){for(i=0;i<8;i++){LCD_write_command(tmp+i); // 设置自定义字符的CGRAM 地址delay_nms(2);LCD_write_dat(table1[k]); // 向CGRAM写入自定义字符表的数据k++;delay_nms(2);}tmp=tmp+8;}LCD_dsp_string(1,1,"LCD TEST ");//在第一行第一列显示“LCD TEST”LCD_dsp_string(1,2,"SUCCESSFUL ");//在第二行第一列显示“SUCCESSFUL”for (i=0;i<4;i++){LCD_dsp_char( 12+i,1,i);//在第一行第12列位置显示心图案的上半部delay_nms(1);}for (i=4;i<8;i++){LCD_dsp_char( 12+i-4,2,i);在第二行第12列位置显示心图案的下半部delay_nms(1);}while (1);}/********************************************************************/实际效果如图:。
利用LCD1602的自定义字库显示汉字
DB 1FH,11H,11H,1FH,11H,11H,1FH,00H ;日,代码为03H
DB 1FH,04H,04H,04H,04H,04H,04H,1FH ;工,代码为04H
DB 0AH,0AH,1BH,1BH,0AH,0AH,0AH,1FH ;业,代码为05H
RET
;------------------------------------------- ----------------------------------------
;以下是编写的8个汉字及特殊符号字库表,当然也可以编写其它的8个字库,只是最多同时只能编写8个,若要用更多的汉字只能去选择带有汉字库的显示模块了。
NOP
MOV A,P0
CLR E
JB ACபைடு நூலகம்.7,WR_DATA1 ;确保写数据操作成功
POP ACC
RET
�
ACALL WR_DATA ;调写显示数据子程序
INC R1
DJNZ R2,LOOP2 ;第二行显示完
AJMP $
TABDIS:
DB '2007',01H,'7',02H,'9',03H,' 26.8',06H ;2007年7月9日 26.8℃,在第一行
DB 'NANJING COLLEGE' , '0' ;以ASCLL码‘0’结束; 在第二行
DB 18H,18H,07H,08H,08H,08H,07H,00H ;℃,代码为06H
DB 04H,0AH,15H,04H,04H,04H,04H,00H ;↑,代码为07H
LCD1602自定义显示字符及汉字
LCD1602自定义显示字符及汉字整理:大海橡树第一篇讲解一下LCD1602,学过单片机的朋友们都知道它了吧,可以说是用的最广,最简单,也是学液晶入门级别的一块液晶了。
LCD1602顾名思义就是两行显示的液晶,每行最多显示16个字符(里面总共有160个字符),其中包括阿拉伯数字、英文字母的大小写,常用符号,及日文的假名!每个字符对应一个ASCII码,我们通过向液晶送相应符号的ASCII码来显示这个字符。
下面看一下Proteus软件中的LCD1602,在Proteus软件的元件库中,LCD1602为LM016L,下面是这块液晶的引脚图:具体的相关引脚和功能设定参看LCD1602的PDF文档资料,由于篇幅问题,这里就不赘述了!还有一点要说的就是大家在仿真LCD1602时,要是用的是DB7~DB0连单片机的P0口的话,一定要加上拉电阻,要不然驱动不了,因为单片机的四组IO口就P0的内部无上拉,驱动能力弱!看下面的图:在P0口加了排阻(RESPACK-8)对于自带字符的显示,只需要将对应的ASCII码写入LCD中显示即可,这个是每个人开始学习液晶最开始要学会的了,看看数据手册,写写程序,想必大家都会了,这里就不做介绍,本篇着重讲解一下怎样自定义显示字符,比如显示自定的字符、显示汉字等等这些!要显示我们自定义的字符,就要用到LCD中的CGRAM存储器(character generate RAM),而我们之前用的显示自带的字符用到的是DDRAM,两个是不同的。
看液晶手册我们知道,CGRAM的地址是0x40~0x7F,共128个字节,而一个字符是8个字节,所以一共能显示8个自定义的字符。
内部常用字符的显示是从0x20开始的,0x00~0x0F是专门留给自定义字符显示用的。
那么怎样显示一个自定义字符呢?首先我们要清楚LCD1602显示字符的点阵大小,眼力好的可以看出来,LCD1602一个显示字符的位置是5*8的点阵,也就是说它所能显示的点阵图形的大小是5*8的!要显示一个自定义的字符,首先我们要知道所显示自定义字符的点阵数据,也就是在一个5*8的点阵上那个点是黑的(将该点点黑,就是高电平----1),哪个点是白的(该点不显示,为低电平----0),但是我们送入到LCD中的是ASCII码,它是8位的数据,而一个显示字符的点阵大小只是5*8的,显然不够,显示的办法是8*8点阵的前三列不用,也就是不显示,我们只用后面的5列来显示。
一、常用液晶的使用之LCD1602显示自定义字符及汉字
一、常用液晶的使用之LCD1602显示自定义字符及汉字一、常用液晶的使用之LCD1602显示自定义字符及汉字2010年12月22日星期三 11:00好久没写单片机的文章了,一直以来比较忙,早就想写一个关于常见液晶的使用方法的,但是一直没机会写,只得抽些时间写一下了,总共介绍两款液晶吧,LCD1602和LCD12864,原本还想加上NOKIA5110的,但是Proteus仿真库里面没有就不写了!呵呵,有什么不妥的地方,还望大家指正啊!第一篇讲解一下LCD1602,学过单片机的朋友们都知道它了吧,可以说是用的最广,最简单,也是学液晶入门级别的一块液晶了。
LCD1602顾名思义就是两行显示的液晶,每行最多显示16个字符(里面总共有160个字符),其中包括阿拉伯数字、英文字母的大小写,常用符号,及日文的假名!每个字符对应一个ASCII码,我们通过向液晶送相应符号的ASCII码来显示这个字符。
下面看一下Proteus软件中的LCD1602,在Proteus软件的元件库中,LCD1602为LM016L,下面是这块液晶的引脚图:具体的相关引脚和功能设定参看LCD1602的PDF文档资料,由于篇幅问题,这里就不赘述了!还有一点要说的就是大家在仿真LCD1602时,要是用的是DB7~DB0连单片机的P0口的话,一定要加上拉电阻,要不然驱动不了,因为单片机的四组IO口就P0的内部无上拉,驱动能力弱!看下面的图:在P0口加了排阻(RESPACK-8)对于自带字符的显示,只需要将对应的ASCII码写入LCD中显示即可,这个是每个人开始学习液晶最开始要学会的了,看看数据手册,写写程序,想必大家都会了,这里就不做介绍,本篇着重讲解一下怎样自定义显示字符,比如显示自定的字符、显示汉字等等这些!要显示我们自定义的字符,就要用到LCD中的CGRAM存储器(character generate RAM),而我们之前用的显示自带的字符用到的是DDRAM,两个是不同的。
LCD1602自定义字符
while(1);
}
2012-08-05
//代码作者:陈辉
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbi;
sbit lcdrs=P3^5;
sbit lcden=P3^4;
uchar table[]={0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,0x02};//年,用取模软件取得点阵数组
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com)//写指令函数
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)//写数据函数
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()//初始化函数
{
dula=0;
wela=0;
lcden=0;
write_com(0x38); //显示模式设置
write_com(0x0c);//显示光标设置,打开光标显示并闪烁
LCD1602自定义字符示例
设定CGRAM地址指令
功能:设定下一个要存入数据的CGRAM的地址。
DB5DB4DB3为字符号,也就是你将来要显示该字符时要用到的字符
LCD1602自定义字符的方法
LCD1602自定义字符的方法LCD1602内含有八个自定义的字符空间,用户可以根据需要设置自定义字符,不过字符的像素通常是5X7。
如果需要更大像素的字符,就只能用多个5X7的字符拼合。
每个自定义字符的字节有8个,最后一个是0x00;每个字节的高3位为0,即000? ????。
自定义字符设置与应用步骤如下:1、设置自定义字符的代码并存入数组。
每个字符分7行,每行有5个像素,如果需要显示,此位设定为1,否则为0。
本人用VBA制作了《LCD1602自定义字符生成器》,使用简单,需要可函索。
联系:2、按常规方法初始化LCD1602。
3、写命令:40H。
4、写数据:将代码数组写入LCD1602中的CGRAM中。
5、按常规方法设置要显示字符的位置。
如写命令:80H(第一行第1个字符位置)或c0H(第二行第1个字符位置)。
6、写数据显示自定义字符:写0显示第1个自定义字符,写1显示第2个自定义字符……依此类推。
注意写入的0或1等是指数字而不是字符,不能加单引号。
下面是生成好的自定义字符代码数组,供参考:uchar codetable1[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00 };//字符℃uchar codetable2[]={0x04,0x1F,0x00,0x0A,0x0A,0x0A,0x1B,0x00 };//字符六uchar codetable3[]={0x04,0x1D,0x14,0x15,0x14,0x1D,0x04,0x00 };//字符小喇叭uchar codetable4[]={0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00 };//字符一uchar codetable5[]={0x00,0x0E,0x00,0x00,0x00,0x1F,0x00,0x00 };//字符二uchar codetable6[]={0x0E,0x00,0x00,0x0E,0x00,0x00,0x1F,0x00 };//字符三uchar codetable7[]={0x1F,0x11,0x15,0x15,0x1F,0x11,0x1F,0x00 };//字符四uchar codetable8[]={0x1E,0x08,0x08,0x1E,0x0A,0x0A,0x1F,0x00 };//字符五uchar codetable9[]={0x08,0x1F,0x12,0x0F,0x0A,0x1F,0x02,0x00 };//字符年uchar codetable10[]={0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x0 0};//字符月uchar codetable11[]={0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x0 0};//字符日uchar codetable12[]={0x04,0x1F,0x0A,0x1F,0x04,0x1F,0x15,0x0 0};//字符新左半部uchar codetable13[]={0x1F,0x10,0x10,0x1F,0x12,0x12,0x12,0x0 0};//字符新右半部主程序:void main(){uchar m;init_LCD();delayms(10);write_LCD_Command(0x40); //写命令for(m=0;m<8;m++)write_LCD_data(table1[m]); //将代码写入CGRAM中write_LCD_Command(0x80); //设定显示位置write_LCD_data(0); //显示第1个自定义字符while(1);}。
LCD1602液晶显示实验
LCD1602液晶显示实验1.实验原理1.1 基本原理1.1.1 1602字符型LCD简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
1.1.2 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图1-2所示:图1-2 1602LCD尺寸图1.1602LCD主要技术参数:显示容量: 16×2个字符芯片工作电压: 4.5~5.5V工作电流: 2.0mA(5.0V)模块最佳工作电压: 5.0V字符尺寸: 2.95×4.35(W×H)mm2.引脚功能说明:1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表:表1-3引脚接口说明表编符号引脚说明编号符号引脚说明号1 VSS 电源地9 D2 数据2 VDD 电源正极10 D3 数据3 VL 液晶显示偏压11 D4 数据4 RS 数据/命令选择12 D5 数据5 R/W 读/写选择13 D6 数据6 E 使能信号14 D7 数据7 D0 数据15 BLA 背光源正极8 D1 数据16 BLK 背光源负极1.1.3 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表1-4所示:表1-4 控制命令表序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D01 清显示0 0 0 0 0 0 0 0 0 12 光标返回0 0 0 0 0 0 0 0 1 *3 置输入模式0 0 0 0 0 0 0 1 I/D S4 显示开/关控制0 0 0 0 0 0 1 D C B5 光标或字符移位0 0 0 0 0 1 S/C R/L * *6 置功能0 0 0 0 1 DL N F * *7 置字符发生存贮器地址0 0 0 1 字符发生存贮器地址8 置数据存贮器地址0 0 1 显示数据存贮器地址9 读忙标志或地址0 1 BF 计数器地址10 写数到CGRAM或DDRAM)1 0 要写的数据内容11 从CGRAM或DDRAM读数1 1 读出的数据内容1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
lcd1602屏驱动自定义字符
lcd1602 屏驱动(自定义字符)1、时序图2、代码3、自定义字符时序图代码:#include ;#include;sbit RS = P2^4;//定义端口sbit RW = P2^5;sbit EN = P2^6;void Delayus(unsigned char t) // us级别延时{while(--t);}void Delayms(unsigned char t)// ms级别延时{while(t--){//大致延时1mSDelayus(245);Delayus(245);}}bit m_1602() //判断1602是否忙{P0 = 0xFF; //准备读取RS = 0;RW = 1;EN = 0;_nop_();EN = 1; //产生高电平return (bit)(P0 & 0x80);}void x_1602(bit i,unsigned char j) //参数一是写(0、写指令 1、写数据),参数二是写入的8位数据{while(m_1602()){_nop_();_nop_();_nop_();_nop_();_nop_();}RS = i;RW = 0;EN = 1;P0 = j;_nop_();EN = 0; //产生下降沿}void qp_1602() //清屏函数{x_1602(0,0x01); //第一个参数是:写入的类型(0、写指令 1、写数据),第一个参数是:写入的数据Delayms(5);}//显示字符void zf_1602(unsigned char x,unsigned chary,unsigned dat) //参数一是显示的列,参数二是显示的行,参数三是显示的数据{if(y==0){x_1602(0,(0x80+x)); //第一行}else{x_1602(0,(0xc0+x)); //第二行}x_1602(1,dat); //写入数据}void zfc_1602(unsigned char x,unsigned char y,unsigned char *dat){if(y==0){x_1602(0,(0x80+x)); //第一行}else{x_1602(0,(0xc0+x)); //第二行}while(*dat) //&:取地址 *:取值{x_1602(1,*dat);dat ++;}}void csh_1602() //初始化1602{x_1602(0,0x38); //显示模式设置Delayms(5);x_1602(0,0x38);Delayms(5);x_1602(0,0x38);Delayms(5);x_1602(0,0x38);x_1602(0,0x08); //显示关闭.x_1602(0,0x01); //显示清屏x_1602(0,0x06); //显示光标移动设置Delayms(5);x_1602(0,0x0c); //显示开及光标设置}void main(){csh_1602();qp_1602();while(1){zf_1602(0,0,'Q'); //写入字符zf_1602(1,0,'Q'); //写入字符zf_1602(2,0,' '); //写入字符zfc_1602(3,0,"www.baidu.con"); //写入字符串zfc_1602(1,1,"1990.02.08"); //写入字符串while(1);}}自定义字符(转)图示:用户自定义字符的应用:我们从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。
通用型LCD1602自定义字符的显示
通用型LCD1602自定义字符的显示LCD1602主要用来显示数字、字母、图形以及少量自定义字符。
由于其显示控制简单,性价比高,广泛用于电子表、冰箱、空调、汽车电子仪表等装置。
本文主要研究一下如何在LCD1602显示自定义字符。
虽然技术含量不高,但是注意编程的细节还是很有必要去探讨一番。
1.引言液晶显示器的英文名是Liquid CrystalDisplay,简称LCD.液晶显示器作为显示器件具有体积小、重量轻、功耗低,性价比高等优点,所以LCD日渐成为各种便携式电子产品的理想显示器,1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,它有若干个5X7或5X11点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能像12864一样显示图形,但是有时候很想要用图形表示,那么LCD1602提供了8个空间的自定义字符,如图1所示,显示的年月日,.C 就是自定义字符。
2.通用型LCD1602操作方法LCD1602是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
如图2所示,字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),从左到右分别是1引脚到16引脚在这里要说明的是:(1)要用1602型LCD显示字符必须解决3个问题:a.待显示字符ASCII标准码产生;b.液晶显示模式的设置;c.字符显示位置的指定。
(2)若想在00H处显示数据的话,则必须将00H加上80H,即0x00H+0x80H,若要在01H处显示数据,也必须加0x80H,例如要将某字符显示在第2行第5列,则确定地址的。
液晶LCD1602使用手册
5.2 读操作时序
项目 使能 E 时钟周期 使能 E 脉宽 使能 E 上升/下降沿时间 地址建立时间( RS,R/W 到 E) 地址保持时间 数据建立时间
符号 tcycE PWEH tE、tEf tAS tAH tDDR
最小值 1000 450 ― 60 20 ―
最大值 ― ― 25 ― ― 360
液晶显示模块 1602 使用手册
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ � � 显示回到原始状态 DDRAM 中的内容不变
7.3 进入模式设置指令 RS 0 R/W 0 D7 0 D6 0 D5 0 D4 0 D3 0 D2 1 D1 I/D D0 S
I/D:DDRAM 地址增加/减少 � � I/D=1,光标或闪烁向右移动,DDRAM 地址增加 1。 I/D=0,光标或闪烁向左移动,DDRAM 地址减少 1。
7.2 归位 RS 0 � � R/W 0 D7 0 D6 0 D5 0 D4 0 D3 0 D2 0 D1 1 D0 ―
归位指令置地址计数器 AC=0 光标回原点
9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @ 珠联璧合 xlzhu xlzhu@
6. 寄存器 6.1 数据寄存器 DR 数据寄存器用来暂时储存来自 DDRAM/CGRAM 的读写数据。 6.2 指令寄存器 IR 指令寄存器用来储存来自微控制器的指令码。微控制器不能使用它来读取指令数据。 用 户可以通过 RS 和 R/W 信号组合来选择寄存器,进行相应的操作。
RS 0 0 1 1 6.3 忙标志 BF
以上定义了“王”字符,对应字符码为 00H,CGRAM 地址为 0H。 7. 指令描述 7.1 清显示 RS 0 � � � R/W 0 D7 0 D6 0 D5 0 D4 0 D3 0 D2 0 D1 0 D0 1
1602显示汉字和自定义字符库
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,但是没有汉字库。
每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
今天偶然在网上发现有的人利用1602显示简单的汉字,对这个产生了兴趣,上网搜了一些资料,自己慢慢的研究了一下,终于弄懂了怎么回事,自己也写了一个显示“天”,“℃”,“你”,“土”,心形,“明”的程序。
下面就和大家一起分享一下。
查看LCD1602的CGROM字符代码表,可以发现从00000000B~00000111B (00H~07H)地址的内容是没有定义的,它是留给用户自己定义的,用户可以通过先定义LCD1602的CGRAM中的内容,最多可以自定义8个字符,然后就可以同调用CGROM字符一样来调用自定义好的字符。
那么如何设定CGRAM中的内容呢?首先我们要把所要编写的字符对应于5X8点阵的“字模”提取出来,我们可以通过相关的软件来提取,也可以手工提取。
说白了也就是将点阵的某一行中有显示的点用1表示,无显示的点用0表示,以此形成该行对应的字模数据。
设定CGRAM的内容,要一行一行的设定,每一行对应一个CGRAM,5X8点阵,每行5点,共8行,因此要将8行的字模数据都写入CGRAM。
写好后,就可像调用CGROM字符一样来来调用它了(CGRAM是可写可读的,CGROM只可读不可写)。
下面贴出我的程序(见1602LCD文件夹中的1602显示汉字.Uv2文件),实物图和Proteus仿真图,由于一个字符的点数为5X8,点数太少所以显示效果不是很好,经实验发现实物效果比仿真要好,下面为两者的效果图。
LCD1602显示中文汉字
LCD1602显示中文汉字LCD1602相比大家都比较了解,但是我们一般只用来显示字符,数字。
最近在网上看许多人用LCD1602来显示汉字,觉得有趣于是拜读了一些资料,教程,但感觉大部分相当晦涩难懂,本人认为既然是教程,就不必要相当的复杂,毕竟人家看完许久后还是不能得出实验结果~!!接下我谈谈我得做法,保证你10分钟之内一样可以在LCD1602上显示你想显示的各种符号,汉字!!!首先:我们要弄清楚一个概念,其实我们使用1602显示中文汉字,就是利用其内部的自定义字节空间,我们都知道LCD1602内部有一个64字节的自定义CGRAM,那么好,我们就是要利用自定义字节来达到显示汉字的效果.我们知道一个字符占8个字节,所以在CGRAM能够存放8个字符。
也就是说,这个64字节的CGRAM是给我们提供写入数据的,那么我们怎么把我们要的汉字写入CGRAM呢?不要急,大家查看LCD1602的用户手册,里面提到当我们需要想CGRAM写入数据时,我们需要先写入CGRAM的地址,从手册上可知,CGRAM的地址为0x40.所以当我们要写入数据时,要先写入一条地址命令write_com(0x040);然后把你要写入的数据通过写数据命令写入write_date( 你要写得数据);做完以上步骤了,是不是LCD1602就会显示你输入的汉字呢?不要急,以上你只是把你要显示汉字的代码存放在CGRAM里,就相当于其他常用字符一样固定在LCD里面了,如果你不把它读出来,LCD是不会显示的。
当你把上面的步骤做完后,接下来要做的与你平常怎么使用LCD1602是一样的,只不过是LCD1602里面增加了一些你自定义的字符,汉字。
可能到这里,也许会有些疑问,既然自定义字符、汉字的代码需要我们自己输入,那么我该怎么编写这些代码,呵呵,不要着急,接下来就要用到下面这个取字模软件。
相信有的朋友应该都用过这个软件。
那么我们怎么来使用这个软件来获取代码呢?大家有没有注意到,我们的LCD1602是5*8点阵(可以数一数)。
lcd1602液晶自定义
点阵字符型液晶模块,1602A,HD44780,自定义字符一、前言点阵字符型液晶模块1602A采用HD44780或其兼容芯片,可以显示2行16个5×7点阵字符.当仪器仪表中需要显示少量信息时,应用广泛.HD44780内置了160个5×7点阵字符图形,用于字符显示.除了显示英文、日文及数字,还可以通过自定义字符,在片内自定义8个字符,显示特殊字符甚至笔画比较少的汉字.但是在具体应用时,各部分地址调用时格式特殊,比较难理解.各种资料上面对自定义字符的介绍较少,本文参考HITACHI的数据手册,给出应用的具体方法.二、HD44780命令字控制1602A显示模块并显示字符,是通过向其驱动芯片HD44780发送命令字和发送数据来完成的.HD44780共定义了11个命令字,各命令字含义见表1.在CGRAM/DDRAM数据读写指令执行完毕后,地址计数器AC自动加1或减1,更新在忙标志BF清零之后进行.三、自定义字符步骤在对模块初始化的过程里面,定义显示方式、光标、字符移位方式、自定义字符和开显示等操作.在需要显示自定义字符时,与显示内置字符的方法是相同的,只是CGRAM的地址有所区别.在写入CRRAM或DDRAM 地址以后,写入对应的数据列.具体请参考下面的程序实例.下面给出自定义字符点阵时定义和调用时的步骤.1、在显示初始化时写入控制命令字,以设置CGRAM地址.CGRAM中只能自定义8个5×7点阵字符(后面会看到限制8个自定义字符的原因),对应的CGRAM地址范围是000 000 –000 111.定义这8个5×7点阵字符对应的控制命令字分别为:40H,48H,50H,58H,60H,68H,70H,78H2、向CGRAM写入字型编码数据(CGRAM数据).表2显示了各地址位和数据位对应关系.对于5×7点阵字符,连续写入7行点阵数据.每行分别对应CGRAM 数据0-4位(第4位在左侧),需要显示的对应点置1,反之则置0.例如,自定义字符为字*****“R”,则连续写入的字型数据为:1EH,11H,11H,1EH,14H,12H,11H3、向模块写入字符码值,调用自定义字符.在调用自定义字符时,要注意CGRAM地址以3位一组排列,字符码值0-2位对应CGRAM地址位3-5.字符码值4-7位全0,而第3位无效,可以是0或1.这就是自定义CGRAM空间为16个字节,却只能定义8个字符的原因.所以上面例子CGRAM中第一个自定义的字符“R”可以用码值00H或08H选中.据此,显示8个自定义字符的字符码值分别为:00H、01H、02H、03H、04H、05H、06H和07H,或者08H、09H、0AH、0BH、0CH、0DH、0EH和0FH.。
用1602液晶显示自定义字符
1602是一款最常用也是最便宜的液晶显示屏。
最多可以显示两行标准字符,每行最多可以显示16个字符。
1602可以显示内部常用字符(包括阿拉伯数字,英文字母大小写,常用符号和日文假名等),也可以显示自定义字符(单或多个字符组成的简单汉字,符号,图案等,最多可以产生8个自定义字符)。
一、显示常用字符。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是41H,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”十进制十六进制 ASCII字符十进制十六进制 ASCII字符十进制十六进制 ASCII字符00 00 自定义字符1 56 38 8 96 60 `01 01 自定义字符2 57 39 9 97 61 a02 02 自定义字符3 58 3A : 98 62 b03 03 自定义字符4 59 3B ; 99 63 c04 04 自定义字符5 60 3C < 100 64 d05 05 自定义字符6 61 3D = 101 65 e06 06 自定义字符7 62 3E > 102 66 f07 07 自定义字符8 63 3F ? 103 67 g08 08 自定义字符1 64 40 @ 104 68 h09 09 自定义字符2 65 41 A 105 69 i10 0A 自定义字符3 66 42 B 106 6A j11 0B 自定义字符4 67 43 C 107 6B k12 0C 自定义字符5 68 44 D 108 6C l13 0D 自定义字符6 69 45 E 109 6D m14 0E 自定义字符7 70 46 F 110 6E n15 0F 自定义字符8 71 47 G 111 6F o32 20 空格 72 48 H 112 70 p33 21 ! 73 49 I 113 71 q34 22 " 74 4A J 114 72 r35 23 # 75 4B K 115 73 s36 24 $ 76 4C L 116 74 t37 25 % 77 4D M 117 75 u38 26 & 78 4E N 118 76 v39 27 ' 79 4F O 119 77 w40 28 ( 80 50 P 120 78 x41 29 ) 81 51 Q 121 79 y42 2A * 82 52 R 122 7A z43 2B + 83 53 S 123 7B {44 2C , 84 54 T 124 7C |45 2D - 85 55 U 125 7D }46 2E . 86 56 V 126 7E ~47 2F / 87 57 W48 30 0 88 58 X49 31 1 89 59 Y50 32 2 90 5A Z51 33 3 91 5B [52 34 4 92 5C \53 35 5 93 5D ]54 36 6 94 5E ^55 37 7 95 5F _显示操作的过程:首先确认显示的位置,即在第几行,第几个字符开始显示。
LCD1602自定义显示字符及汉字
OK,字符取模就结束了,接下来时程序: /*************/echoas/home********* 程序:LCD1602的驱动原理及应用 内容:显示自定义字符 软件:Keil uVisoin4 开发板:proteus 仿真图 作者:大海橡树 ************/echoas/home***********/ #include<AT89X52.h> sbit RS=P2^0; sbit RW=P2^1; sbit EN=P2^2;//LCD 的三个控制端 unsigned char table[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A}; void delay(unsigned int i) { while(--i); } void Read_busy() //忙检测,DB7为1则 busy,不能进行读写操作 ;每次读写前应示的汉字不是很好看!呵呵,不过还是能看清的!我们在 LCD1602做数字 钟的时候可以用一个或两个 CGRAM 来显示年、月、日;上面的这个字 8 个 CGRAM 地址都用上了,其实我们可以用数码管动态扫描的原理在 LCD1602 上 显示四个大的汉字,因为每次显示一个汉字是8个 CGRAM 都用上了,所以没次 只显示一个!根据动态扫描的原理就能够实现四个汉字同时显示!有兴趣的朋友 可以试一下! LCD1602 就介绍到这里,想必大家都会了!下一篇有时间的话给大家介绍 LCD12864液晶,带字库的和不带字库的两种!用12864显示动画、温后呢,在里面打点,注意前三列空着不打点。这里我们显示自定义字符显示黑 白相间的点吧,于自带字符的显示,只需要将对应的 ASCII 码写入 LCD 中显示即可,这个是 每个人开始学习液晶最开始要学会的了,看看数据手册,写写程序,想必大家都 会了,这里就不做介绍,本篇着重讲解一下怎样自定义显示字符,比如显示自定 的字符、显示汉字等等这些! 要 显示我们自定义的字符,就要用到 LCD 中的 CGRAM 存储器( character generate RAM) ,而我们之前用的显示自带的字符用到的是 DDRAM,两个是不 同的。看液晶手册我们知道, CGRAM 的地址是0x40 ~ 0x7F,共128个字节,而 一个字符是8个字节, 所以一共能显示8个自定义的字符。内部常用字符的显示是 从0x20开始的,0x00 ~ 0x0F 是专门留给自定义字符显示用的。那么怎样显示一 个自定义字符呢? 首 先我们要清楚 LCD1602 显示字符的点阵大小,眼力好的可以看出来, LCD1602一个显示字符的位置是 5*8的点阵,也就是说它所能显示的点阵图形的 大小是5*8的!要显示一个自定义的字符,首先我们要知道所显示自定义字符的 点阵数据,也就是在一个 5*8的点阵上那个点是黑的(将该点点黑,就是高电平 ----1) ,哪个点是白的(该点不显示,为低电平----0 ) ,但是我们送入到 LCD 中 的是 ASCII 码,它是8位的数据,而一个显示字符的点阵大小只 是5*8的,显然 不够,显示的办法是8*8点阵的前三列不用,也就是不显示,我们只用后面的5 列来显示。 然后设定我们是要定义第几个自定义字符,前面已真图:
LCD1602的自定义字库显示自定义字符或汉字
液晶显示模块可以分为字段,字符点阵,图形点阵 3 种。
一般只有后者可以显示汉字和图形。
LCD 1602 是常见的16 × 2 行,6 × 8 字符点阵液晶模块,广泛应用于智能仪表、通信、办公自动化设备中,其字符发生器 ROM 中自带数字和英文字母及一些特殊符号的字符库,没有汉字。
我们利用 1602 可以建立 8 个 6 × 8 点阵自定义字库的特点,在一个测温的实例中成功显示了少量汉字和特殊符号——℃,下面是显示部分的实施方法。
一、电路构成简图LCD1602 液晶显示模块按图 1 所示连接单片机,其接口的引脚功能介绍如下:BLA :背光源正极,接 +5V ;BLK :背光源负极,接地;VO :液晶显示偏压信号,通过电位器 W1 调节, 1602 偏压接近 0V ;RS :接 P1 . 2 ,决定传输类型是数据或命令, 1- 表示数据, 0- 表示命令;R / W :接 P1 . 6 ,读/写控制, 1 一表示读, O 一表示写;E :接 P13 ,使能端,高电平有效;DB0 ~ DB7 :数据端口,连接 P0 。
液晶显示模块 1602 更详细的信息可以查阅相关的资料,此处不再赘述。
二、自定义字库的建立及关键子程序的软件实现若要显示汉字,关键是先要自己建立欲显示的汉字字库。
1602 提供了,在片内CGRAM 的 00H 一 3FH 共 64 个字节的空间,可以存放 8 个 6 × 8 点阵的自建字符库,其代码分别为 00H 一 07H ,然后在显示时只要用查表法调用汉字的相应代码就可以了。
下面给出相应的子程序,为了更好地理解 1602 液晶显示模块的相关指令,以注释的方式存程序中给出解释 .1 .显示自定义字符内容的流程图图3为 6 × 8点阵形成的“日”字,前面3位补0,其编码为1FH,11H,11H,1FH,11H,1FH,00H。
其他汉字可以以此编出相应的编码。
通用型1602LCD自定义字符的显示
忙于处 理其他指令 ,就等待 ;如 果不忙 ,再执 行 写指令 。为此 ,1 6 0 2 型L C D 专 门设 了一个 忙 碌标 志位B F ,该位链接在8 位双 向数据线的D B 7 位上 。如果B F 为低 电平 “ 0 ”,表示 L C D 不忙; 如果B F 为高 电平 “1 ”,则表示L C D 处于忙碌状 态 ,需要等待。假定1 6 0 2 型L C D 的8 位双 向数据 线( D B O ~D B 7 ) 是通过单片机 的P O 口 进行 数据传 递 的,那么 只要检测P 0 口的P O . 7 引脚 电平 ( D B 连P 0 . 7 ) 就可以知道忙碌标志位B F 的状态。 3 . L C D 1 6 0 2 的硬件连接及显示 L C D 1 6 0 2 的显示主要 根据硬件 原理 图焊 接 好 ,学会使 用l l 条指令 ,再根据 时序 图 ( 如图3 所示 ) 写 出写指令 函数 ,写数据 函数 ,以及 读 忙标志 函数 ,那么就可 以轻松去调用。 ( 1 ) 1 6 0 2  ̄ H 单片机 的连接 图
式,即低 电平; C . 将 数据或命令送达数据线上; d . 给E 一个 高脉 冲将 数 据 送入 液 晶 控 制 器 ,完 成 写 操作 。 4 . 1 6 o 2 L c D 的 自定义字符 : 从C G R A M 表 上 可 以看 到 , 在 表 的 最 左 边 是 列 可 以允许用 户 自定 义的C G R A M ,从上往 下 看是 1 6 个 ,实 际 只有8 个字节 可用 。首先设置 C G R A M  ̄址 的指令如下:
0C , ; 000■■0 C , 000●00- i
图2 1 6 0 2 L C D 与单片机的硬件连接图 图1 L C D 1 6 0 2 显 示自定义字符年月 日
字符型LCD1602显示字符试验分析6
在LCD1602中显示“LCD1602 check ok”下排显示“study up” 程序中没有用到忙检测,而是用的是延时函数来替代忙检测。
➢ 程序分析-1:
#include<reg52.h> //包含头文件
#define uint unsigned int //预定义一下
#define uchar unsigned char
显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm
字符型LCD1602显示字符实验分析 4
三、引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各 引脚接口说明如表10-13所示:
//使能线电平变化,数据送入1602的8位数据口
en=0;
}
字符型LCD1602显示字符实验分析 11
六、程序设计
➢ 程序分析-5:
void lcd_init() {
lcd_wcom(0x38); lcd_wcom(0x0c); lcd_wcom(0x06); 置右移一位 lcd_wcom(0x01); }
4 显示开/关控制
0 0 0 0 0 0 1DC B
5 光标或字符移位
0 0 0 0 0 1 S/C R/L * *
6 置功能
0 0 0 0 1 DL N F * *
7 置字符发生存贮器地址 0 0 0 1
字符发生存贮器地址
8 置数据存贮器地址
0 01
显示数据存贮器地址
9 读忙标志或地址
0 1 BF
计数器地址
10
写数到CGRAM或 DDRAM)
LCD1602自定义点阵字符
{
uintj=1000;//超时变量
Data=0x80;
rs=0;//rs=0rw=1E=1读状态
rw=1;
en=1;
while((Data&0x80)&&j--)_nop_();//忙则等待一个nop大概1us
配合上面的j=1000做1ms超时判断
en=1;
en=0;
}
voidwrite_data(uchardate)
{ቤተ መጻሕፍቲ ባይዱ
read_sta();
rs=1;//rs=1写数据
rw=0;
Data=date;
en=0;//同上
en=1;
en=0;
}
voidlcd1602_init()
{
write_com(0x38);//8位数据口,两行显示,5*7点阵字符
}
for(i=0;i{
write_com(0x80+0x40+i);//第二行
write_data(0x07);//0x07是第第8个因为是从0开始
}
while(1)
{
}
}
使用时先把这些编码填充到CGRAM
随便用8*8取模软件画了两个字符下面为示例代码
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineDataP0//数据口
sbiten=P2;//E脉冲控制信号端口
sbitrs=P2;//命令控制端口
en=0;//en拉低
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
write_com(0x0f); //显示开,光标开,光标闪烁
delay(1);
write_com(0x0C); //显示开
write_com(0x01); //清屏
delay(5);
write_com(0x06); //光标右移,文字不移动
}
/************主程序**********/
{
lcdrs=1;
lcdwr=0;
lcden=0;
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
//自定义显示字符
void self_data() //写入自定义字符
{
unsigned char num;
/***************************************************
主要目的:用于查看LCD 1602 的点阵字符
测试自定义汉字显示
失望,只能显示8个5x8的点阵
驱动方式:89c52 + 1602LCD
P1.1 - RS; P1.2 - RW; P1.3 - EN;
/************延时******************/
void delay(unint z)
{
unint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/***********写指令*************/
void write_com(unchar com)
void main()
{
init();
delay(5);
self_data();
delay(5);
write();//循环显示
while(1);
}
for(n=0;n<256;n++) //第二行显示字符列表
{
write_com(0xC0+7);
c=(n+1)/100;
b=(n+1)%100/10;
a=(n+1)%10;
write_data(number[c]);
write_data(number[b]);
write_data(number[a]);
write_com(0xC0+12);
write_data(0x00+n);
delay(1000);
}
}
/***********初始化*****************/
void init ()
{
delay(40);//延时40ms,根据不同的主控芯片,初始化的命令有所不同
write_com(0x06);
write_com(0x40);//第一个自定义字符的地址(CGRAM)
for(num=0;num<64;num++)
{
write_data(self_dat[num]);
}
}
/**********lcd显示**********/
{
write_data(ADD_HEX[n]);
// delay(5);
}
write_com(0x80);
for(n=0;n<5;n++)
{
write_data(table1[n]);
}
write_com(0xC0);
for(n=0;n<6;n++)
#include<stdio.h>
#include <intrins.h>
#include<reg51.h>
#define unchar unsigned char
#define unint unsigned int
sbit lcdrs=P1^0;
sbit lcdwr=P1^1;
sbit lcden=P1^2;
P0.0 - D0; P0.1 - D1; P0.2 - D2; P0.3 - D3;
P0.4 - D4; P0.5 - D5; P0.6 - D6; P0.7 - D7;
2011.12.3
***************************************************/
write_com(0x38); //8总线方式,双行显示,5x8点阵字符
delay(1);
write_com(0x38); //8总线方式,双行显示,5x8点阵字符
delay(1);
write_com(0x38); //8总线方式,双行显示,5x8点阵字符
delay(1);
//0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00, //一
0x00,0x00,0x0E,0x00,0x00,0x1F,0x00,0x00, //二
0x00,0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00, //三
0x00,0x00,0x1F,0x15,0x1B,0x11,0x1F,0x00, //四
void write()
{
unchar a; //个位
unchar b; //十位
unchar c; //百位
//自只能定义8个字符
write_com(0x80+7); //第一行显示自定义的字符:年月日二三四五六,一可以用 - 代替
for(n=0;n<8;n++)
0x00,0x1F,0x04,0x0F,0x05,0x05,0x1F,0x00, //五
0x00,0x04,0x1F,0x00,0x0A,0x0A,0x11,0x00, //六
0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}; //℃
//====================================================================
{
write_data(table2[n]);
}
//LMB162A 的 CGRAM 共有256个字符,可供用户使用自定义
//的字符位置只有8个,如果能把自定义的字符写进 CGROM
//就好了
//这里使用 序号 + 字符 方式显示点阵字库,包含自定义字符
//显示的序号 -1 就是字符的地址
unchar n;
unchar code self_dat[]={
0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x00, //年
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00, //月
0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00, //日
{
lcdrs=0;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
/***********写数据****************/
void write_data(unchar date)
unchar code table1[]="Test:";
unchar code table2[]="Start:";
unchar code ADD_HEX[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//写入的自定义字符的位置
unchar code number[10]={"0123456789"};