本文的主要内容目录:
一、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);
}
上一篇:51定时器初始化步骤
下一篇:51单片机三线串行驱动12864液晶
推荐阅读最新更新时间:2024-03-16 16:10
设计资源 培训 开发板 精华推荐
- TE推出具有M12连接的工业以太网交换机,符合EN50155标准
- TE Buchanan接线端子,Heilind有售
- 罗姆推出专为智能电表优化的新型多频段无线通信LSI
- 一图看懂新能源汽车动力蓄电池回收服务网点建设和运营指南
- Phillips-Medisize 赢得合同, 将生产电子功能组合给药设备
- 松下发布了一款智能LED灯泡:支持语音控制价格尚未公布
- vivo Y73s 5G发布售价1998元:中端系列又添新成员
- 郭明錤:6.1英寸的 iPhone 12 将是新 iPhone 最受欢迎型号
- 苹果iPhone 12 5G频段不确定 引发英电信行业担忧
- 庆排灯节,印度用户买苹果iPhone 11送AirPods