LCD1602自定义符号的使用
1、在对LCD1602有了基本的了解与使用后,我们可以接着了解LCD1602的自定义字符的使用。
要显示自定义符号,就得使用CGRAM存储器,LCD1602最多只可以显示8个自定义字符。
2、CGRAM可以存储8个自定义字符,他们在存储器中的首地址分别为:0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78.
把字模数据写入CGRAM,就需要从首地址中选一个,并将字模数据送入,切记要把CGRAM中的自定义字符再送入DDRAM, 这样自定义字符才能够正常显示。
3、以下CGRAM存储器中首地址所对应的索引 0x00:第一个(0x40) 0x01:第二个(0x48) 0x02:第三个(0x50) 0x03:第四个(0x58) 0x04:第五个(0x60) 0x05:第六个(0x68) 0x06:第七个(0x70) 0x07:第八个(0x78) ,把CGRAM中的自定义字符再送入DDRAM ,只需将CGRAM存储器中首地址相对应的索引写入DDRAM即可。(具体步骤可以看代码部分)
字模部分
1、在对LCD1602的使用中一般设置其像素为5*7,但一个自定义字符占8个字节,所以在写入字符时;将最后一位写为0x00即可;
例如在程序中uchar code table[ ]={0x07,0x08,0x1c,0x08,0x1c,0x08,0x07,0x00};
uchar code table1[ ]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};
上面table中的是欧元货币符号的字模数据(人名币和美元的货币符号均可直接显示),table1中是摄氏度符号的字模数据。
2、下图为我在excel画的€
第一行的00111对应十六进制的0x07,
01000~0x08;
11100~0x1c;
01000~0x08;
11100~0x1c;
01000~0x08;
00111~0x07 ;
00000~0x00。
按顺序向下排便得到了一个自定义字符的字模数据,可以用取字模的软件直接得到字模数据,同样也可以向我一样用excel表格慢慢搞…
自定义符号显示基本步骤:
①、将自定义字符写入CGRAM。
②、将CGRAM中自定义的字符送入DDRAM。
自定义符号的显示和自带字符的基本操作是完全一样的,写指令,写数据,将字符在相应位置显示的操作都与自带字符的操作一摸一样。
代码部分
通过写命令,可以对LCD进行特定的操作和送出显示地址
void lcdwcom(uchar com) //1602写命令函数
{
lcdrs=0; //选择指令寄存器
//rw=0; //选择写;我的开发板已接地
P0=com; //把命令字送入
delay(5); //延时一小会儿,让1602准备接收数据
lcden=1; //使能线电平变化,命令送入1602的8位数据口
lcden=0;
}
通过写数据,将我们要显示的字符送入LCD
void lcdwdat(uchar dat) //写数据
{
lcdrs=1; //选择写数据
//rw=0;
P0=dat; //把要显示的数据送入
delay(5); //延时一小会儿,让1602准备接收数据
lcden=1; //使能变化;数据送入
lcden=0;
}
对lcd初始化,设置其显示模式
void lcdinit() //1602初始化
{
dula=0;
wela=0;//将数码管关闭
lcdwcom(0x38); //8位数据,双列,5*7字形
lcdwcom(0x0c); //开启显示屏,关光标,光标不闪烁
lcdwcom(0x06); //显示地址递增,写一个数据后,显示位置右移一位
lcdwcom(0x01); //清屏
}
定义了4个变量,在主函数中调用即可显示自定义字符
void display1(uchar cgr,uchar table_num,uchar pos_,uchar count)//自定义符号显示
{
lcdinit();//液晶初始化
lcdwcom(cgr);//设定CGRAM地址,把自定义字符存储进去
for(m=table_num;m<table_num+8;m++) //将table[]中的数据依次送入1602显示
{
lcd_wdat(table[m]);//写入数据
delay(10);
}
lcdwcom(pos_); //显示地址
lcdwdat(count); //向DDRAM写入
}
类似于开机动画,不过只能显示一串字符…
void display()//开屏左移
{
lcdinit();//液晶初始化
lcdwcom(0x80);//选择显示地址起始位
for(b=0;b<11;b++)
{
lcdwdat(table1[b]);//将hello world 送入1602
delay(200); //可以通过延时控制hello word 的显示速度
}
for(b=0;b<10;b++)
{
lcdwcom(0x18);//全屏左移
delay(300);//可以通过延时控制hello word 左移的速度
}
}
主函数部分
void main() //主函数
{
display();
delay(10);
//display1(0x40,0,0x86,0x00);//显示摄氏度
display1(0x48,8,0x86,0x01);//显示欧元
lcdwcom(0x80);//选择显示地址
for(num=0;num<6;num++)
{
lcdwdat(table2[num]);
delay(20);
}
while(1);//动态停机
}
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P3^4;//使能位
sbit lcdrs=P3^5;//数据&命令选择端;
sbit dula=P2^6;
sbit wela=P2^7; //数码管的两个锁存器
uchar code table[]={
0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00,
0x07,0x08,0x1c,0x08,0x1c,0x08,0x07,0x00};
//要显示的内容放入数组table
uchar code table1[]="Hello world";
uchar code table2[]="Types:";
uchar b,m,num;
显示的结果:Hello world显示完毕后左移至消失后显示types:€
本人新手┗┃・ ■ ・┃┛写的不好,请见谅!