LCD1602显示中文汉字
LCD1602汉字显示讲解

LCD1602显示汉字研究与程序设计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中文资料

LCD1602中文资料1. 简介LCD1602是一种常见的液晶显示模块,它具有两行,每行可以显示16个中文字符或32个英文字母字符。
它广泛应用于数字仪表、电子产品、家电控制、智能家居等领域。
2. 主要特点•显示容量:LCD1602可以同时显示两行,每行可以显示16个中文字符或32个英文字母字符。
•分辨率:每个字符由5 x 8个像素点组成。
•背光控制:可通过控制背光开关来控制显示背光。
•低功耗:LCD1602使用低功耗驱动电路,非常适合电池供电的应用。
•接口简单:LCD1602使用标准的I2C接口进行通信,方便与各种微控制器连接。
3. 硬件连接LCD1602的硬件连接非常简单,只需要将其的VCC引脚连接到3.3V或5V电源,GND引脚连接到地,SDA引脚连接到I2C总线的数据线,SCL引脚连接到I2C总线的时钟线。
以下是连接示意图:SDA ———————————> I2C总线数据线SCL ———————————> I2C总线时钟线VCC ———————————> 3.3V或5V电源GND ———————————> 地4. 软件驱动使用LCD1602显示中文需要相应的软件驱动。
以下是使用Python编写的一个简单的LCD1602驱动代码示例:import smbus2import time# LCD1602的I2C地址ADDRESS =0x27# LCD1602的控制命令LCD_COMMAND =0x80LCD_DATA =0x40def lcd_init():# 初始化LCD1602bus = smbus2.SMBus(1)bus.write_byte(ADDRESS, 0x38) # 设置显示模式为2行,5 x 8个像素点bus.write_byte(ADDRESS, 0x0c) # 打开显示,关闭光标bus.write_byte(ADDRESS, 0x06) # 设置光标移动方向为从左到右bus.write_byte(ADDRESS, 0x01) # 清屏def lcd_write(ch):# 向LCD1602写入字符bus = smbus2.SMBus(1)bus.write_byte(ADDRESS, LCD_DATA)bus.write_byte(ADDRESS, ord(ch))def lcd_display(text):# 在LCD1602上显示文本bus = smbus2.SMBus(1)bus.write_byte(ADDRESS, LCD_COMMAND) for ch in text:bus.write_byte(ADDRESS, ord(ch))# 使用示例lcd_init() # 初始化LCD1602lcd_display('Hello, World!') # 在LCD1602上显示文本5. 示例应用使用LCD1602显示中文可以应用于各种场景,以下是一个使用LCD1602显示温湿度的示例应用:import smbus2import Adafruit_DHT# LCD1602的I2C地址ADDRESS =0x27# LCD1602的控制命令LCD_COMMAND =0x80LCD_DATA =0x40def lcd_init():# 初始化LCD1602bus = smbus2.SMBus(1)bus.write_byte(ADDRESS, 0x38) # 设置显示模式为2行,5 x 8个像素点bus.write_byte(ADDRESS, 0x0c) # 打开显示,关闭光标bus.write_byte(ADDRESS, 0x06) # 设置光标移动方向为从左到右bus.write_byte(ADDRESS, 0x01) # 清屏def lcd_write(ch):# 向LCD1602写入字符bus = smbus2.SMBus(1)bus.write_byte(ADDRESS, LCD_DATA)bus.write_byte(ADDRESS, ord(ch))def lcd_display(text):# 在LCD1602上显示文本bus = smbus2.SMBus(1)bus.write_byte(ADDRESS, LCD_COMMAND)for ch in text:bus.write_byte(ADDRESS, ord(ch))# 使用示例lcd_init() # 初始化LCD1602while True:# 读取温湿度数据humidity, temperature = Adafruit_DHT.read_ret ry(Adafruit_DHT.DHT11, 4)# 在LCD1602上显示温湿度数据lcd_display(f'温度:{temperature}℃湿度:{hu midity}%')time.sleep(2)6. 总结LCD1602是一种常见的液晶显示模块,可以显示中文和英文字符。
1602液晶显示汉字

1602液晶显示汉字此为变态法,操作有待提高程序代码如下:#include ;#include ;#define uchar unsigned char#define uint unsigned intuchar code line1[] = {"welcome!"}; uchar p[]= //自定义字模数组{0x00,0x0f,0x04,0x0f,0x05,0x07,0x00,0x00,0x0f,0x12,0x1f,0x15,0x1f,0x15,0x1f,0x15, //确0x04,0x02,0x0e,0x02,0x02,0x03,0x02,0x00,0x04,0x04,0x04,0x04,0x04,0x0a,0x11,0x00, //认0x00,0x0f,0x09,0x06,0x06,0x06,0x09,0x00,0x1f,0x0a,0x0e,0x0e,0x0a,0x1f,0x02,0x02 //取};sbit E=P2^7;sbit RW=P2^5;sbit RS=P2^6;busying (){bit result;RS = 0;RW = 1;E = 1;_nop_();_nop_();_nop_();_nop_();result = (bit)(P0&0x80);E = 0;return result;}writeorder (uchar cmd) {while (busying());RS = 0;RW = 0;E = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();E = 1;_nop_();_nop_();_nop_();_nop_();E = 0;}writedata (uchar dat) {while (busying()); RS = 1;RW = 0;E = 0;_nop_();_nop_();P0 = dat;_nop_();_nop_();_nop_();E = 1;_nop_();_nop_();_nop_();_nop_();E = 0;}delay(uchar i) {while(i--) {uchar j=250; while(j--) {_nop_();_nop_();_nop_();_nop_();}}}initial (){delay (150);writeorder (0x38); //工作方式:8位、2行、5x7 delay(5);writeorder (0x06); //输入方式:光标右移、屏幕不动delay(5);writeorder (0x0c); //显示状态:显示开、有光标、不闪烁delay(5);writeorder (0x01); //清屏delay(5);}newbyte (void) //设置自定义字符{uchar i,j,k=0;uchar temp=0x40;for(j=0;j<6;j++){for(i=0;i<8;i++){writeorder(temp+i);writedata(p[k]);k++;}temp += 8;}}main (void){uchar i=0;initial ();newbyte ();writeorder (0x85); //设置第一行显示位置writedata (0x00);writedata (0x01);writedata (0x02);writedata (0x03);writedata (0x04);writedata (0x05);writeorder (0xc4); //设置第二行显示位置while(line1[i] != '\0'){ // 显示字符"welcome!"writedata(line1[i]); i++;}while (1);}。
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显示中文汉字doc资料

L CD1 6 0 2 显示中文汉字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里面增加了一些你自定义的字符,汉字。
可能到这里,也许会有些疑问,既然自定义字符、汉字的代码需要我们自己输 入,那么我该怎么编写这些代码,呵呵,不要着急,接下来就要用到下面这个 取字模软件。
4収虫日式*偉改壬慨烁楼咀韋IH*丘出用片4B-S I 询厲 1 .11 g 佃如 ATI相信有的朋友应该都用过这个软件。
LCD1602液晶显示带汉字的万年历程序51单片机

LCD1602液晶显示带汉字的万年历程序(51单片机)#include "reg51.h"#define uint unsigned int#define uchar unsigned char#define port P0uchar table[]="I love you!"; uchar table1[]="Shang Hong Rui!";uchar table2[]="LI ZHEN WEI!" ;uchar table3[]=">; >; >; >; >; >; >; >; "; uchar num;sbit rs=P2^0;sbit rw=P2^1;sbit e=P2^2;/********************************************1ms 为基本单位的延时函数********************************************/ void delay(uint z){uint x,y;for(x=z;x>;0;x--)for(y=110;y>;0;y--);}/******************************************** 读取lcd1602状态********************************************/ read(){uchar temp ;port=0xff;rs=0;rw=1;e=1;temp=port;e=0;return temp;}/******************************************** 检测lcd是否忙碌小卒整天没事********************************************/ void busy(){uchar temp;do{temp=read();}while((temp&0x80)==0x80);}/********************************************向 lcd 里写命令********************************************/ void write_com(uchar com){busy();//delay(2);port=com;//busy();rs=0;rw=0;e=1;e=0;}/******************************************** 向 lcd 里写数据********************************************/ void write_data(uchar dat){busy();//delay(2);port=dat;//busy();rs=1;rw=0;e=1;e=0;}/******************************************** 初始化lcd********************************************/ void init(){write_com(0x06) ;//显示地址递增,即写一个数据后,显示位置右移一位write_com(0x0e) ;//开显示,有光标,光标不闪write_com(0x38) ;//8位数据,双列,5*7字形write_com(0x01) ;//清屏}/********************************************** 主程序实现显示***********************************************/ main(){init();write_com(0x80+0x02);for(num=0;num; 0xff*****0** /5*80x40*****0**0x40 ---->; I*****0**0x40 ---->;*****0**0x40*****0**0x40***000000x1f添加自己的自定义字符***********************************/code uchar ziku[]={0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00, //汉字“日”0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, //汉字“月”0x01,0x02,0x03,0x05,0x09,0x03,0x00,0x00, //汉字“年”左半部0x00,0x00,0x1e,0x08,0x08,0x1e,0x08,0x08 //汉字“年”右半部};/*******************************读取lcd1602状态*******************************/uchar lcd_readcom(){uchar temp;e=0;port=0xff;rs=0;rw=1;e=1;temp=port;e=0;return temp;}/***************************************检测 lcd 是否忙碌小卒整天没事***************************************/ check_busy(){uchar temp;do{temp=lcd_readcom();}while((temp&0x80)==0x80);}/*****************************************向lcd里写命令*****************************************/ void lcd_writecom(uchar dat){check_busy();e=0;port=dat;rs=0;rw=0;e=1;e=0;}/*************************************** 读取lcd对应地址数据*****************************************/ uchar lcd_readdat(){uchar temp;check_busy();e=0;port=0xff;rs=1;rw=1;e=1;temp=port;e=0;return temp;}/**************************************** 向lcd里写数据****************************************/ void lcd_writedat(uchar dat){check_busy();e=0;port=dat;rs=1;rw=0;e=1;e=0;}/****************************************向lcd写字符串*****************************************/ void lcd_gets(char *dat){while(*dat!=0){lcd_writedat(*dat);dat++;}}/*****************************************确定要写的位子即x y 坐标******************************************/void lcd_xy(uchar x,uchar y){switch(y){case 0:lcd_writecom(0x80+x);break;//第一行第X个位置case1:lcd_writecom(0xc0+x);break;//0xc0==0x80+0x50 第二行第X个位置case 2:lcd_writecom(0x94+x);break;//case 3:lcd_writecom(0xd4+x);break;//4*20}}/************************************************ ****单行显示才有5*10 其他5*8 MODE=1 5*8 MODE=0 5*10 ****************************************************/add_custom_word(uchar *dat,uchar len,uchar mode) {uchar n,m;for(n=0;n;0;x--)for(y=110;y>;0;y--)for(a=1;a>;0;a--) ;}/********************************************** 主程序实现显示***********************************************/ main(){lcd_init();//lcd_xy(0,0);//lcd_gets(" I LOVE YOU");//lcd_xy(0,1);//lcd_gets("Shang Hong Rui");lcd_xy(2,0) ;lcd_gets("2011");lcd_xy(6,0) ;lcd_writedat(2);lcd_writedat(3);lcd_xy(8,0) ;lcd_gets("03"); lcd_xy(10,0);lcd_writedat(1);lcd_xy(11,0) ;lcd_gets("06"); lcd_xy(13,0);lcd_writedat(0);lcd_xy(3,1) ;lcd_gets("0"); lcd_xy(4,1) ;lcd_gets("0"); lcd_xy(5,1) ;lcd_gets(":"); lcd_xy(6,1) ;lcd_gets("0"); lcd_xy(7,1) ;lcd_gets("0"); lcd_xy(8,1) ;lcd_gets(":");lcd_gets("0");lcd_xy(10,1) ;lcd_gets("0");while(1){//for(m=0;m<10;m++)lcd_xy(10,1);lcd_writedat(table[miaog]);//秒个位delay(1000);miaog++;if(miaog==10){miaog=0;lcd_xy(9,1);lcd_writedat(table[miaos]); //秒十位miaos++;if(miaos==6){miaos=0;lcd_xy(7,1);lcd_writedat(table[feng]); //分个位 feng++;if(feng==10){feng=0;lcd_xy(6,1);lcd_writedat(table[fens]); //分十位 fens++;if(fens==6){fens=0;lcd_xy(4,1);lcd_writedat(table[shig]); //时个位 shig++;if(shig==10){shig=0;lcd_xy(3,1);lcd_writedat(table[shis]);//时十位shis++;if(shis==6){shis=0;}}}}}}}//lcd_xy(0,0);//lcd_writedat(0);//自定义字符使用,0表示第一个字,1表示第二个字,依此类推//lcd_xy(15,0);//lcd_writedat(3); //自定义字符使用}第二段程序为借用别人的,呵呵。
LCD1602汉字显示技术在万年历中的应用及Proteus仿真

第3卷第3期2010年6月清远职业技术学院学报Journal of Qingyuan Polytechnic Vol.3,No.3June.20101简介1602是一款最常用也是最便宜的液晶显示屏,可以显示两行标准字符,每行显示16个字符,广泛应用于智能仪表、通信、办公自动化设备中。
它的主要作用是显示ASCII 码字符,因此又被称作“字符型显示器件”[1]。
对于内部没有标准汉字库的液晶显示器要显示汉字,第一步要取得想要的中文或者图形的字模数据。
通过字模软件不能直接提取5*8点阵的字模数据,可以通过手动提取的方法从汉字字型取模。
第二步,将取得的汉字字模数据保存到液晶存储器内部。
第三步,将汉字显示到需要位置,用Proteus 仿真或下载调试[2-5]。
2液晶显示器内部存储器1602里的存储器有三种:DDRAM 、CGROM 和CGRAM 。
2.1DDR AM 存储器DDRAM 存储器是和显示屏的内容对应的,1602内部的DDRAM 有80字节,显示屏上第一行的内容对应DDRAM 中80H 到8FH 的内容,第二行的内容对应DDRAM 中C0H 到CFH 的内容,每行16个,共2行,16×2共显示32个字符(图1)。
使用时,将显示的字符写入合适行列即可(详见3.4液晶1602显示子程序)。
图1字符型液晶1602的DDRAM 存储器2.2CGR OM 存储器CGROM 称为字符发生ROM ,其作用是存储各类字符的码,保存了厂家生产时固化在LCM 中的点阵型显示数据。
1602液晶模块内部的字符发生存储器CGROM 已经存储了160个不同的点阵字符图形,有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,这部分代码与ASCII 码基本一致,比如小写的英文字母“a ”的代码是61H ,大写的英文字母“A ”的代码是41H 。
2.3CGR AM 存储器CGRAM 称为字符发生RAM ,是厂家留给用户自己定义点阵型显示数据的,作用是存储用户自定义的字符代码。
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,点数太少所以显示效果不是很好,经实验发现实物效果比仿真要好,下面为两者的效果图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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点阵(可以数一数)。
但是5*8不能提取代码,最少只能8*8,所以我们这里只用后前5列,前3列不用。
新建图像8*8.然后再图像里面点你要显示的字符,汉字,注意是在后5列中点,黑点表示显示,白点不显示,用鼠标左键可以切换,下面是我点得一个坦克~~
点好后,就可以产生代码了,这软件里面可以选择C51或汇编,这里选择C51。
下面的8个代码就是要产生这个字符的数据。
也就是要输入到自定义字符CGRAM里面的。
好的,怎么把获取汉字代码,怎么把代码输入到CGRAM里面都知道了,
下面就是要把我们的自定义汉字、字符显示在LCD1602屏幕上了。
我们知道常用字符是从0x20开始显示,而0x00—0x0f都是没有用的,其实这个正式为我们自定义显示字符准备的。
当你把上面的代码输入到CGRAM中,LCD1602机会把汉字或字符赋予地址,这个地址是从0x00开始,因为最多只能8个字符,所以当在CGRAM里面输入8个字符代码时,这8个字符的代码的数据地址就是0x00开始到0x07。
所以当你要在LCD1602上显示自定义字符时,只需要把这个地址用数据输入就OK。
Write_date(0x00—0x07);
也就是说现在你要显示自定义字符和你显示常用字符一样的做法了,先写地址,然后写数据自定义字符的数据就是0x00—0x07。
也就是你自定义的8个字符。
这里用Proteus 仿真软件演示
附程序
编写时间:2011-11-25
功能:LCD显示自定义字符、汉字
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^4;
sbit lcdrw=P2^5;
sbit lcden=P2^6;
uchar code table[]={
0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,//一
0x00,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00,//二
0x00,0x1F,0x00,0x0E,0x00,0x1F,0x00,0x00,//三
0x02,0x04,0x0F,0x12,0x0F,0x0A,0x1F,0x02,//年
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x09,0x11,//月
0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00,//日
0x00,0x00,0x00,0x0A,0x15,0x0A,0x04,0x00,//心型
0x00,0x04,0x15,0x0E,0x1F,0x0E,0x11,0x00//坦克
};
uchar code table1[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //自定义字符数据地址uchar code table2[]="QQ:598852247";
/******************************
ms延时函数
******************************/
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=122;y>0;y--);
}
/******************************
lcd1602写命令函数
******************************/
void write_cmd(uchar cmd)
{
lcdrs=0;
lcdrw=0; //选择指令寄存器
lcden=1;
P0=cmd; //写了命令
delay(5);
lcden=0; //使能拉低
lcden=1;
}
/******************************
lcd1602写数据函数
******************************/
void write_date(uchar date)
{
lcdrs=1;
lcdrw=0; //选择数据寄存器
lcden=1;
P0=date; //写了命令
delay(5);
lcden=0; //使能拉低
lcden=1;
}
/******************************
lcd1602初始化
******************************/
void init_lcd1602()
{
write_cmd(0x01); //清屏
write_cmd(0x38); //功能设置
write_cmd(0x0c); //显示设置
write_cmd(0x06); //输入方式从左到右
delay(1);
}
/******************************
主函数
******************************/
void main()
{
uchar i;
init_lcd1602();
delay(1);
while(1)
{
write_cmd(0x40); //开始写入你要显示的自定义字符、汉字代码
for(i=0;i<64;i++)
{
write_date(table[i]);
delay(5);
}
write_cmd(0x80); //从第一行第一列开始显示
for(i=0;i<8;i++) //显示自定义字符
{
write_date(table1[i]);
delay(5);
}
write_cmd(0xc0); //显示QQ:598852247
for(i=0;i<12;i++)
{
write_date(table2[i]);
delay(5);
}
}
}。