液晶显示屏LCD1602

液晶显示屏问题

**

步骤

**
液晶屏显示内部处理问题
读状态(检测是否属于忙碌状态)
写命令(输入给函数想要显示的位置信息)
写数据(输入给函数想要显示的信息内容)
初始化(使用液晶屏之前应先初始化)

读状态(检测是否属于忙碌状态)

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);//此处0X80转换成二进制即为10000000,即屏蔽掉D0到D6这七位的输入状态,
	//只检测D7口输出的数值,D7与BF相连,即检测BF的数值
	E = 0;//检测完毕再置零 
 } 

写命令(输入给函数想要显示的位置信息)

//写命令
void write_command(uchar com)
{
	check_busy();//除初始化不需要检测是否忙碌,其他任何时间都需首先检测是否忙碌
	//因写命令是在RS和E为零时才可以进行
	E = 0;//为写命令做准备 
	RS = 0;
	RW = 0;
	out = com;//将命令com写入P0口
	E = 1;//写命令时E应为正脉冲,即正跳变,
	_nop_();//空操作一个机械周期,等待硬件反应
	E = 0;//E为使能装置,每次使用完应置零
	delay(1); 
 } 

写数据(输入给函数想要显示的信息内容)

 //写数据
void write_data(uchar dat)
{
	check_busy;
	E = 0;//为写入数据时,E变为正脉冲做准备 
	RS = 1;
	RW = 0;//按照规定此状态下才可以写入数据
	out = dat;//将数据dat从P0口输出,即写入到显示屏模块上 
	E = 1;//跳变为正脉冲
	_nop_();//空操作,留点时间给硬件反应
	E = 0//使用完再次置零
	delay(1); 
 } 

初始化(使用液晶屏之前应先初始化)

void LCD_initial(void)
{
write_common(0x38);//写入0x38:两行显示,5*7点阵,8位数据 
write_common(0x0c);
write_common(0x05);
write_common(0x01);
delay(1);//延时程序 
}

具体内容可参考单片机书133页

//LCD1602液晶显示模块的初始化
#include<reg52.h>
//初始化函数 
void LCD_initial(void)
{
write_common(0x38);//写入0x38:两行显示,5*7点阵,8位数据 
}
//检测忙函数
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);//此处0X80转换成二进制即为10000000,即屏蔽掉D0到D6这七位的输入状态,
	//只检测D7口输出的数值,D7与BF相连,即检测BF的数值
	E = 0;//检测完毕再置零 
 } 
 //写命令
void write_command(uchar com)
{
	check_busy();//除初始化不需要检测是否忙碌,其他任何时间都需首先检测是否忙碌
	//因写命令是在RS和E为零时才可以进行
	E = 0;//为写命令做准备 
	RS = 0;
	RW = 0;
	out = com;//将命令com写入P0口
	E = 1;//写命令时E应为正脉冲,即正跳变,
	_nop_();//空操作一个机械周期,等待硬件反应
	E = 0;//E为使能装置,每次使用完应置零
	delay(1); 
 } 
 //写数据
void write_data(uchar dat)
{
	check_busy;
	E = 0;//为写入数据时,E变为正脉冲做准备 
	RS = 1;
	RW = 0;//按照规定此状态下才可以写入数据
	out = dat;//将数据dat从P0口输出,即写入到显示屏模块上 
	E = 1;//跳变为正脉冲
	_nop_();//空操作,留点时间给硬件反应
	E = 0//使用完再次置零
	delay(1); 
 } 
 //延时程序
 void delay(uchar i)//非精确延时 
{
	uchar j = 250;
	for(;i>0;i--)
	{
		while(--j);
		j = 249;
		while(--j);
		j = 250;//延时时间可通过执行的机械周期次数可大致计算出延时时间
		//本延时可用中断来实现精确延时 
	}
} 
void main(void)//主函数, 
{
	lcd_initial();//初始化函数,对于液晶屏,在使用前都应初始化,来确定程序运行的初始位置 
	while(1)
	{
		string(0x85,"welcome");//0x85代表着10000101,显示第一行字符串 ,从左边第五个字符处开始显示 
		string(0xc2,"Harbin CHINA");//0xc2代表着11000010.显示第二行字符串,从左边第二个字符处开始显示 
		//详情可看单片机书134至135页,对于液晶屏显示位置的不同是根据要求显示 ,按照目标要求来计算出二进制地址 
		delay(100);//延时程序 
		write_command(0x01);//清屏命令,其他位置不显示出来,表示着剩下的所用的液晶不用显示,也不用被修改 
		delay(100);//延时程序 
	}
 } 
void string(uchar ad,uchar *s)//第一个用来表示输入的地址信息,第二个用字符串的形式用指针指来显示所想显示的文字 
{
	write_command(ad);
	while(*s>0)
	{
		write_data(*s++);
		delay(100);
	}
}
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值