代码:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num;
uint i,j;
sbit rs=P3^5; 定义液晶数据命令选择端
sbit wr=P3^6; 定义液晶读写选择端
sbit lcden=P3^4; 定义液晶使能选择端
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table1[]="study every day";
uchar code table2[]="thanks for reading";
void delay(uint x)
{
for(i=x;i>0;i--)
{
for(j=120;j>0;j--);
}
}
void write_com(uchar com) //写命令函数
{
rs=0; 数据命令选择端,写命令时设为0
wr=0; 读写选择段,写数据设为0
lcden=0;
P0=com; 将要写的命令传送到数据总线上
lcden=1; 使能端电平变换,形成一个高脉冲将命令写入到液晶控制器
delay(5);
lcden=0; 再把使能端置0
}
void write_data(uchar dat) //写数据函数
{
rs=1;
wr=0;
lcden=0;
P0=dat;
lcden=1;
delay(5);
lcden=0;
}
void init() //1602液晶初始化设置函数
{
write_com(0x38); 显示模式,设置成16x2显示,5x7点阵,8位数据口
write_com(0x08); 关闭显示
write_com(0x01); 显示清屏:数据指针清零,所有显示清零
write_com(0x06); 显示光标移动设置:写一个字符之后地址指针加一,光标也加一
write_com(0x0f); 显示开及光标设置:开显示,显示光标,把光标设置位闪烁
}
void main()
{
P0=0; 关闭数码管
dula=0;
wela=0;
init();
for(num=0;num<9 ;num++)
{
write_data(table1[num]);
delay(300);
}
write_com(0x80+0x40);
for(num=0;num<16 ;num++)
{
write_data(table2[num]);
delay(300);
}
while(1);
}
-
1602模块参数表
-
引脚功能:
1、VL 脚:改变VL脚的电压可以调节液晶显示的对比度,通过调整可调电阻(10k)的分压值改变VL的电压
2、RS脚:为高电平时,写入的是显示数据;为低电平时,写入的是命令
3、R/W脚:为高电平可以读取液晶数据;低电平时可以往液晶里写数据
4、E脚:让液晶工作的信号,类似与AD和DA芯片的片选信号
5、D0~D7脚:八位并行数据端口 -
RAM地址映射图:
1、00 ~ 0F地址对应液晶显示区域的第一行16位;40 ~ 4F 对应第二行16位
10 ~ 27 和50 ~67 是不会显示出来的,需要用到移屏命令
例如输入 0x18 命令后整屏左移一位;输入 0x1c 右移一位 -
状态字:
1、 STA=1时,禁止进行读写操作,因为1602模块操作速度有限,在模块还没忙完的时候
对它进行读写操作会导致数据丢失(51芯片工作速度比1602慢,ARM较快)
因此每次对模块操作都要去读模块是否忙完了 -
初始化设置:
1、
其中 5x7 是指用35个点阵组成的区域显示一个字符
5x7点阵
2、显示开/关及光标设置
3、
-
数据指针设置:
要在1602上显示字符,首先要设置数据地址指针RAM进行访问,他的指令码是 80H+地址码 ,而不能直接写地址码表示
例如 80H+01 所在的位置是液晶显示区域的第一行,第二个位置 -
操作时序