51单片机学习——非标协议外设——LCD1602液晶显示屏

一、LCD1602液晶显示模块学习

1、概述

2、引脚接口说明

3、指令说明

4、操作时序图

5、LCD内部显示和地址

5.1、写入地址(或指令)

5.2、写入数据

6、LCD1602初始化及注意事项

6.1、初始化

6.2、注意事项

7、开发液晶显示屏实例

7.1、初始化液晶显示屏

7.2、写入指令操作

7.3、写入数据操作

7.4、每次写入操作之前的忙检测

7.5、建立字符串

7.6、显示屏第二行不亮BUG原因

   检测忙的函数中,databuffer过定义导致,databuffer在头文件下已经定义为P0端口8根数据线

8、总代码

​
#include "reg52.h"
#include "intrins.h"

#define databuffer P0		//定义P0数据总线
sbit RS = P1^0;
sbit RW = P1^1;
sbit E	= P1^4;

void Delay15ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 27;
	j = 226;
	do
	{
		while (--j);
	} while (--i);
}

void Delay5ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 9;
	j = 244;
	do
	{
		while (--j);
	} while (--i);
}

void Check_Busy()		//检测是否忙
{
	char temp  = 0x80;	
	databuffer = 0xFF;			//端口全部置1为了防止单片机读取数据出错			
	while(temp & 0x80){			//为忙则一直卡住,忙只关心BF为高电平
		RW = 1;								//高电平进行读操作
		RS = 0;
		E  = 0;
		_nop_();
		E	 = 1;
		_nop_();
		_nop_();
		temp = databuffer;
		E	 = 0;
		_nop_();
	}
}

void Writ_Cmd_Fun(char cmd)
{
	Check_Busy();
	RW = 0;						//R/W寄存器低电平为写操作
	RS = 0;						//RS为低电平时选择指令寄存器
	
	E  = 0;
	_nop_();
	databuffer = cmd;	//指令建立
	_nop_();
	E	 = 1;
	_nop_();
	_nop_();
	E	 = 0;
	_nop_();
}

void Writ_Data_Fun(char Data)
{
	Check_Busy();
	RW = 0;						//R/W寄存器低电平为写操作
	RS = 1;						//RS为高电平是选择数据寄存器
	
	E  = 0;
	_nop_();
	databuffer = Data;
	_nop_();
	E	 = 1;
	_nop_();
	_nop_();
	E	 = 0;
	_nop_();
}

void LCD1602_INIT()			//查LCD手册初始化过程步骤
{
	//(1)延时 15ms
	Delay15ms();
	//(2)写指令 38H(不检测忙信号)
	Writ_Cmd_Fun(0x38);
	//(3)延时 5ms
	Delay5ms();
	//(4)以后每次写指令,读/写数据操作均需要检测忙信号
	//(5)写指令 38H:显示模式设置
	Writ_Cmd_Fun(0x38);
	//(6)写指令 08H:显示关闭
	Writ_Cmd_Fun(0x08);
	//(7)写指令 01H:显示清屏
	Writ_Cmd_Fun(0x01);
	//(8)写指令 06H:显示光标移动设置
	Writ_Cmd_Fun(0x06);
	//(9)写指令 0CH:显示开及光标设置
	Writ_Cmd_Fun(0x0C);
}

void LCD1602_showLine(int row , int col , char *str)
{
	switch(row){
		case 1:
			Writ_Cmd_Fun(0x80 + col);
			while(*str){
					Writ_Data_Fun(*str);
					str++;
				}
			break;
		case 2:
			Writ_Cmd_Fun(0x80 + 0x40 + col);
			while(*str){
				Writ_Data_Fun(*str);
				str++;
			}
			break;
	}
	
}

void main()
{
	Delay15ms();
	LCD1602_INIT();								//初始化LCD1602模块
	LCD1602_showLine(1,5,"No.1");						//第一排05显示,N0.1
	LCD1602_showLine(2,0,"You Look handsome");
}

​

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值