蜂蜜怎么擦在伤口上:1602液晶显示还可以显示汉字

来源:百度文库 编辑:中财网 时间:2024/04/30 01:35:32

原创]1602液晶显示汉字

昨天从网上看到1602液晶可以显示汉字,感觉挺有趣的就自己来做一下。

     从网上下了一些资料,具体是应用1602的CGRAM,它一共有512bit,并且一个5*7点矩阵字型需8*8bit,所以CGRAM最多可存8个造型(自定义字符)。但是看了好多资料还是看不懂,它是怎么保存的那,又是怎么显示的那?......实在是想不通呀! >_< MY GOD!

      下午上的是自动控制,最后一节课老师讲的听不懂,索性就不听了。拿起一本单片机的书随便看了看,正好后面有1602液晶的CGRAM的介绍,看了几遍好像有那么点意思了,就差调试出来了。

     放了学就冲到实验室里,打开keil ,打开 Proteus,调试......调试......调试,半个小时,哈哈,搞定了,显示汉字了!YEAH!

     原理很简单,自定义库保存到CGROM的00——07单元中。1602液晶上是5*7点阵显示,需要8个2进制数,把汉字(比如‘年’)所对应的2进制数组写入到CGRAM中去,并且保存到CGROM的00单元中,显示出来就可以了。自己做了几个汉字和一个摄氏度符号。大家快来分享一下做1602液晶时的一些技巧吧。

 

我收藏的一个1602显示汉字程序

//*************************************
//lcd头文件
//*************************************
#include
#include
#include
#define lcd_data P0 //定义端口
#define uchar unsigned char
#define uint  unsigned int
sbit RS=P2^1;
sbit RW=P2^2;
sbit E=P2^3;
sbit BF=P0^7;

//***************************************
//延时函数
//***************************************
void delay(uint i)
{
 while(i--);
}
//***************************************
//写控制字
//***************************************
void write_struct(uchar temp) 
{
 E=0;
 delay(100);
 //while(BF==1);
 RW=0;
 RS=0;
 lcd_data=temp;
 delay(3);
 E=1;
 delay(3);
 E=0;
}
//**************************************
//写数据
//**************************************
void write_data(uchar temp)
{
 delay(100);
 //while(BF==1);
 E=0;
 RS=1;
 RW=0;
 lcd_data=temp;
 E=1;
 delay(3);
 E=0;
}

//***************************************
//获得显示地址
//x表示是第几行显示  (0-1)
//y表示某行的第几个字符(0-15)
//***************************************
uchar getchar_adress(uchar x,uchar y)
{  uchar address;
   if(x==0) address=0x80+y;  //第一行
   else address=0xc0+y;   //第二行
   return address;
}

//***************************************
//lcd初始化
//***************************************
void lcd_init()
{
 write_struct(0x38); //设置接口DB宽度(8位)和LCM显示行数(2行)
 write_struct(0x08); //
 write_struct(0x0c); //设置光标为移位模式
 write_struct(0x01); //执行清屏操作
 write_struct(0x06); //设置光标为加1模式

}
//***************************************
//向CGRAM写入数据
//***************************************
void write_cgram(unsigned char adress,unsigned char *p)
{
 char i;
 for(i=0;i<8;i++)
 {  write_struct(adress+i);
     write_data(p); 
 }

}

//***************************************
//显示CGRAM数据
//x表示是第几行显示  (0-1)
//y表示某行的第几个字符(0-15)
//***************************************
void display_cgram(unsigned char x,uchar y,uchar  *CgramData)

    uchar address,cgram_address,p;
 address=getchar_adress(x,y);      //获得CGRAM字符显示位置
   
 
 cgram_address=0x40+(address&0x07)*8; //CGRAM初始地址

 p=address&0x07;

    write_cgram(cgram_address,CgramData);
 write_struct(address);          //设置DDRAM地址

 write_data(p); 

}
//显示字符
//***************************************
void display(char temp0,char *p)
{
 write_struct(temp0);
 delay(3);
 write_data(*p);
}
//****************************************
//显示字符串
//****************************************
void display_str(uchar x,uchar y,char *p)
{
 char i,temp0;
 temp0=getchar_adress(x,y);
 write_struct(temp0);
 for(i=0;i<16;i++)
 {
  if(*p=='\0')
   break;
     write_data(*p);
   
  p++;
 }
}
//****************************************
//清屏
//****************************************
void lcd_clr()
{
 write_struct(0x01); 
}
//*****************************************************end