51单片机学习篇-- --LCD1602字符型液晶笔记

开篇先说一句废话····
本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛!

废话

这篇和上一篇串口通信笔记一样,这篇还是笔记,意思就是这些是我认为重要的内容,一定会有遗漏,详细参考郭天祥《新概念51单片机C语言教程》。

关键性指令设置

在这里插入图片描述依据上表,根据自己的需要选择对应的数值(转化为16进制),我只说一些一般情况下的指令。

  1. 清屏:0x01
  2. 模式设定(光标右移、显示屏不动) 0x06
  3. 开关检测(显示功能开、无光标、光标闪(无光标的情况下光标闪不闪都不影响)) 0x0c
  4. 功能设定(数据总线8、显示两行、5X7点阵) 0x38
  5. 设置显示屏和光标的移动(滚动屏的时候需要) 0x18

操作步骤

初始化

  1. 功能设定
  2. 开关检测
  3. 模式设定
  4. 清屏
  5. 设置数据指针起点

写入数据

  1. 拉低使能(E)
  2. 选择数据(RS–>1)
  3. 选择写入(R/W)
  4. 数据写入P0,之后简单的延时(5ms)
  5. 写入时序(E为1–>简单延时(5ms)–>E为0)(下降沿写入数据)
  6. (数据总线为4时候用)在重复4、5步即可

注意

  • 写入命令

初始化的那些步骤属于指令,所以写入命令,而写入命令与写入数据一样,区别就是第二步是选择命令(RS–>0)

  • 写第二行数据时,需要重新设置数据指针起点(0x80+0x40)

应用

  1. 静态显示

在LCD1602上第一行显示: LaLisa
在LCD1602上第二行显示: Manoban
过一段时间后,
第一行显示:LaLisa Manoban
第二行显示:I LIKE YOU!!
尽量居中显示

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

typedef unsigned int u16;
typedef unsigned char u8;

#define LCD1602_INPUT P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RS=P2^6;
sbit LCD1602_RW=P2^5;

u8 label[]="LaLisa Manoban";
u8 label1[]="I LIKE YOU!!";
u8 num;
void Delay(u16 i)     //11.0592MHz  1ms
{
	while(i--){
		unsigned char i, j;

		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
} 
void WriteCom(u8 cmd){
	LCD1602_E=0;		//拉低使能
	LCD1602_RS=0;		//选择命令:0
	LCD1602_RW=0;		//选择写入:0
	LCD1602_INPUT=cmd;	//命令写入P0端口
	Delay(5);
	
	LCD1602_E=1;
	Delay(5);
	LCD1602_E=0;
}
void WriteData(u8 dat){
	LCD1602_E=0;		//拉低使能
	LCD1602_RS=1;		//选择数据:1
	LCD1602_RW=0;		//选择写入:0
	LCD1602_INPUT=dat;	//数据写入P0端口
	Delay(5);
	
	LCD1602_E=1;
	Delay(5);
	LCD1602_E=0;
}
void Init(){
	WriteCom(0x38);		//功能设定:数据总线、显示行数、点阵5X7
	WriteCom(0x0c);		//开关检测: 显示功能、光标显示、光标闪烁
	WriteCom(0x06);		//模式设定:光标左右移、显示屏不懂或者右移
	WriteCom(0x01);		//清屏指令:防止别的数据影响
	WriteCom(0x80+0x05);//数据指针起点设置(第一行第五列开始显示)
}
void main(){
	Init();
	for(num=0;num<6;num++){
		WriteData(label[num]);
		Delay(5);
	}
	WriteCom(0x80+0x40+0x05);
	for(num=7;num<14;num++){
		WriteData(label[num]);
		Delay(5);
	}
	Delay(1000);
	WriteCom(0x01);		//清屏
	WriteCom(0x80+0x01);	
	for(num=0;num<14;num++){
		WriteData(label[num]);
		Delay(5);
	}
	WriteCom(0x80+0x40+0x02);
	for(num=0;num<12;num++){
		WriteData(label1[num]);
		Delay(5);
	}
	while(1);
}

当延长写入时间的时候也算是动态,一般快速写入,显示快慢再行设置

  1. 动态(滚动)显示

滚动显示“LaLisa Manoban I LIKE YOU!”最后停在屏幕中央
在LCD1602上第一行显示: LaLisa Manoban
在LCD1602上第二行显示: I LIKE YOU!

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

typedef unsigned int u16;
typedef unsigned char u8;

#define LCD1602_INPUT P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RS=P2^6;
sbit LCD1602_RW=P2^5;

u8 label[]="LaLisa Manoban";
u8 label1[]="I LIKE YOU!!";
u8 num;
void Delay(u16 i)     //11.0592MHz  1ms
{
	while(i--){
		unsigned char i, j;

		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
} 
void WriteCom(u8 cmd){
	LCD1602_E=0;		//拉低使能
	LCD1602_RS=0;		//选择命令:0
	LCD1602_RW=0;		//选择写入:0
	LCD1602_INPUT=cmd;	//命令写入P0端口
	Delay(5);
	
	LCD1602_E=1;
	Delay(5);
	LCD1602_E=0;
}
void WriteData(u8 dat){
	LCD1602_E=0;		//拉低使能
	LCD1602_RS=1;		//选择数据:1
	LCD1602_RW=0;		//选择写入:0
	LCD1602_INPUT=dat;	//数据写入P0端口
	Delay(5);
	
	LCD1602_E=1;
	Delay(5);
	LCD1602_E=0;
}
void Init(){
	WriteCom(0x38);		//功能设定:数据总线、显示行数、点阵5X7
	WriteCom(0x0c);		//开关检测: 显示功能、光标显示、光标闪烁
	WriteCom(0x06);		//模式设定:光标左右移、显示屏不懂或者右移
	WriteCom(0x01);		//清屏指令:防止别的数据影响
	WriteCom(0x80+0x10);//数据指针起点设置
}
void main(){
	Init();
	for(num=0;num<14;num++){
		WriteData(label[num]);
		Delay(10);
	}
	WriteCom(0x80+0x51);
	for(num=0;num<12;num++){
		WriteData(label1[num]);
		Delay(10);
	}
	for(num=0;num<15;num++){
		WriteCom(0x18);		//滚动屏
		Delay(500);
	}
	while(1);
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值