当前位置: 主页 > 电工常识 > 正文

基于51单片机的LCD1602液晶驱动实现

来源:未知 时间:2018-07-17 18:14

本文的主要内容目录:

一、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] != '\0'; i++)

lcd1602_write_data(str[i]);

}

/* 程序的入口函数 */

void main()

{

lcd1602_init();/* 液晶的初始化函数 */

lcd1602_show_string("TECH-PRO");/* 在液晶上显示字符串:TECH-PRO */

while(1);

}