LCD1602自定义符号的使用

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:€
本人新手┗┃・ ■ ・┃┛写的不好,请见谅!

猜你喜欢

转载自blog.csdn.net/qq_52487856/article/details/116027432