LCD1602液晶显示汉字

发布者:程序界的行者最新更新时间:2017-02-06 来源: eefocus关键字:LCD1602液晶  显示汉字 手机看文章 扫描二维码
随时随地手机看文章

使用LCD1602 显示字符会比使用七段数码管方便 可显示内容也多的多  1602内部的字符发生器 CGROM中已经存储了160多个字符 ,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是“01000001B,显示时把41H的点阵字符显示出来,就可以看到字符“A”。

常用的方法是 写完数据显示地址后 直接写入字符串 “A”,其实直接写入0x41也可以显示“A”;

 

1602中有这样几个区:

 

CGRAM 区为用户自定义字符区  

DDRAM 为字符显示地址(位置)数据存贮器

CGROM为 液晶模块内部字符发生存储器

 

使用1602显示汉字 就需要是用到 CGRAM,需要将取模后的点阵字符写入CGRAM ,以备后面读出显示。

 

1602 使用的显示点阵大小是 5*8 ,可以使用取模软件获得文字的点阵显示字符,但是点阵大小最小为8*8, 要取得5*8的字模 只需要空出前三列即可。

字模提取.png

 


将生成的点阵数组保存到CGRAM存储器中,生成自定义字符。1602内部CGRAM用于自定义的字符点阵的存储,总共64字节。由上一步点阵提取可知,每一个字符由8个字节数据组成。所以64字节CGRAM存储器,能够存储8组自定义字符的点阵数组。

按照CGRAM地址划分为 0-7为第一组,8-15为第二组,依次类推56-63为第8组数据。

把自定义字符的数组按8个字节一组存储到CGRAM中。

 

自定义字符存储到CGRAM的任意一组以后,每一个组(8个字节)也有一个显示编码。按顺序依次为00H-07H 。显示时,只要调用每一组的编码,即可以显示相应的字符。

注:内部常用字符显示时,显示编码是从0x20开始的。0x00-0x0f是专门留给自定义字符显示的。0x00-0x07和0x08-0x0f内容是一样的。例如:调用0x01 位置和0x09位置,显示的内容是一样的。

 

1602显示"你好":

 

IMG_20120425_154514.jpg

 

51单片机的默认是将变量定义在直接寻址data区,这个区域是片内RAM的低128字节,所以存储的空间有限,所以编程时可以把一些变量编译在 间接寻址的idata区(52是80H~0FFH区域)或者 64 程序存储器 code 区中。

 

LCD1602显示程序代码:

	#include 
	#include "lcd1602.h"

	#define uchar unsigned  char     // 宏定义uchar 为无符号字符
	#define uint  unsigned  int  
	
	uchar idata words[4][8] = {
						{ 0x01,0x02,0x06,0x02,0x02,0x02,0x02,0x00},	   //你字左边
						{ 0x08,0x0F,0x15,0x04,0x15,0x15,0x04,0x0C},	   //你字右边
						{ 0x00,0x04,0x1F,0x0A,0x04,0x0A,0x00,0x00},	   //好字左边
						{ 0x1E,0x02,0x04,0x1F,0x04,0x04,0x0C,0x00}	   //好字右边
					};

	void main()
	{		
		uchar i;		

		LCD_Init();
		
		for(i=0;i<4;i++)
		{
			LCD_CGRAM_WriteByte(words[i],i);
			LCD_WriteByte(0x80+i,0);
			LCD_WriteByte(i,1);
		}
			
		LCD_WriteString("Wrold !!",2);


		/******这样也可以显示“A”

		LCD_WriteByte(0xCA,0);			  
		LCD_WriteByte(0x41,1);

		***********/
		while(1);
	
	}

lcd1602.h :

	#define uchar unsigned  char     // 宏定义uchar 为无符号字符
	#define uint  unsigned  int  

	#define DataPin	P0 

	sbit  LCD_RS = P2^4;	//	LCD	数据/ 命令选择 ,高电平时选择数据寄存器
	sbit  LCD_RW = P2^5;	//  LCD 读 / 写选择	   ,高电平时读操作
	sbit  LCD_E  = P2^6;	//  LCD 使能
	sbit  IR_DQ  = P2^3;	//	红外接收头数据线

	void  LCD_BusyCheck(void);
	void  LCD_WriteByte(uchar var,bit RS);
	void  LCD_Init(void);
	void  LCD_WriteString(uchar *str,uchar line);
	void  LCD_CGRAM_WriteByte(uchar *p,uchar num);
	void  LCD_Delay(uint n);

	void LCD_Delay(uint n)
	{
		while(--n);				// 8us一次
	}
	
	void LCD_BusyCheck(void)
	{
		uchar isBusy;

		LCD_RS = 0;
		LCD_RW = 1;

		LCD_E  = 1;
		LCD_Delay(10);
		isBusy = DataPin & 0x80;     
		LCD_E  = 0;

		if(isBusy == 0x80)
		{
			LCD_BusyCheck();
		}
	}

	void LCD_WriteByte(uchar var,bit RS )	   //参数 RS为 LCD数据/ 命令选择 ,高电平时选择数据寄存器
	{
		LCD_BusyCheck();
		 
		LCD_RS = RS;
		LCD_RW = 0;
		DataPin = var;

		LCD_E = 0;
		LCD_Delay(70);					  //必须延时500us左右		
		LCD_E  = 1;
		LCD_Delay(5);
		LCD_E = 0;

	}

	void LCD_WriteString(uchar *str,uchar line)
	{
		uchar i = 0,addr;

		if(line == 1) { addr = 0x80;}
		if(line == 2) { addr = 0xC0;}

		while(1)		
		{			
			LCD_WriteByte(addr+i,0);	   //写入地址
			LCD_WriteByte(str[i],1);
			i++;
			if(i==16 || str[i] == '\0'){ break;}
		}			
	}

	void LCD_CGRAM_WriteByte(uchar *p,uchar num)		   //将自定义字符写入CGRAM中,最多64字节,uchar num为自定义字符存放位置 0-7
	{
		uchar i,place;

		place = 0x40 + 8*(num&0x07);					// num&0x07 保证num取值范围为 0-7

		for(i=0;i<8;i++)
		{
			LCD_WriteByte(place+i,0);		
			LCD_WriteByte(p[i],1);
		}
	}


	void LCD_Init(void)
	{
		LCD_Delay(1875);			//延时15ms

		LCD_WriteByte(0x38,0);

		LCD_Delay(625);				//延时5ms


		LCD_WriteByte(0x38,0);  //配置LCD为4位数据总线,双行显示,5*7点阵字符

		LCD_WriteByte(0x08,0);  //配置LCD关闭显示,无光标,无闪烁

		LCD_WriteByte(0x01,0);  //LCD清屏
  
		LCD_WriteByte(0x06,0);  //LCD光标右移

		LCD_WriteByte(0x0C,0);  //打开LCD显示

	}


关键字:LCD1602液晶  显示汉字 引用地址:LCD1602液晶显示汉字

上一篇:单片机4*4矩阵键盘
下一篇:单片机红外接收软件解码

推荐阅读最新更新时间:2024-03-16 15:32

VxWorks汉字显示解决方案
摘要:论述VxWorks上WindML对多字节码的显示支持,着重讨论其存储结构和意义,并给出汉字显示的实现方法。 关键词:VxWorks操作系统 WindML组件 汉字点阵 国标编码 1 VxWorks操作系统图形显示方案 VxWorks作为嵌入式实时操作系统,在国内应用已非常广泛,但VxWorks原厂商没有直接提供完备的汉字显示解决方案。本文这个热点论题,通过对VxWorks显示组件的分析,具体给出一种汉字显示的方案。 VxWorks的汉字显示首先需要一种图形解决方案,只有工作在图形模式下才可能显示汉字。VxWorks有三种显示方案可供选择。 (1)WindML+Zinc WindML是Wind River Mutl
[嵌入式]
基于单片机的LED汉字显示屏设计与制作
   1 引 言   在大型商场、车站、码头、地铁站以及各类办事窗口等越来越多的场所需要用LED点阵显示图形和汉字。LED行业已成为一个快速发展的新兴产业,市场空间巨大,前景广阔。随着信息产业的高速发展,LED显示作为信息传播的一种重要手段,已广泛应用于室内外需要进行服务内容和服务宗旨宣传的公众场所,例如户内外公共场所广告宣传、机场车站旅客引导信息、公交车辆报站系统、证券与银行信息显示、餐馆报价信息豆示、高速公路可变情报板、体育场馆比赛转播、楼宇灯饰、交通信号灯、景观照明等。显然,LED显示已成为城市亮化、现代化和信息化社会的一个重要标志。   本文基于单片机(AT89C51)讲述了1616 LED汉字点阵显示的基本原理、硬件
[安防电子]
51单片机驱动 LCD1602液晶显示系统
废话不多说先上实物图 LCD1602+51单片机最小系统应用仿真及制作 好了,接下来正式进入制作环节: 第一步:仿真 绘制好原理图,仿真时单片机最小系统只放一个单片机就可以了,但实际电路中需要加上电源模块、复位模块。如下图: 原理图文件请在附件中找。 原理图绘制好后,编写代码并生成hex文件。参考代码如下: /*功能/ /使用外部中断INTO改变LED状态,并且用1602显示出其状态/ #include reg51.h #include intrins.h #define uint unsigned int #define uchar unsigned char uchar code table = H
[单片机]
51单片机驱动 <font color='red'>LCD1602</font><font color='red'>液晶</font><font color='red'>显示</font>系统
第80节:调液晶屏内部字库显示汉字或字符的坐标体系和本质
开场白: 前面章节讲的内容全部都是用自构字库的,相当于使用液晶屏的图像模式。其实这个款12864液晶屏的驱动芯片是st7920,它内部是自带16x16字库的,可以显示16x16的汉字或者8x16的字符。这一节开始就跟大家讲讲这方面的内容。要教会大家四个知识点: 第一个:内部字库的真实坐标体系的本质。当我们用内部字库的时候,它的坐标体系跟前面讲的自造字库坐标不一样,不再是256x32的液晶屏。它还原成为128x64的液晶屏,横坐标x轴坐标没办法精确到每个点,只能以16个点(2个字节)为一个单位,因此128个点的x轴坐标范围是0至8。而y轴的坐标也是以16个点(2个字节)为一个单位,因此64个点的x轴坐标范围是0至3。把12864液晶
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved