51单片机通过DHT11温度传感器读取温度(2)


一.LCD1602的使用

1.概念:LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)

2.引脚定义

具体说明

(1)VSS:模块供电电源地

(2)VDD:模块供电电源的正极

(3)RS:数据/命令选择,当处于高电平时选择数据寄存器,当处于低电平时选择指令寄存器。RS 为低电平 R/W 为高电平时可以读忙信号,当RS 为高电平 R/W 为低电平时可以写入数据。

(4)R/W:读写选择,当处于高电平时进行读操作,当处于低电平时进行写操作

(4)E:使能信号,当电平由高电平变成低电平时,开始执行指令

(5)D:数据,D0-D7是数据位

3.显示方法

由图可以知道,如果要第二行第一列显示,则只需要写入40H,但是这样是不行的,因为写入显示地址时要求最高位 D7 恒定为高电平 1,所以需要加上80H,则最后的结果为40H+80H=C0H

显示内容与对应的位数

4.时序图

(1)读时序

(2)写时序

(3)时序时间

二.LCD1602的时序分析

1.写指令

由条件可以知道RS = 0;由时序图可以看到R/W = 0处于低电平,同时E = 0,并延时TR的时间长度,过后进行数据建立连接,然后将E端电平拉高,同时延迟Tpw的时间,之后欧E端电平被拉低,并延迟THD1的时间

2.写数据

由条件可以知道RS = 1;由时序图可以看到R/W = 0处于低电平,同时E = 0,并延时TR的时间长度,过后进行数据建立连接,然后将E端电平拉高,同时延迟Tpw的时间,之后欧E端电平被拉低,并延迟THD1的时间

三.LCD1602程序代码实现

编程实现要求,要求实现写数据,写指令与读忙碌

#include 
#include "intrins.h"
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
#define data_buffer    P0
/*
用于读取LCD1602的忙碌状态
*/
void check_lcd_busy()
{
    char tep = 0x80;
    data_buffer = 0x80;
    while(tep & 0x80)
    {
    RS = 0;
    RW = 1;
    E = 0;
    _nop_();
    E = 1;
    _nop_();
    tep = data_buffer;
    }
}
void lcd_write_cmd(char cmd)
{
    check_lcd_busy();
    RS = 0;
    RW = 0;
    E = 0;
    data_buffer = cmd;
    _nop_();
    E = 1;
    _nop_();
    E = 0;
    _nop_();
}
void lcd_write_data(char datashow)
{
    check_lcd_busy();
    RS = 1;
    RW = 0;
    E = 0;
    data_buffer = datashow;
    _nop_();
    E = 1;
    _nop_();
    E = 0;
    _nop_();
}