【蓝桥杯】单片机学习(8)——1602液晶

1、LCD1602引脚说明

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号的点阵型液晶模块。主要技术参数如下:
1602主要技术参数
由若干个5x7或者5x10的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因如此,它不能很好的显示图片。外形如下图:
LCD1602外观图
1602液晶引脚图功能如下:
LCD1602引脚图

  • 3引脚 VL :液晶显示偏压信号。用来调整显示的黑点和不显示黑点之间的对比度,调整合适的对比度,可以使显示更加清晰。
  • 4引脚 RS :数据命令选择端。用来判断接收到的是命令还是数据。高电平的时候是数据;低电平的时候是命令。
  • 5引脚 R/W :读写功能选择端。通过这个引脚判断是给液晶写入数据(命令)还是读取液晶内部的数据(命令)。液晶本身具有RAM,所以送给液晶的命令或者数据首先保存在液晶的缓存里,然后再写到内部的寄存器或者RAM中,这个过程需要一定的时间,所以在读写操作之前,需要先读一下液晶的当前状态,如果是在忙,就需要继续等待,如果不忙,可以进行读写数据。读状态常用,读液晶内的数据并不常用。
  • 6引脚 E :使能信号。读状态(数据)时,高电平有效;写状态(数据)时,高脉冲有效。

2、LCD1602的读写时序介绍

(1)RAM地址映射图

1602液晶内部带了80个字节的显示RAM,用来存储发送的数据,结构图如下:
RAM地址映射图每一行有40个字节地址,但只能显示前16个字节,后面的地址主要为显示移动字幕设置。1602字符液晶是显示字符的,与ASCII字符表对应。比如给地址0x00写入97(十进制)。液晶的最左上方小块就会显示一个字母a。液晶内部有一个数据指针,它指向哪里,我们写的数据就被送到哪个地址里面。

(2)状态字说明

液晶内部有一个状态字字节,通过读取这个状态字的内容来了解1602液晶的内部情况,如下:
1602状态字每次进行读写操作之前都要进行读写检测,最高位为1,则表示液晶正忙,不可以进行读写操作,如果是0,则可以进行读写。低7位代表当前数据指针的位置。

(3)1602液晶读写时序

  • 读状态

RS = L,R/W = H , E = H

对应代码如下:

LCD1602_DB = 0xFF;//读外部状态前,保证自己是高电平
LCD1602_RS = 0;//低电平,接收的是命令
LCD1602_RW = 1;//高电平,读取液晶内部数据
do{
	LCD1602_E = 1;//高电平,使能端有效
	sta = LCD1602_DB;//读取状态字
	LCD1602_E = 0;//读完撤销功能,防止液晶输出干扰P0总线
	}while(sta & 0x80);
	//bit7 = 1表示液晶正忙,重复检测直到其等于0
LCD1602_E = 1;

注意:①单片机读外部状态前,必须保证自己是高电平 ②读状态之前,要先检测液晶是否处于忙状态,只有bit7 = 0时,才能进行读写状态(数据)。 ③读写完后,要通过语句 LCD1602_E = 0 释放P0总线,以免干扰其他外设。

  • 读数据:(不常用,不做解释)

RS = H,R/W = H , E = H

  • 写指令

RS = L,R/W = L ,D0~D7 = 指令码, E = 高脉冲

写指令之前,E引脚是低电平。通过前三句准备好数据之后,E使能引脚从低电平到高电平变化,然后E引脚再从高电平到低电平变化,出现一个下降沿,并且检测到 RS = L,R/W = L,就立刻读取D0~D7的数据,完成单片机写1602指令过程。

  • 写数据:(类似于写指令)

RS = H,R/W = L ,D0~D7 = 数据, E = 高脉冲

(4)读写时序图

  • 读操作时序图
    读操作时序图
  • 写操作时序图
    写操作时序图
  • 时序参数
    时序参数

3、1602液晶的指令介绍

(1)显示模式设置(固定的0x38)
在这里插入图片描述(2)显示开/关以及光标设置指令
在这里插入图片描述(3)清屏指令(固定0x01)
写入0x01表示数据指针清零,所有的显示都请零;写入0x02仅仅是数据指针清零,显示不清零。
在这里插入图片描述(4)RAM地址设置指令
在这里插入图片描述该指令码的最高位为1,低7位为RAM的地址。

4、简单实例

以普中科技开发板为例,原理图如下:
原理图

实验现象:两行分别显示 Less interests . More interest.
在这里插入图片描述
首先进行位说明:

#define Lcd1602_DB P0

sbit Lcd1602_RW = P2^5; //读写控制端
sbit Lcd1602_RS = P2^6; //数据命令选择端
sbit Lcd1602_E = P2^7;  // 使能信号

接着要说一下用到的函数:

void LcdWaitReady();//读状态
void LcdWriteCmd(u8 cmd);//写命令
void LcdWriteDat(u8 dat);//写数据
void LcdSetCursor(u8 x,u8 y);//设置RAM地址,(x,y)为坐标
void InitLcd1602();//液晶初始化
void LcdShowStr(u8 x,u8 y,u8 *str);//显示字符串,(x,y)为坐标

完整代码如下:

#include"reg52.h"

#define Lcd1602_DB P0

sbit Lcd1602_RW = P2^5; //读写控制端
sbit Lcd1602_RS = P2^6; //数据命令选择端
sbit Lcd1602_E = P2^7;  // 使能信号

typedef unsigned char u8;
typedef unsigned int u16;

void InitLcd1602();
void LcdShowStr(u8 x,u8 y,u8 *str);

void main()     
{
    u8 str1[] = "Less interests";  //定义字符串
    u8 str2[] = "More interest";

    InitLcd1602();

    LcdShowStr(0,0,str1);
    LcdShowStr(0,1,str2);

    while (1);
}

//读状态,忙位检测
void LcdWaitReady() 
{
    u8 sta;

    Lcd1602_DB = 0xFF;//单片机读之前,必须保证内部是高电平
    Lcd1602_RW = 1;//读
    Lcd1602_RS = 0;//状态
    do{
        Lcd1602_E = 1;    //使能信号有效
        sta = Lcd1602_DB; //读取状态字
        Lcd1602_E = 0;    //使能信号无效,释放P0总线
    } while(sta & 0x80);  //bit7表示液晶正忙,重复检测直到其为0
}


//写指令,cmd为待写入命令值
void LcdWriteCmd(u8 cmd) 
{
    LcdWaitReady();
    Lcd1602_RW = 0;  //写
    Lcd1602_RS = 0;  //指令
    Lcd1602_DB = cmd;
    Lcd1602_E = 1; //使能信号E = 高脉冲
    Lcd1602_E = 0;
}

//写数据
void LcdWriteDat(u8 dat)
{
    LcdWaitReady();
    Lcd1602_RW = 0;  //写
    Lcd1602_RS = 1;  //数据
    Lcd1602_DB = dat;
    Lcd1602_E = 1; //使能信号E = 高脉冲
    Lcd1602_E = 0;
}

//初始化1602液晶
void InitLcd1602()
{
    LcdWriteCmd(0x38); //16*2显示,5*7矩阵,8位数据接口 
    LcdWriteCmd(0x0C); //显示器开,光标关闭 
    LcdWriteCmd(0x06); //文字不动,地址加1 
    LcdWriteCmd(0x01); //清屏
}

//设置显示RAM起始地址,即光标位置,(x,y)为对应屏幕上的字符坐标
void LcdSetCursor(u8 x,u8 y)
{
    u8 addr;
    if(y == 0)               //由输入的屏幕坐标计算显示RAM的地址
        addr = 0x00 + x;     //第一行字符地址从0x00开始
    else 
        addr = 0x40 + x;     // 第二行字符地址从0x40开始
    LcdWriteCmd(addr|0x80);  //设置RAM地址
}


//在液晶上显示字符串,(x,y)为对应屏幕上的起始坐标,str为字符串指针
void LcdShowStr(u8 x,u8 y,u8 *str)
{
    LcdSetCursor(x,y);       //设置初始地址
    while(*str != '\0')      //连续写入字符串数据,直到检测都结束符
    {
        LcdWriteDat(*str++); //先取str指向的数据,然后str自加1
    }
}

前一篇: 单片机学习(7)——UART串口通信

下一篇: 单片机学习(9)——多.c文件初认识及计算器实例

  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
数码管是一种常见的数字显示器件,可以用于显示各种数字、字母等字符。在单片机应用中,数码管通常用于显示计数器、计时器、温度、湿度等实时数据。 数码管的种类有很多,包括共阳数码管、共阴数码管、共阳共阴混合数码管等。其中,共阳数码管是最常见的一种,也是本文所涉及的数码管类型。 单片机控制数码管的原理是通过对数码管的各个管脚进行控制,使其显示相应的数字或字符。数码管的控制方式有两种,即静态显示和动态显示。 静态显示是指将要显示的数字或字符的每一位分别输出到数码管的每个管脚上,然后使其保持不变,从而实现显示效果。静态显示的缺点是需要使用大量的I/O口,且不能灵活地改变显示内容。 动态显示是指将要显示的数字或字符的每一位依次输出到数码管的每个管脚上,并在短时间内快速切换下一个数字或字符,从而形成连续的显示效果。动态显示的优点是可以使用较少的I/O口,且可以灵活地改变显示内容。 以下是一个简单的动态显示数码管的实现示例: 1. 定义数码管的引脚 ```c #define DIG_PORT P2 // 数码管位选端口 #define DIG_COM 0x00 // 数码管位选端口初始值 #define LED_PORT P0 // 数码管段选端口 ``` 2. 定义数码管显示的数字或字符 ```c unsigned char code ledChar[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; ``` 3. 实现数码管动态显示函数 ```c void display(unsigned char i) { unsigned char j, k; for (j = 0; j < 8; j++) { DIG_PORT = DIG_COM | (1 << j); // 选择数码管位(从左到右) for (k = 0; k < 100; k++); // 延时,视情况可调整 LED_PORT = ledChar[i]; // 显示数码管上的数字或字符 } } ``` 4. 调用数码管动态显示函数 ```c int main() { unsigned char i = 0; while (1) { display(i % 10); // 显示数字 i 的个位数 i++; } return 0; } ``` 以上就是一个简单的数码管动态显示的实现示例。需要注意的是,数码管的控制方式和具体实现方法可能因不同的硬件平台和编程语言而有所不同。因此,在具体应用中需要根据实际情况进行适当的调整和修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值