51单片机:1602液晶显示屏
1602是一种液晶显示器,而液晶显示器通常是根据显示字符的行数、列数来命名的,所以勒,1602的意思便是每行显示16个字符,一共可以显示2行,且只能显示英文(内置ASCII字符集库,只有并行接口)。
1602 含3个控制端,分别是:RS(数据/命令选择端)、RW(读写控制端)、E(使能信号)
特别注意E使能信号:给E一个高脉冲时。会将数据送入液晶控制器,完成写操作,不管是写指令还是数据都是同理。
所以在程序编写过程中要有:
en = 1; delay(); en = 0;
通过控制三个控制端口的高低电平,使1602分别进行相应的操作;
控制器内部带有80B的RAM缓冲区,对应关系如图。向图中红色区域内写入数据时都可以直接显示出来,当写入蓝色框框时则必须通过移屏指令将它们移入可显示区域才可正常显示。
指令说明:直接看说明书即可
数据控制:
数据指针设置:控制器内部舍友一个数据地址指针,用户可以通过它们访问内部的全部80RAM
注意!指令码是80H + 地址码,就像你想访问RAM地址映射图里的40号存储空间,则在写代码的时候应该写成0x80+0x40
其它指令:直接搬手册了
时序图:
下面放一个例子:在1602上显示Hello MCU!和WWW.KIM.COM
#include <reg52.h>
#define uchar unsigned char
//typedef unsigned char uchar;
typedef unsigned int uint;
// 待打印的字符集
uchar code table[] = "Hello MCU!";
uchar code table1[] = "WWW.KIM.COM";
sbit en = P2^7;
sbit rs = P2^6;
sbit rw = P2^5;
void delay(uint z){
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com){
rs = 0;// 写指令
P0 = com;
delay(5);
// 高脉冲瞬间读入
en = 1;
en = 0;
}
void init(){
rw = 0;
en =0;
// 使能端为0,写指令
write_com(0x38);// 设置显示方式
write_com(0x0c);// 开显示,包括光标和闪烁
write_com(0x06);// 写一个字符后,地址指针自动加一
write_com(0x01);// 显示请0,数据指针清0
}
void write_data(uchar date){
rs = 1;
P0 = date;
delay(5);
en = 1;
en = 0;
}
void main(){
uchar num = 0;
init();
write_com(0x80);
for(num=0;num<10;num++){
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<11;num++){
write_data(table1[num]);
delay(5);
}
while(1);
}
运行图: