51单片机 LCD1602显示

引脚图

 

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit RS=P2^7;
sbit RW=P2^6;
sbit E=P2^5;

void lcd_initial(void);	//LCD初始化函数
void check_busy(void);	   //检查是否忙碌函数
void write_command(uchar com);	 //写命令函数
void write_data(uchar dat);		  //写数据函数
void string(uchar ad,uchar *s);	  //显示字符串函数
void delay(uint);					//延时函数
void main(void)
	{
    lcd_initial();			 //调用初始化函数
	 while(1)
	 {
	 string(0x85,"mzf");
	 string(0xC2,"185*****5260");
	 delay(100);
	 write_command(0x01);
	 delay(100);
 
	 }
	}
void delay(uint j)	 //1ms的延时
{
	uchar i=250;
	for(;j>0;j--)
	{
		while(--i);
		i=249;
		while(--i);
		i=250;
 
	}
}
 
void check_busy(void)
{
	uchar dt;
	do
	{
		dt=0xff;	 //dt为变量单元,初值为0xff
		E=0;		  
		RS=0;		  //RS等于0,E=1时,才能够进行读忙碌状态
		RW=1;
		E=1;		 
		dt=out;		  //out为P0口,将P0口的状态送给dt;
 
	}while(dt&0x80);
		E=0;
}
void write_command(uchar com)
{
	check_busy();	  //检查是否忙碌,检查BF标志位,如果BF=1,则繁忙
	E=0;
	RS=0;			   //RS,E同时为零时,才可以写入命令;
	RW=0;
	out=com;		 	//将命令com写入P0;
	E=1;				//按规定执行命令时,E应为正脉冲,即正跳变,所以前面应该先直零
	_nop_();		//空操作给硬件反应时间,此函数包含在intrins里面
	E=0;
	delay(1);
 
}
void write_data(uchar dat)
{
	check_busy();
	E=0;
	RS=1;
	RW=0;
	out=dat;
	E=1;
	_nop_();
	E=0;
	delay(1);
 
}
void lcd_initial(void)	 //液晶显示器初始化函数
{
	write_command(0x38);  //两行显示,5x7点阵,8位数据
	write_command(0x0C);  //开整体显示,光标关,无闪烁
	write_command(0x06);  //写入一个字符后,地址指针加一
	write_command(0x01);   //清屏
	delay(1);
}
void string(uchar ad,uchar *s)
{
	write_command(ad);
	while(*s>0)
	{
		write_data(*s++);
		delay(100);
	}
}
 

猜你喜欢

转载自blog.csdn.net/fzf1996/article/details/90601308