本文的主要内容目录:
一、LCD1602的基本介绍
二、LCD1602液晶驱动的实现
根据对现有的LCD1602液晶的驱动进行分析,总感觉写的有些乱,有些麻烦,说白了就是不好用,这里打算自己写一个,既简单又实用的。
一、LCD1602的基本介绍
开发环境:keil, 睿智51开发板
LCD1602的液晶原理图如下:
引脚对应关系:
P2.0 : 状态引脚,为0时表示指令或者状态,为1时表示数据
P2.1 :读写引脚,为0时表示写,为1时表示读
P2.2 :使能引脚,为1时使能
P0.0 ~ P0.7 :数据引脚,用来传输数据
经过分析,整个液晶时序的核心就是两个:写命令、写数据,它们的时序如下:
寄存器的设置以及如何使用请参考LCD1602的芯片手册,这里主要说驱动的实现。
二、LCD1602液晶驱动的实现
通过上面的分析可以看出,整个驱动的核心就是实现写命令和写数据这两个部分。
1、写命令,具体实现函数如下:
/* 写命令的函数 */
void lcd1602_write_cmd(unsigned char cmd)
{
RS = 0;
RW = 0;
P0 = cmd; /* 写入的命令 */
delay_us(1);
EN = 1;
delay_us(2);
EN = 0;
RW = 1;
}
2、写数据,具体的实现如下:
/* 写数据的函数 */
void lcd1602_write_data(unsigned char dat)
{
RS = 1;
RW = 0;
P0 = dat; /* 要写入的数据 */
delay_us(1);
EN = 1;
delay_us(2);
EN = 0;
RW = 1;
RS = 0;
}
3、LCD1602的初始化函数,主要是通过写命令、写数据来实现。
/* lcd1602的初始化函数 */
void lcd1602_init()
{
delay_us(200);
lcd1602_write_cmd(0x38); /* 设置显示模式 */
delay_us(50);
lcd1602_write_cmd(0x38);
delay_us(50);
lcd1602_write_cmd(0x38);
delay_us(50);
lcd1602_write_cmd(0x0C); /* 打开显示和设置光标 */
delay_us(50);
lcd1602_write_cmd(0x06); /* 显示光标移动设置 */
delay_us(50);
lcd1602_write_cmd(0x01); /* 清屏 */
delay_us(50);
}
4、实现一个具体的LCD1602液晶显示的例子:在液晶屏上面显示一个字符串,完整的代码如下所示。
#include
/* 定义与LCD1602液晶相连的引脚 */
sbit RS = P2^0; // 状态引脚,为0时表示状态或指令,为1时表示数据
sbit RW = P2^1; // 读写引脚,为0时表示写,为1时表示读
sbit EN = P2^2; // 使能引脚,为1时使能
/* 进行一段时间的软件延时,满足LCD1602液晶的时序需要
*/
void delay_us(int us)
{
int i = 0;
int j = 0;
for(i = 0; i < us; i++)
for(j = 0; j < 12; j++);
}
/* 写命令的函数 */
void lcd1602_write_cmd(unsigned char cmd)
{
RS = 0;
RW = 0;
P0 = cmd; /* 写入的命令 */
delay_us(1);
EN = 1;
delay_us(2);
EN = 0;
RW = 1;
}
/* 写数据的函数 */
void lcd1602_write_data(unsigned char dat)
{
RS = 1;
RW = 0;
P0 = dat; /* 要写入的数据 */
delay_us(1);
EN = 1;
delay_us(2);
EN = 0;
RW = 1;
RS = 0;
}
/* lcd1602的初始化函数 */
void lcd1602_init()
{
delay_us(200);
lcd1602_write_cmd(0x38); /* 设置显示模式 */
delay_us(50);
lcd1602_write_cmd(0x38);
delay_us(50);
lcd1602_write_cmd(0x38);
delay_us(50);
lcd1602_write_cmd(0x0C); /* 打开显示和设置光标 */
delay_us(50);
lcd1602_write_cmd(0x06); /* 显示光标移动设置 */
delay_us(50);
lcd1602_write_cmd(0x01); /* 清屏 */
delay_us(50);
}
/* 在LCD1602液晶上显示字符串的函数 */
void lcd1602_show_string(unsigned char *str)
{
int i = 0;
lcd1602_write_cmd(0x00 + 0x80);
for(i = 0; str[i] != '