51单片机 自用STC89C52RC lcd1602库文件 拿来就能用

别太讲究,只要三个IO口设置了就很好用,lcd1602接P0口,因为这个是自己做的库文件,很简单易懂,而且函数名字很好记的说
使用方法main.c #include “lcd.h” 先初始化lcd_init();然后函数按照参数说明使用就行
lcd.h文件

#ifndef _LCD_H   //如果没有定义__LCD_H,那么定义它 
#define _LCD_H

sbit lcdrs=P2^5;          //lcd数据命令选择端  rs为L(ledrs=0)则写命令 H(ledrs=1)则写数据
sbit lcdrw=P2^6;
sbit lcden=P2^7;          //lcd使能   lcden=1 则写入 

extern void lcd_init();          //lcd初始化
extern void lcd_clear();           //清屏
extern void write_data(unsigned char date);
extern void write_com(unsigned char com);
//extern void lcd_set_cursor(unsigned char line,unsigned char addr);  //显示光标第几行 第几个字符
extern void lcd_cursor_blink_on(unsigned char line,unsigned char addr); //显示光标并闪烁 第几行第几个
extern void lcd_cancel_cursor();   //取消光标显示
//extern unsigned char lcd_display_str(unsigned char  ,unsigned char *); //显示字符串函数  table为字符串,最大16字符  line为显示的行数,1为第一行 2为第二行
extern void lcd_display_char(unsigned char line ,unsigned char addr, unsigned char data1);//写数据 第几行 第几个开始  数据  data1如果是数字0-9  必须用'0'+数字计算ascii值或者'0'-'9'
#endif

lcd.c文件

#include <reg52.h>
#include <string.h>
#include <intrins.h>
#include "lcd.h"
#include "delay.h"

void write_com(unsigned char com)
{
	lcdrs=0;
	P0=com;
	delay200us();	
	delay50us();
	lcden=1;
	delay200us();	
	delay50us();
	lcden=0;
}
void write_data(unsigned char date)
{
	lcdrs=1;
	P0=date;
	delay200us();	
	delay50us();
	lcden=1;
	delay200us();
	delay50us();	
	lcden=0;
}
void lcd_init()
{
	lcden=0;
	lcdrw=0;
	write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口
	write_com(0x0c);//设置开显示,不显示光标
	write_com(0x06);//写一个字符后地址指针加1
	write_com(0x01);//显示清零,数据指针清零
}
void lcd_clear()
{
	write_com(0x01);//显示清零,数据指针清零
	delayms(3);
}
//void lcd_set_cursor(unsigned char line,unsigned char addr)
//{
//	write_com(0x80+(line-1)*0x40+addr);						//根据行数和add参数定位写数据位置
//	write_com(0x0e);												//光标show
//}
void lcd_cursor_blink_on(unsigned char line,unsigned char addr)
{
	write_com(0x80+(line-1)*0x40+addr);						//根据行数和add参数定位写数据位置
	write_com(0x0f);												//光标开始闪烁
}
void lcd_cancel_cursor()
{
	write_com(0x0c);												//光标bu闪烁
}
void lcd_display_char(unsigned char line,unsigned char addr, unsigned char data1)   //写数据 第几行 第几个开始  数据  data1如果是数字0-9  必须用'0'+数字计算ascii值
{
//	unsigned char address;
//	address=0x80+(line-1)*0x40+addr;         
	write_com(0x80+(line-1)*0x40+addr);						//根据行数和add参数定位写数据位置
	write_data(data1); 		////////////////输出字符****写完后光标自动下移一个,无需再定位地址****
}
//unsigned char lcd_display_str(unsigned char line ,unsigned char *table)       //显示字符串子函数  table为字符串,最大16字符  line为显示的行数,1为第一行 2为第二行  
//{
//	unsigned char strlen1;
//	unsigned char num;
//	strlen1=strlen(table);                    //strlen函数得到当前字符串长度
//	if(strlen1>16) strlen1=16;								//超出16字符后只取前16字符
//	if(line==1)      													//第一行写入地址0x80
//	{
//			lcdrs=0;
//			P0=0x80;
//			delay200us();	
//		delay200us();	
//			lcden=1;
//			delay200us();	
//		delay200us();	
//			lcden=0;
//	}
//	else if(line==2)                                  //第二行写入地址0xc0
//			{
//			lcdrs=0;
//			P0=0x80+0x40;
//			delay200us();	
//		delay200us();	
//			lcden=1;
//			delay200us();	
//		delay200us();	
//			lcden=0;
//	}
//	if(line==1 || line==2)                    //line参数1或者2才操作,不然不处理
//	{
//		for(num=0;num
//			{
//					lcdrs=1;
//					P0=table[num];
//					delay200us();	
//				delay200us();	
//					lcden=1;
//					delay200us();	
//				delay200us();	
//					lcden=0;
//				_nop_();
//				_nop_();
//			}  
//		return 1;
//	}
//	else                                       //行数溢出 返回0 
//	{
//		return 0;
//	}
//}

至于为什么延迟250us,因为有的时候等待时间太短lcd显示会出问题,250us是我自己的lcd1602不出显示问题的最短延迟时间

delay.h文件在前面的文章里有

你可能感兴趣的:(51单片机)