1、具体电路图:接口说明:运行:用户自定义字符的应用:我们从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。它的字符码是0000000000000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定02位为地址,3位无效,47全为零。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000X111,X为无效位,最后三位为000111共8个。如果我们要想显示这8个用户自定义的字符,操作方法和显示CGROM的一样,先设置DDRAM位置,再向DDRAM写入字符码,例如“A”就是41H。现在我们要显示C
2、GRAM的第一个自定义字符,就向DDRAM写入00000000B(00H),如果要显示第8个就写入00000111(08H),简单吧!好!现在我们来看怎么向这八个自定义字符写入字模。有个设置CGRAM地址的指令大家还记得吗?赶快再找出来看看。从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。例如第一个自定义字符的字模地址为0100000001000111八个地址。我们向这8个字节写入字模数据,让它能显示出“”地址:01000000数据:00010000 图示:0100000100000110
3、0100001000001001 0100001100001000 0100010000001000010001010000100101000110000001100100011100000000 下面我们写一段程序让这8个自定义字符显示出一个心的图案:# include 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
4、,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)/*定义
5、接口*/ LCDIO P2sbit LCD1602_RS=P30;sbit LCD1602_RW=P31;sbit LCD1602_EN=P32;/*定义函数*/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
6、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 screen LCD_write_command(0x38);/set 8 bit data transmission mode LCD_write_command(0x0c);/open d
7、isplay (enable lcd display)LCD_write_command(0x80);/set lcd first display address /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;LCD16
8、02_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;else address =0xc0+ x;LCD_write_command(address);/*显示一个字符*/void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat)LCD_
9、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;i0;i-) for (j=0;j10;j+);/*/*主函数*/void main(void)unsigned
10、char i,j,k,tmp;LCD_init();delay_nms(100);tmp=0x40;/设置CGRAM地址的格式字k=0;for(j=0;8;j+) for(i=0;ii+) LCD_write_command(tmp+i); / 设置自定义字符的 CGRAM 地址 delay_nms(2); LCD_write_dat(table1k); / 向CGRAM写入自定义字符表的数据 k+; tmp=tmp+8; LCD_dsp_string(1,1,LCD TEST );/在第一行第一列显示“LCD TEST” LCD_dsp_string(1,2,SUCCESSFUL/在第二行第一列显示“SUCCESSFUL” for (i=0;4; LCD_dsp_char( 12+i,1,i);/在第一行第12列位置显示心图案的上半部 delay_nms(1); for (i=4; LCD_dsp_char( 12+i-4,2,i);在第二行第12列位置显示心图案的下半部 while (1);/*/实际效果如图:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1