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

2019-07-14 03:37发布

本文的主要内容目录: 一、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] != '