LCD1602自定义显示字符

合集下载

LCD1602 自定义字符

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汉字显示讲解

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的自定义字库显示汉字
DB 0FH,09H,0FH,09H,0FH,09H,11H,00H ;月,代码为02H
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的数据写入及CGRAM的使用1.当使能端E由1变为0时,执行写指令,数据被写入。

例如,欲写入数据i到DDRAM:void WDR(uchar i){CheckBusy();//检忙LCD_RS=1;LCD_RW=0;LCD_EN=0;Delay();LCD_DATA=i;//数据输出到定义端口Delay();LCD_EN=1;Delay();LCD_EN=0;//这一步才开始写入到LCDDelay();}2.CGRAM1602能存储8个自定义字符,这8个自定义字符存储空间的首地址分别是:0X40,0X48,0X50,0X58,0X60,0X68,0X70,0X78。

以0x40来说,它的存储空间如图所示:如果使用5*7字符的话,那么最左3位和最后一行的数据实际上是没用的,通常置0。

如果要自定义一个℃符号,那么先填框,如图(红1白0):这样我们就得到每个地址需要写入的数据:地址:数据0x40:0x160x41:0x090x42:0x08其他类推。

将这8个数据写入到对应地址即可。

使用时,先确定显示的位置,例如0X80,然后向DDRAM写入自定义字符的使用代码。

0X40-0X78对应为0X00-0X07。

本例中,先写入指令寄存器0X80确定显示位置为第一行第一个,然后写入数据寄存器0X00,这样就会在第一行第一个位置显示出℃符号。

以下是源程序如果网页格式导致部分字符丢失请下载c程序源文件:/f/avr1602c.rar#include <iom16.h>#include <intrinsics.h>#define u8 uchar unsigned char#define u16 uchar unsigned int#define uchar unsigned char#define uint unsigned intuchar zi[]={0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00}; //自定义字符摄氏度#include"1602.h"#include"18b20.h"void port_init(){PORTA=0xff;DDRA=0xff;PORTB=0xff;DDRB=0xff;PORTC=0xff;DDRC=0xff;PORTD=0xff;DDRD=0x00;}void setzi() //把设定字存入CGRAM{uchar i;writecmd(0x40); //设置第一个字的起始地址for(i=0;i<8;i++){writedata(zi[i]);}}void show_temp(uint k){displayonechar(1,1,(k/100)+48);displayonechar(2,1,(k%100/10)+48);displayonechar(3,1,'.');displayonechar(4,1,(k%10)+48);}void main(){uint TT; //显示的温度值port_init();delay(1000);init1602();displaychar(0,0,"Set zi Test");setzi();displayonechar(5,1,0x00); //0x00表示 0x40地址的值 while(1){TT=read_temper();show_temp(TT);}}//---------------1602.h----------------#define RS PORTB_Bit0#define RW PORTB_Bit1#define EN PORTB_Bit2#define DATA PORTA#define busy 0x80void delay(uint k){uint i,j;for(i=0;i<k;i++)for(j=0;j<1140;j++);}void wait(){uchar val;DATA=0xff;RS=0;RW=1;__no_operation();__no_operation();EN=1;__no_operation();__no_operation();DDRA=0x00;val=PINA;while(val&busy){val=PINA;}EN=0;DDRA=0xff;}void writecmd(uchar cmd)wait();RS=0;RW=0;__no_operation();DATA=cmd;__no_operation();EN=1;__no_operation();__no_operation();EN=0;}void writedata(uchar data){wait();RS=1;RW=0;__no_operation();DATA=data;__no_operation();EN=1;__no_operation();__no_operation();EN=0;}void displayonechar(uchar x,uchar y,uchar dda) {y&=0x01;x&=0x0f;if(y)x|=0x40;x|=0x80;writecmd(x);writedata(dda);}void displaychar(uchar x,uchar y,uchar *p) {y&=0x01;x&=0x0f;while(*p!='\0'){if(x<=0x0f){displayonechar(x,y,*p);p++;x++;}}}void init1602(){delay(15);writecmd(0x38);delay(5);writecmd(0x38);delay(5);writecmd(0x38);writecmd(0x80);writecmd(0x01);writecmd(0x06);writecmd(0x0c);}//--------------18B20.h------------uchar teml,temh;uchar sign;uchar Flag_1820Error;uint tempp; //温度值/*********************************/void delay_15us(void) //15us左右{uchar x=27;while(x){x--;}}/********************************/void delay_60us(void) //60us左右{uchar x=117;while(x){x--;}}void init_1820(void){uchar i;uint j=0;PORTC|=(1<<7); //"1"PORTC&=~(1<<7); //"0"for(i=0;i<8;i++)delay_60us();//480us以上 PORTC|=(1<<7); //"1"DDRC&=~(1<<7); //"PINC7 is INPUT"delay_15us(); //15~60usdelay_15us();Flag_1820Error=0;while(PINC&(1<<7)){ delay_60us();j++;if(j>=18000){Flag_1820Error=1;break;}}DDRC|=(1<<7); //PORTC7 is OUTPUTPORTC|=(1<<7); //"1"for(i=0;i<4;i++)delay_60us(); //240us}/********************************/void delay_5us(void) //5us左右{uchar x=7;while(x){x--;}}/********************************/void write_1820(uchar x){uchar m;for(m=0;m<8;m++){if(x&(1<<m)) //写数据,从低位开始{PORTC&=~(1<<7);delay_5us(); //"0",5us PORTC|=(1<<7); //write"1"delay_15us(); //15~45usdelay_15us();delay_15us();}else{PORTC&=~(1<<7);delay_15us();//"0",15us delay_15us(); //write"0"delay_15us(); //15~45usdelay_15us();PORTC|=(1<<7); //"1"}}PORTC|=(1<<7); //"1"}/*******************************/uchar read_1820(void){uchar temp,k,n;temp=0;for(n=0;n<8;n++){PORTC&=~(1<<7); //"0"delay_5us();PORTC|=(1<<7); //"1"delay_5us();DDRC&=~(1<<7); //"PINC7 is INPUT"k=(PINC&(1<<7)); //读数据,从低位开始if(k)temp|=(1<<n); //read"1"elsetemp&=~(1<<n); //read"0"delay_15us(); //45usdelay_15us();delay_15us();DDRC|=(1<<7); //PORTC7 is OUTPUT }return (temp);}/*************************************/uint read_temper(void){uchar TX; //小数位uchar TZ; //整数位init_1820(); //复位18b20write_1820(0xcc); // 发出转换命令write_1820(0x44);;;;;;;init_1820();write_1820(0xcc); //发出读命令write_1820(0xbe);teml=read_1820(); //读数据byte1temh=read_1820(); //byte2TX=teml&0x0f;temh=temh<<4;temh|=(teml&0xf0)>>4;TZ=temh;tempp=TZ*10+TX;return tempp;}。

LCD1602显示中文汉字

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 里面增加了一些你自定义的字符,汉字。

可能到这里,也许会有些疑问,既然自定义字符、汉字的代码需要我们自己输入,那幺我该怎幺编写这些代码,呵呵,不要着急,接下来就要用到下面这个取字模软件。

相信有的朋友应该都用过这个软件。

1602显示汉字和自定义字符库

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自定义字符
write_com(0x06);//移动光标指针设置,写一个字符后地址指针加1,且光标加1
write_com(0x01);//清屏
write_com(0x80);//设置显示位置指针
}
void maΒιβλιοθήκη n(){uchar num;
init();
write_com(0x40); //(01 000 000=0x40)定义第一个自定义字符
uchar table1[]={0x0F,0x09,0x0F,0x09,0x0F,0x09,0x0B,0x11};//月
uchar table2[]={0x0F,0x09,0x09,0x0F,0x09,0x09,0x09,0x0F};//日
void delay(uchar xms)//延时函数
{
uint i,j;
规定显示在?第一行第一?个位置write?data?write?data?0x00显示第一个?自定义字符?write?data?0x01显示第二个?自定义字符?write?data?0x02显示第三个?自定义字符?while?1
LCD1602自定义字符示例
设定CGRAM地址指令
功能:设定下一个要存入数据的CGRAM的地址。
for(num=0;num<8;num++)
{
write_data(table[num]);
}
write_com(0x48); //(01 001 000=0x48)定义第二个自定义字符
for(num=0;num<8;num++)
{
write_data(table1[num]);
}
write_com(0x50);//(01 010 000=0x50)定义第三个自定义字符

LCD1602自定义显示字符及汉字

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列来显示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LCD1602自定义显示字符
从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)。

从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。

例如第一个自定义字符的字模地址为01000000-01000111八个地址。

我们向这8个字节写入字模数据,让它能显示出“℃”
地址:01000000数据:00010000图示:○○○■○○○○
0100000100000110○○○○○■■○
0100001000001001○○○○■○○■
0100001100001000○○○○■○○○
0100010000001000○○○○■○○○
0100010100001001○○○○■○○■
0100011000000110○○○○○■■○
0100011100000000○○○○○○○○
字定义字符地址
0x40————0x00
0x48————0x01
0x50————0x02
0x58————0x03
0x60————0x04
0x68————0x05
0x70————0x06
0x78————0x07
程序操作:
1.定义字符数组
uchar code Word1[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A};//自定义字符数组
2.写数据到CGRAM中
uchar j;
WriteCommandLCD(0x40);
for(j=0;j<8;j++)
{
WriteDataLCD(Word1[j]);
}
3.读取数据并显示
WriteCommandLCD(0xC8);//显示在第一行
WriteDataLCD(0x00);//地址
取模软件操作左边三列为无效
软件设置。

相关文档
最新文档