51单片机连接的LCD1602,自己手写显示库

今天造成试了半天,也没有把lcd1602的显示库函数写好,总是报错,心情不太好,于是开车出去去另外的一个家,去收拾房子,上一家租户真的太邋遢了,弄得好乱,收拾了一天,算是把厕所收拾的差不多了,一看时间4点中了,回家,路上就一遍开车一遍想早晨的代码,为什么总是报错!回来后试了没有3遍就跑通了,于是果断记录一下代码?以便我下次直接使用就好了,不用重复造轮子了。这个1602的库函数网上搜索着有,但是没有一个能用的。所以自己写吧!下面把3段代码,3个文件都贴出来!望有缘者引用,如果有什么不对或是可以优化的地方,望不吝赐教!

下面这个是LCD_1602.C的文件源码:

#include"reg51.h"
sbit RS = P3^7; // 此处修改RS端口
sbit RW = P3^6; // 此处修改RW端口
sbit E = P3^5; // 此处修改E端口
#define u8 unsigned char
#define u16 unsigned int


//***************************************************************
//   1602延时函数
//***************************************************************
void delay(u8 t){
	u8 i=0, j=0;
	for(i=0; i<t; i++){
		for(j=0;j<120;j++);
	}
}

//***************************************************************
//   1602写数据函数
//***************************************************************
void write_date(u8 date){
	RS=1;		  // 写时序图中的第一行RS为高电平写数据
	RW=0;		// 写时序图中的第二行RW
	E=0;		// 写时序图中的第三行E
	P2=date;		// 看时序图中E为0的时候就把数据放到接口里面了(这里我们定的接口是P2)
	delay(5);	// 这个延时很重要,没有显示不了
	E=1;		// 写时序图中的第三行E,写命令时拉高电平。
	E=0;		 // 写时序图中的第三行E,写完命令拉低电平。
}


//***************************************************************
//   1602写命令函数
//***************************************************************
void write_com(u8 com){
	RS=0;		 // 写时序图中的第一行RS为低电平写命令
	RW=0;		// 写时序图中的第二行RW
	E=0;		// 写时序图中的第三行E
	P2=com;		// 看时序图中E为0的时候就把数据放到接口里面了(这里我们定的接口是P2)
	delay(5);	// 这个延时很重要,没有显示不了
	E=1;		// 写时序图中的第三行E,写命令时拉高电平。
	E=0;		 // 写时序图中的第三行E,写完命令拉低电平。
}

//***************************************************************
//   1602初始化
//***************************************************************
void init_1602(){
	write_com(0x38);   //  设置16X2显示,5X7点阵, 8位数据接口
	write_com(0x0c);	 // 设置开显示,不显示光标
	write_com(0x06);	// 写一个字符后地址指针加1
	write_com(0x01);	// 显示清0, 数据指针清0.
}

//***************************************************************
//   1602显示函数
//***************************************************************
void display(u8 id, u8 *dat){
	u16 i=0;
	write_com(id);
	delay(5);
	while(dat[i] != '\0'){
		write_date(dat[i]);
		delay(5);
		i++;
	}

}

下面是LCD1602.H的源文件:

// LCD1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_
// 此文件所需头文件
#include <reg52.h>
// 关键字替换
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned int
#endif


//***************************************************************
//   1602延时函数
//***************************************************************
void delay(u8 t);

//***************************************************************
//   1602写数据函数
//***************************************************************
void write_date(u8 date);

//***************************************************************
//   1602写命令函数
//***************************************************************
void write_com(u8 com);

//***************************************************************
//   1602初始化
//***************************************************************
void init_1602();

//***************************************************************
//   1602显示函数
//***************************************************************
void display(u8 id, u8 *dat);

	

#endif

下面是main.C的源代码,主要是调用LCD1602.h的库文件使用,方便日后的显示问题,直接导入就能使用。

#include"lcd1602.h"

u8 str[]={"I LOVE YOU!55566"};  //要显示的字符

void main(){
	init_1602();  // 初始化1602
	while(1){
		//   第一行:0x80   第二行:0x80+0x40  第几个开始显示就自己加空格吧
		display(0x80, str);  
	}
}

下面是我的keil截图,说明文件之间的关系

猜你喜欢

转载自blog.csdn.net/xingyuncao520025/article/details/130065055