【51单片机篇】LCD1602显示

一、初识LCD1602

1.LCD1602是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)。
 2.引脚说明

 二、显示逻辑

1.搞明白在哪里显示(地址)?显示什么(内容)?

在哪里显示
显示什么

 三、时序分析

1.写操作时序

(1)RS=1:写内容;RS=0:写地址;

(2) RW = 0:写操作;

(3)E:从低电平上升到高电平(这个过程中延时25ns),然后高电平持续150ns,最后从高电平下降到低电平(这个过程中延时25ns),延时时间可以用_nop_()函数代替。

 2.读操作时序

(1)RS:通过指令9可知,RS=0;

(2)RW=1:读操作;

(3)E:从低电平上升到高电平(这个过程中延时25ns),然后高电平持续150ns,最后从高电平下降到低电平(这个过程中延时25ns),延时时间可以用_nop_()函数代替。

四、代码示例

1.编程实现LCD1602显示字符'C'

#include "reg52.h"
#include <intrins.h>

#define databuffer  P0//定义8位数据线,P0端口组

sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;

void Check_Busy()
{
	char tmp = 0x80;
	databuffer = 0x80;
	
	while(tmp & 0x80){//比较最高位
		RS = 0;
		RW = 1;
		EN = 0;
		_nop_();
		EN = 1;
		_nop_();
		_nop_();
		tmp = databuffer;
		EN = 0;
		_nop_();
	}
}

void Write_Cmd_Func(char cmd)//写指令,RS低电平 
{
	Check_Busy();
	RS = 0;
	RW = 0;
	EN = 0;
	_nop_();//空函数,延时1us
	databuffer = cmd;
	_nop_();
	EN = 1;
	_nop_();
	_nop_();
	EN = 0;
	_nop_();
}

void Write_Data_Func(char cmd)//写数据,RS高电平
{
	Check_Busy();
	RS = 1;
	RW = 0;
	
	EN = 0;
	_nop_();//空函数,延时1us
	databuffer = cmd;
	_nop_();
	EN = 1;
	_nop_();
	_nop_();
	EN = 0;
	_nop_();
}

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 LCD1602_Init()
{
	//1.延时15ms
	Delay15ms();
	//2.写指令38H(不检测忙信号)
	Write_Cmd_Func(0x38);
	//3.延时5ms
	Delay5ms();
	//4.以后每次写指令,读/写数据操作均需要检测忙信号
	//5.写指令38H:显示模式设置
	Write_Cmd_Func(0x38);
	//6.写指令08H:显示关闭
	Write_Cmd_Func(0x08);
	//7.写指令01H:显示清屏
	Write_Cmd_Func(0x01);
	//8.写指令06H:显示光标移动设置
	Write_Cmd_Func(0x06);
	//9.写指令0CH:显示开及光标设置
	Write_Cmd_Func(0x0c);
}

void main()
{
	char pposition = 0x80 + 0x05;
	char dataShow = 'C';
	
	LCD1602_Init();
	
	Write_Cmd_Func(pposition);//要显示的地址
	Write_Data_Func(dataShow);//要显示的内容
}

 2.编程实现LCD1602显示一行

#include "reg52.h"
#include <intrins.h>

#define databuffer  P0//定义8位数据线,P0端口组

sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;

void Check_Busy()
{
	char tmp = 0x80;
	databuffer = 0x80;
	
	while(tmp & 0x80){//比较最高位
		RS = 0;
		RW = 1;
		EN = 0;
		_nop_();
		EN = 1;
		_nop_();
		_nop_();
		tmp = databuffer;
		EN = 0;
		_nop_();
	}
}

void Write_Cmd_Func(char cmd)//写指令,RS低电平 
{
	Check_Busy();
	RS = 0;
	RW = 0;
	EN = 0;
	_nop_();//空函数,延时1us
	databuffer = cmd;
	_nop_();
	EN = 1;
	_nop_();
	_nop_();
	EN = 0;
	_nop_();
}

void Write_Data_Func(char cmd)//写数据,RS高电平
{
	Check_Busy();
	RS = 1;
	RW = 0;
	
	EN = 0;
	_nop_();//空函数,延时1us
	databuffer = cmd;
	_nop_();
	EN = 1;
	_nop_();
	_nop_();
	EN = 0;
	_nop_();
}

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 LCD1602_Init()
{
	//1.延时15ms
	Delay15ms();
	//2.写指令38H(不检测忙信号)
	Write_Cmd_Func(0x38);
	//3.延时5ms
	Delay5ms();
	//4.以后每次写指令,读/写数据操作均需要检测忙信号
	//5.写指令38H:显示模式设置
	Write_Cmd_Func(0x38);
	//6.写指令08H:显示关闭
	Write_Cmd_Func(0x08);
	//7.写指令01H:显示清屏
	Write_Cmd_Func(0x01);
	//8.写指令06H:显示光标移动设置
	Write_Cmd_Func(0x06);
	//9.写指令0CH:显示开及光标设置
	Write_Cmd_Func(0x0c);
}

void LCD1602_showLine(char row,char col,char *string)
{
	switch(row){
		case 1:
			Write_Cmd_Func(0x80+col);
			while(*string){
				Write_Data_Func(*string);
				string++;
			}
			break;
		case 2:
			Write_Cmd_Func(0x80+0x40+col);
			while(*string){
				Write_Data_Func(*string);
				string++;
			}
			break;
	}
}

void main()
{
	char pposition = 0x80 + 0x05;
	
	LCD1602_Init();
	LCD1602_showLine(1,5,"NO.1");
	LCD1602_showLine(2,2,"Hello China");
}

  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿gao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值