• 物联网AI MicroPython传感器学习 之 LCD1602液晶屏


    学物联网,来万物简单IoT物联网!!在这里插入图片描述

    一、产品简介

    LCD1602 字符型液晶显示模块是专门用于显示字母、数字、符号等的点阵型液晶显示模块。分4位和8位数据传输方式。提供5x7点阵+游标的显示模式。提供显示数据缓冲区 DDRAM、字符发生器CGROM和字符发生器CGRAM,可以使用CGRAM来存储自己定义的最多8个5x8点阵的图形字符的字模数据。提供了丰富的指令设置:清显示;游标回原点;显示开/关;游标开/关;显示字符闪烁;游标移位;显示移位等。提供内部上电自动复位电路,当外加电源电压超过+4.5V时,自动对模块进行初始化操作,将模块设置为默认的显示工作状态。
    image.png
    引脚定义:

    • VSS:电源地
    • VDD:电源+5V
    • VO:液晶显示偏压,接电位计VO
    • RS:数据/命令选择
    • RW:读/写选择
    • E:使能信号,用于数据传输
    • D0-D3:数据,暂未用
    • D4-D7:数据,接入 GPIO
    • A:背光源正极,接电源+5V
    • S:背光源负极,接电源地

    二、技术参数

    • 显示容量:16×2个字符
    • 芯片工作电压:4.5—5.5V
    • 工作电流:2.0mA(5.0V)
    • 模块最佳工作电压:5.0V
    • 字符尺寸:2.95×4.35(W×H)mm

    三、软件接口

    LCD1602() - 创建 LCD1602 驱动对象

    • 函数原型:

    lcd1602Obj = LCD1602(RS, RW, E, D4, D5, D6, D7)

    • 参数说明:
    参数类型必选参数?说明
    RSGPIO传入GPIO对象
    RWGPIO传入GPIO对象
    EGPIO传入GPIO对象
    D4GPIO传入GPIO对象
    D5GPIO传入GPIO对象
    D6GPIO传入GPIO对象
    D7GPIO传入GPIO对象
    • 返回值:
      LCD1602 对象成功,返回 LCD1602 对象;LCD1602 对象创建失败,抛出 Exception
    • 示例代码:
    from machine import Pin
    import lcd1602
    
    # 初始化 LCD 的各个 GPIO 管脚
    print('GPIO init begin')
    # 按照 board.json 中名为 "RS" 的设备节点的配置参数,如下以此类推
    gpioRSObj = Pin(2,Pin.OUT)
    gpioRWObj = Pin(4,Pin.OUT)
    gpioEObj = Pin(16,Pin.OUT)
    gpioD4Obj = Pin(17,Pin.OUT)
    gpioD5Obj = Pin(18,Pin.OUT)
    gpioD6Obj = Pin(19,Pin.OUT)
    gpioD7Obj = Pin(21,Pin.OUT)
    
    print('GPIO init done')
    
    lcd1602Obj = lcd1602.LCD1602(gpioRSObj, gpioRWObj, gpioEObj, gpioD5Obj, gpioD5Obj, gpioD5Obj, gpioD5Obj)
    print('LCD inited!')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 输出:
    GPIO init begin
    GPIO init done
    LCD inited!
    
    • 1
    • 2
    • 3

    displayString(row, col, text) - 向 LCD 屏幕指定行列打印字符

    • 函数功能:
      先设置光标到指定行列偏移位置,然后打印字符,其中行列偏移为字符偏移而非点阵偏移,共2行16列
    • 函数原型:

    drv.displayString(1, 0, ‘Hello’)

    • 参数说明:
      • row 表示行偏移,范围是 0-1 表示 行1-行2
      • col 表示列偏移,范围是 0-15 表示 列1-列16
      • text 待打印的字符串
    • 返回值:
      成功打印的字符数量
    • 示例:
    # 在第二行,第一列打印字符 Hello
    from machine import Pin
    import lcd1602
    
    # 初始化 LCD 的各个 GPIO 管脚
    print('GPIO init begin')
    # 按照 board.json 中名为 "RS" 的设备节点的配置参数,如下以此类推
    gpioRSObj = Pin(2,Pin.OUT)
    gpioRWObj = Pin(4,Pin.OUT)
    gpioEObj = Pin(16,Pin.OUT)
    gpioD4Obj = Pin(17,Pin.OUT)
    gpioD5Obj = Pin(18,Pin.OUT)
    gpioD6Obj = Pin(19,Pin.OUT)
    gpioD7Obj = Pin(21,Pin.OUT)
    
    print('GPIO init done')
    
    lcd1602Obj = lcd1602.LCD1602(gpioRSObj, gpioRWObj, gpioEObj, gpioD5Obj, gpioD5Obj, gpioD5Obj, gpioD5Obj)
    print('LCD inited!')
    lcd1602Obj.displayString(1, 0, 'Hello')
    print('LCD printed')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 输出:
    GPIO init begin
    GPIO init done
    LCD inited!
    LCD printed
    
    • 1
    • 2
    • 3
    • 4

    四、接口案例

    • 代码:
    # Python代码
    from machine import Pin
    import lcd1602
    
    if __name__ == '__main__':
        # 初始化 LCD 的各个 GPIO 管脚
    print('GPIO init begin')
    # 按照 board.json 中名为 "RS" 的设备节点的配置参数,如下以此类推
    gpioRSObj = Pin(2,Pin.OUT)
    gpioRWObj = Pin(4,Pin.OUT)
    gpioEObj = Pin(16,Pin.OUT)
    gpioD4Obj = Pin(17,Pin.OUT)
    gpioD5Obj = Pin(18,Pin.OUT)
    gpioD6Obj = Pin(19,Pin.OUT)
    gpioD7Obj = Pin(21,Pin.OUT)
    
    print('GPIO init done')
    
    lcd1602Obj = lcd1602.LCD1602(gpioRSObj, gpioRWObj, gpioEObj, gpioD5Obj, gpioD5Obj, gpioD5Obj, gpioD5Obj)
    print('LCD inited!')
    lcd1602Obj.displayString(1, 0, 'Hello')
    print('LCD printed')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 输出:
    ...
    GPIO init begin
    GPIO init done
    LCD inited!
    LCD printed
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    五、通信协议

    主控芯片和 LCD1602 控制器之间通信为 GPIO 通讯,分为初始化阶段以及指令通讯阶段。

    • 初始化阶段
      • 通过三次发送 0x03,向 LCD 控制器发起初始化请求,每次间隔不同;
      • 初始化后立即设置数据/命令传输模式为 4bits 模式;
      • 然后进行功能、显示模式、打印项模式的设置,均为指令通讯方式;

    image.png

    • 指令通讯阶段
      • 通过 RS=0,选择 LCD 控制器的指令寄存器,随后通过D4-D7发送指令内容,可实现:清显示;游标回原点;显示开/关;游标开/关;显示字符闪烁;游标移位;显示移位等。
      • 通过 RS=1,选择 LCD 控制器的数据寄存器,随后通过D4-D7发送数据内容,可实现向 LCD 屏幕打印字符的功能;

    image.png

    • 4线传输机制
      • 指令和数据每次传输均为 8bits,因此分为两次传输,每次传输4bits
      • 传输时序:
        • RS=0/1 先稳定寄存器显示选择
        • 因为目前我们仅用到写,因此 RW=0 同时保持拉低
        • 随即准备数据到 D4-D7 管脚,准备通知 LCD 读取
        • 控制 E 管脚产生下降沿,其中高电平保持需要>450ns
        • 因为 LCD 控制器获得下降沿时需要读取数据并执行指令,因此再保持一个命令执行的时间稳定,时间为 40us

    image.png

    六、工作原理

    液晶显示屏从 LCD 控制器引出 16 个管脚用于控制指令/数据输入,通过 GPIO 控制。

    • VSS 为地电源
    • VDD 接5V正电源
    • VO 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”现象,使用时可以通过一个10k欧姆的电位器调整其对比度。
    • RS 为寄存器选择脚,高电平时选择数据寄存器、低电平时选择指令寄存器。
    • RW 为读/写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或显示地址;当RS为低电平,RW为高电平时,可以读忙信号;当RS为高电平,RW为低电平时,可以写入数据。
    • E 端为使能端,当E端由高电平跳变为低电平时,液晶模块读取 D0-D7 数据执行命令。
    • D0-D7 为8位双向数据线。
    • A 背光源正极。
    • K 背光源负极。

    参考文献及购买链接

    [1] LCD1602电气手册
    [2] LCD1602系列
    [3] LCD1602商品购买链接

  • 相关阅读:
    day09-计算机网络参考模型
    tips: r语言排列组合给定vector的特定元素
    辅助驾驶功能开发-功能对标篇(13)-NOA领航辅助系统-长安
    Java项目:家政服务系统(java+JSP+jquery+Servlet+Mysql)
    [计算机入门] 设置日期和时间
    explain的执行结果:Impossible WHERE
    Reactor反应器模式
    机器学习笔记之马尔可夫链蒙特卡洛方法(四)吉布斯采样
    【Linux】进程(6):环境变量
    视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet
  • 原文地址:https://blog.csdn.net/weixin_39363464/article/details/134083707