小编今天重温一下LCD1602液晶显示的内容,做了个8总线方式显示一串字符“ First Try ”的实验
仿真图如下:
代码如下:
LCD1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include <reg52.h>
//重定义关键字
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
/**********************************
PIN口定义
**********************************/
#define Lcd1602DataPin P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c); //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/
void LcdWriteData(uchar dat) ;
/*LCD1602初始化子程序*/
void Lcd1602Init();
#endif
LCD1602.c
#include "lcd1602.h"
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数
* 输 入 : c
* 输 出 : 无
*******************************************************************************/
void Lcd1602_Delay1ms(uint c){//延时函数
uchar a,b;
for (; c>0; c--){
for (b=199;b>0;b--){
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; /*选择发送命令*/
LCD1602_RW = 0; //选择写入
Lcd1602DataPin = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //根据写数据时序图,拉高写入时序(数据)
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0; //再拉低数据写完了,释放
}
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; /*选择输入数据*/
LCD1602_RW = 0; //选择写入
Lcd1602DataPin = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : Lcd1602Init()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Lcd1602Init() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示,设置为8总线,2行显示,5*7点阵,这是“功能设定指令”
LcdWriteCom(0x0c); //开显示不显示光标,“显示开关控制指令”
LcdWriteCom(0x06); //写一个指针加1,“进入模式设置指令”
LcdWriteCom(0x01); //清屏,“清屏指令”
LcdWriteCom(0x80); //设置数据指针起点,第一个字符是在0x00,位置,但写入的数据地址格式必须是0x**+0x80,因此在这提前加地址加一个0x80;这里不写也行但必须在main函数中调用前将数据要写入的地址+0x80
}
main.c
#include <reg52.h>
#include"lcd1602.h"
#define uint unsigned int
#define uchar unsigned char
uchar DisplayData[]=" First Try "; //定义要显示的字符串,空格也算一个字符
void main(void){
uchar i;
Lcd1602Init(); //调用LCD1602的初始化函数,初始化函数中用到了写命令函数的调用
for(i=0;i<11;i++){ //循环调用LCD1602写数据函数,分别写入字符
LcdWriteData(DisplayData[i]);
}
while(1); //死循环在这儿,这样数据就能一直静态显示:因为数据输入LCD1602后会一直存放在DDRAM中,直至改变
}
实验结果:
总结使用LCD1602的方法:
1、先进行LCD1602的初始化,即初始化函数Lcd1602Init();
需要初始化的内容有
(1):(2):
(3):
(4):
初始化时必须对这些进行设定,通过自己编写的写命令函数将这些功能命令字节写入LCD1602中
在我们的程序中我们还将光标的位置进行了设置,也就是数据在哪个点阵开始显示的。当然了你可以不在初始化中写确定显示地址命令,在mian.c文件中显示之前确定显示地址即可。
(5):确定显示地址命令:
2、初始化完后,就可以通过自己写的写数据函数,向LCD的DDRAM写入要显示的字符了。
问题:
1、都是写入数据,都是写入一个字节,为啥要整一个写命令函数“”和“写数据函数”呢?
答:原因就在于写命令和写数据时对LCD1602_RS引脚的高低电平要求不一样。
写命令:LCD1602_RS=0;
写数据:LCD1602_RS=1;
因此要分开写两个函数实现功能。
2、确定显示的地址,为什么在地址+0x80
答:上图(5)写入显示地址命令的固定格式:0x80+显示地址
3、写时序:
4、怎么单独显示一个字符
uchar dat=1;
dat=dat+0x30;
LcdWriteData(dat);//这样就可以了,ASCII码的形式
5、怎么在第二行显示
//实现在第二行显示:
LcdWriteCom(0x40+0x80); //通过写命令函数,先重新确认光标的位置
for(i=0;i<11;i++){ //再循环调用LCD1602写数据函数,分别写入字符
LcdWriteData(DisplayData[i]);
}
5、LCD1602的RAM地址映射
结束语:静心的去学习,才能有收获,哪有什么一蹴而就的成功。