开篇先说一句废话····
本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛!
废话
这篇和上一篇串口通信笔记一样,这篇还是笔记,意思就是这些是我认为重要的内容,一定会有遗漏,详细参考郭天祥《新概念51单片机C语言教程》。
关键性指令设置
依据上表,根据自己的需要选择对应的数值(转化为16进制),我只说一些一般情况下的指令。
- 清屏:0x01
- 模式设定(光标右移、显示屏不动) 0x06
- 开关检测(显示功能开、无光标、光标闪(无光标的情况下光标闪不闪都不影响)) 0x0c
- 功能设定(数据总线8、显示两行、5X7点阵) 0x38
- 设置显示屏和光标的移动(滚动屏的时候需要) 0x18
操作步骤
初始化
- 功能设定
- 开关检测
- 模式设定
- 清屏
- 设置数据指针起点
写入数据
- 拉低使能(E)
- 选择数据(RS–>1)
- 选择写入(R/W)
- 数据写入P0,之后简单的延时(5ms)
- 写入时序(E为1–>简单延时(5ms)–>E为0)(下降沿写入数据)
- (数据总线为4时候用)在重复4、5步即可
注意
- 写入命令
初始化的那些步骤属于指令,所以是写入命令,而写入命令与写入数据一样,区别就是第二步是选择命令(RS–>0) 。
- 写第二行数据时,需要重新设置数据指针起点(0x80+0x40)
应用
- 静态显示
在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);
}
当延长写入时间的时候也算是动态,一般快速写入,显示快慢再行设置
- 动态(滚动)显示
滚动显示“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);
}