51单片机学习之关于1602液晶的使用

                                  1602液晶的接口说明
分享51单片机学习中的一些收获:
1602液晶是一种字符液晶,其仅仅可以显示英文和日文等字符,不能用来显示汉字。1602液晶是16x2的字符液晶,即每行可以显示16个字符,可以显示两行,第一行对应的首地址是0x80,第二行对应的首地址是0x80+0x40;
为了以后调用液晶函数方便,才写了部分关于1602液晶的程序,如有错误,恳请斧正;
程序中可以直接调用的函数都在1602.h里面有声明,并给出注释;如需要修改1602接口,请直接在1602.h里面修改,以适应硬件的实际连接。
                                                                                            测试效果
下为程序代码,有注释:
为了以后调用液晶函数方便,才写了部分关于1602液晶的程序,如有错误,恳请斧正;
程序中可以直接调用的函数都在1602.h里面有声明,并给出注释;如需要修改1602接口,请直接在1602.h里面修改,以适应硬件的实际连接。

/*========下面是1602.c的内容========*/

#include "1602.h"
unsigned char code number_1602[10]={'0','1','2','3','4','5','6','7','8','9'};		//数字常量
unsigned char code week_1602[7][4]={"Mon","Tus","Wed","Tur","Fri","Sta","Sun"};		//星期常量

/*		5us延时程序	(12MHZ晶振)	*/
void delay_5us_1602(void)
{
	_nop_();
}

/*		N毫秒延时程序	(12MHZ晶振)	*/
void delay_ms_1602(unsigned char n)
{
	unsigned char i;
	while(n--)
	{
		for(i=0;i<120;i++);
	}
}

/*****************************************************
功能函数:判断1602液晶的忙碌状态
***************************************************/
void BusyTest_1602(void)
{
	RS_1602=0;			//1——数据、0——指令
  	RW_1602=1;			//1——读、0——写,此处为读指令
	Data_1602=0x00;			//初始化端口(亲测,加上这句初始化端口语句在仿真和硬件都能用,不加的话仿真不能用)
  	E_1602=1;						//E=1时,才允许读
	delay_5us_1602();		//延时给硬件反应时间
		
  	while(BF_1602==1);		//直到忙碌标志位BF=0(即空闲)时才结束
	E_1602=0; 
}

/*=================================================================================
						1602液晶常用指令集
1、清显示/清屏——0x01
2、地址计数器归位——0x02
3、输入模式:全部右移,游标不动——0x07
						 AC右移1位,游标移动1位——0x06
						 全部左移,游标不动——0x05
						 AC左移1位,游标移动1位——0x04
4、显示设置:游标显示,闪烁字符——0x0f
						 游标显示,不闪烁字符——0x0e
						 游标不显示,闪烁字符——0x0d
						 游标不显示,不闪烁字符——0x0c
						 整屏不显示,DDRAM中有内容——0x08
5、功能设置:两行,5x7显示——0x38
						 单行,5x7显示——0x30
						 两行,5x10显示——0x3c
						 单行,5x10显示——0x34
6、游标移动:单游标左移——0x10
						 单游标右移——0x14
						 游标显示左移——0x18
						 游标显示右移——0x1c
==================================================================================*/
/*****************************************************
功能函数:将模式设置指令或显示地址写入液晶模块
入口参数:	dictate
***************************************************/
void WriteInstruction_1602(unsigned char dictate)
{   
   	BusyTest_1602(); 	//忙检测,如果忙就等待
	RS_1602=0;		//1——数据、0——指令
	RW_1602=0;   		//1——读、0——写,此处为写指令
	
	Data_1602=dictate;	//将数据送入P2口,即写入指令或地址
	
	E_1602=1;		//E置高电平,用来产生下降沿信号
	delay_5us_1602();
	E_1602=0;		//E产生1到0的跳变,液晶模块开始执行写指令
}

/*****************************************************
功能函数:将数据(字符的标准ASCII码)写入液晶模块
入口参数:	Data
***************************************************/
void WriteData_1602(unsigned char Data)
{
	BusyTest_1602(); 	//如果忙就等待  
	RS_1602=1;		//1——数据、0——指令
	RW_1602=0;		//1——读、0——写,此处为写数据	
	Data_1602=Data;		//将数据送入P2口,即写入指令或地址
		 
	E_1602=1;		//E置高电平,发生0到1跳变,产生高脉冲
	delay_5us_1602();
	E_1602=0;		//E产生1到0的跳变,液晶模块开始执行指令
}

/*****************************************************
功能函数:对LCD的显示模式进行初始化设置
***************************************************/
void lcd1602_Initiate(void)
{
	delay_ms_1602(10);            	 //延时15ms,首次写指令时应给LCD一段较长的反应时间
		
	WriteInstruction_1602(0x38); 	 //显示模式设置:16*2显示,5*7点阵,8位数据接口
	delay_ms_1602(5);
	WriteInstruction_1602(0x38);	//显示模式设置:16*2显示,5*7点阵,8位数据接口
	delay_ms_1602(5);
	
	WriteInstruction_1602(0x0c); 	//显示模式设置:显示开,有光标,光标闪烁(0x0e显示光标,不闪烁;0x0f显示光标,闪烁;0x0c不显示光标,不闪烁;0x0d不显示光标,闪烁)
	delay_ms_1602(5);
	WriteInstruction_1602(0x06);  	//显示模式设置:光标右移,字符不移(0x06地址光标右移;0x04地址光标左移;0x05整屏右移;0x07整屏左移)
	delay_ms_1602(5);
	WriteInstruction_1602(0x01);  	//清屏指令,将以前的显示内容清除
	delay_ms_1602(5);
}

/*****************************************************
功能函数:对1602液晶写入数字0~9
入口参数:行x , 列y , 数字numx
***************************************************/
void write_number(unsigned char x, unsigned char y, unsigned char numx)
{
	 if(x==1)
	 {
		 WriteInstruction_1602(0x80+y-1);	//0x80是1602液晶第一行首地址(列地址)
		 WriteData_1602(number_1602[numx]);
	 }
	 
	 if(x==2)
	 {
		 WriteInstruction_1602(0x80+0x40+y-1);	//0x80+0x40是1602液晶第二行首地址(列地址)
		 WriteData_1602(number_1602[numx]);
	 }
}
 
/*****************************************************
功能函数:对1602液晶写入任意字符
入口参数:行x , 列y , 数字charx
***************************************************/
void write_char(unsigned char x, unsigned char y, unsigned char charx)
{
	 if(x==1)
	 {
		 WriteInstruction_1602(0x80+y-1);		//0x80是1602液晶第一行首地址(列地址)
		 WriteData_1602(charx);
	 }
	 
	 if(x==2)
	 {
		 WriteInstruction_1602(0x80+0x40+y-1);		//0x80+0x40是1602液晶第二行首地址(列地址)
		 WriteData_1602(charx);
	 }
}
 
/*****************************************************
功能函数:对1602液晶写入字符串
入口参数:行x , 列y , 字符串头地址*p
***************************************************/
void write_string(unsigned char x, unsigned char y, unsigned char *p)
{
	 if(x==1)
	 {
 		 WriteInstruction_1602(0x80+y-1);		//0x80是1602液晶第一行首地址(列地址)
		 while(*p!='\0')
			 WriteData_1602(*p++);		 
	 }
	 
	 if(x==2)
	 {
 		 WriteInstruction_1602(0x80+0x40+y-1);		//0x80+0x40是1602液晶第二行首地址(列地址)
		 while(*p!='\0')
			 WriteData_1602(*p++);		 
	 }
}
 
/*****************************************************
功能函数:对1602液晶写入星期(周一到周日)
入口参数:行x , 列y , 星期weekday
***************************************************/
void write_week(unsigned char x, unsigned char y, unsigned char weekday)
{
	 write_string(x,y,week_1602[weekday-1]);
}


/*========下面是1602.h的内容========*/

#ifndef __1602_H__
#define __1602_H__
#include <reg52.h>
#include <intrins.h>

#define Data_1602 P2  			//1602液晶指令、数据并行输出口
sbit BF_1602=P2^7;    			//1602液晶忙碌标志位
sbit RS_1602=P0^7;    			//寄存器选择位,1——数据、0——指令
sbit RW_1602=P0^6;    			//读写选择位,1——读、0——写
sbit E_1602=P0^5;     			//使能信号位,1——执行读操作,1->0执行写操作

void delay_5us_1602(void);
void delay_ms_1602(unsigned char n);

void BusyTest_1602(void);
void WriteInstruction_1602(unsigned char dictate);
void WriteData_1602(unsigned char Data);

void lcd1602_Initiate(void);
void write_number(unsigned char x, unsigned char y, unsigned char numx);
void write_char(unsigned char x, unsigned char y, unsigned char charx);
void write_string(unsigned char x, unsigned char y, unsigned char *p);
void write_week(unsigned char x, unsigned char y, unsigned char weekday);

#endif


/*========下面是示例main.c的内容=======*/

#include "1602.h"

void main()
{
	lcd1602_Initiate();
	
	write_number(1,5,5);
	write_number(1,6,2);
	write_number(1,7,0);		//第一行5、6、7列写数字520
	
	write_char(1,8,'H');
	write_char(1,9,'.');
	write_char(1,10,'T');
	write_char(1,11,'.');
	write_char(1,12,'T');		//第一行8~12列写字符H.T.T
	
	write_string(2,1,"  I love you !  ");	//第二行中间写I LOVE YOU !

	while(1);
}

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
51单片机可以通过使用1602液晶屏来显示文本信息。以下是使用51单片机1602液晶屏的基本步骤: 1. 连接1602液晶屏和51单片机。将液晶屏的VSS和VDD引脚分别连接到51单片机的地和电源。将液晶屏的RS、RW和EN引脚分别连接到51单片机的P2.0、P2.1和P2.2引脚。将液晶屏的数据线D0-D7分别连接到51单片机的P0口。 2. 初始化液晶屏。在程序中使用液晶屏的初始化函数,设置液晶屏为4位数据总线、2行显示、5x8点阵字符集。 3. 显示文本。在程序中使用液晶屏的写命令函数,将需要显示的文本写入液晶屏的指定位置。 以下是示例代码: ``` #include <reg52.h> #define LCD_RS P2_0 #define LCD_RW P2_1 #define LCD_EN P2_2 #define LCD_DATA P0 void LcdDelay(unsigned int i) { while(i--); } void LcdWriteCmd(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_DATA = cmd; LcdDelay(10); LCD_EN = 1; LcdDelay(10); LCD_EN = 0; } void LcdWriteData(unsigned char dat) { LCD_RS = 1; LCD_RW = 0; LCD_DATA = dat; LcdDelay(10); LCD_EN = 1; LcdDelay(10); LCD_EN = 0; } void LcdInit() { LcdWriteCmd(0x38); //设置液晶屏为4位数据总线、2行显示、5x8点阵字符集 LcdWriteCmd(0x0c); //开显示,不显示光标 LcdWriteCmd(0x06); //写入字符后指针自动加1 LcdWriteCmd(0x01); //清屏 } void main() { LcdInit(); //初始化液晶屏 LcdWriteCmd(0x80); //设置光标位置为第一行第一列 LcdWriteData('H'); LcdWriteData('e'); LcdWriteData('l'); LcdWriteData('l'); LcdWriteData('o'); LcdWriteData(','); LcdWriteData(' '); LcdWriteData('W'); LcdWriteData('o'); LcdWriteData('r'); LcdWriteData('l'); LcdWriteData('d'); while(1); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值