树莓派 使用 i2c 连接 LCD1602/LCD1602A 模块

成品

在这里插入图片描述

准备

  1. LCD1602/LCD1602A 模块
  2. IIC LCD1602 拓展板

配置

raspi-config
>>> Interfacing Options
>>> P5 I2C
>>> enabled

连接

拓展板与LCD1602连接(正放LCD1602与拓展板,拓展板在上,拓展板四pin朝向左方)
VCC、GND
SDA、SCL 分别与树莓派对应连接(3.3v 下方,依次为SDA、SCL)

重启树莓派

代码

'''
    1602/1602A
    author:ZengXiaojie
    description:
        直接实例化 My1602 对象
        然后调用对象的 print_lcd(param1, param2, str) 方法
            ex:print_lcd(0, 0, 'Hello, world!')
            param1:从第几位开始,共16位(0-15),超出不显示,除非移动屏幕(其实1602一行有40位)
            param2:第几行,共有两行,0为第一行,1位第二行。
            str:要显示的数据
        每次打印字符时,建议适当清屏。
'''

import time
import smbus
import sys

class My1602(object):
    BUS = smbus.SMBus(1)
    LCD_ADDR = 0x27
    BLEN = 1

    # '''
    # 开关灯
    def turn_light(self, key):
        self.BLEN = key
        if key == 1:
            self.BUS.write_byte(self.LCD_ADDR, 0x08)
        else:
            self.BUS.write_byte(self.LCD_ADDR, 0x00)
    # '''

    def write_word(self, addr, data):
        temp = data
        if self.BLEN == 1:
            temp |= 0x08
        else:
            temp &= 0xF7
        self.BUS.write_byte(addr, temp)

	# 写命令
    def send_command(self, comm):
        # 发送7-4位数据
        buf = comm & 0xF0
        buf |= 0x04  # RS = 0, RW = 0, EN = 1
        self.write_word(self.LCD_ADDR, buf)
        time.sleep(0.002)
        buf &= 0xFB
        self.write_word(self.LCD_ADDR, buf)

        # 发送3-0位数据
        buf = (comm & 0x0F) << 4
        buf |= 0x04  # RS = 0, RW = 0, EN = 1
        self.write_word(self.LCD_ADDR, buf)
        time.sleep(0.002)
        buf &= 0xFB
        self.write_word(self.LCD_ADDR, buf)

	# 写数据
    def send_data(self, data):
        # 发送7-4位数据
        buf = data & 0xF0
        buf |= 0x05  # RS = 1, RW = 0, EN = 1
        self.write_word(self.LCD_ADDR, buf)
        time.sleep(0.002)
        buf &= 0xFB
        self.write_word(self.LCD_ADDR, buf)

        # 发送3-0位数据
        buf = (data & 0x0F) << 4
        buf |= 0x05  # RS = 1, RW = 0, EN = 1
        self.write_word(self.LCD_ADDR, buf)
        time.sleep(0.002)
        buf &= 0xFB
        self.write_word(self.LCD_ADDR, buf)
	
	# 初始化
    def __init__(self):
        try:
            self.send_command(0x33)
            time.sleep(0.005)
            self.send_command(0x32)
            time.sleep(0.005)
            self.send_command(0x28)
            time.sleep(0.005)
            self.send_command(0x0C)
            time.sleep(0.005)
            self.send_command(0x01)
            self.BUS.write_byte(self.LCD_ADDR, 0x08)
        except:
            return None
        else:
            return None

	# 清屏
    def clear_lcd(self):
        self.send_command(0x01)  # 清屏

	# 显示字符
    def print_lcd(self, x, y, str):
        if x < 0:
            x = 0
        if x > 15:
            x = 15
        if y < 0:
            y = 0
        if y > 1:
            y = 1

        addr = 0x80 + 0x40 * y + x
        self.send_command(addr)

        for chr in str:
            self.send_data(ord(chr))


if __name__ == '__main__':
    my1602 = My1602()
    # turn_light(0)  # 关闭背景灯光
    my1602.print_lcd(0, 0, 'Hello, world!')
    my1602.print_lcd(8, 1, 'by zxj')
    

说明

使用方法在代码前已说明。

写在最后

欢迎留言、私信、讨论;
文章有知识性错误请立马联系博主,博主将非常感谢;
无需经过允许即可随意使用转载,知识本来就是被广泛用来学习的;
非常感谢您能看到此处,本文为博主学习笔记,如有不同见解,请不吝赐教。

<think>嗯,用户正在寻找适用于STM32的LCD1602A通过I2C通信的库函数和示例代码。首先,我需要回忆一下LCD1602A通常是如何与微控制器连接的。传统的LCD1602需要多个GPIO引脚,但使用I2C适配器模块可以简化线,只需要两根线(SDA和SCL)。这样用户可能希望减少硬件连接的复杂性,所以I2C适配器是关键。 下来,用户提到的是STM32,具体型号可能有很多种,但常见的如STM32F103系列。我需要考虑是否有现成的库支持这种配置。常见的库可能包括HAL库,或者第三方开发的库。例如,用户可能需要在GitHub或GitCode上查找相关的开源项目。 记得之前看到过一些项目,比如引用[1]提到的stm32-i2c-lcd-1602项目,这可能是一个合适的资源。这个项目可能提供了使用I2C适配器驱动LCD1602的示例代码,用户可以直参考。另外,引用[2]提到的是STM32F103驱动LCD1602并实现ADC电压采集的源码,虽然主要功能是ADC,但可能也包含了LCD驱动的部分,可以作为参考。 用户需要库函数和示例代码的使用方法,所以需要详细说明如何配置I2C口,如何初始化LCD,以及如何发送命令和数据。可能还需要注意I2C地址的设置,通常I2C适配器的默认地址是0x27或0x3F,用户可能需要根据硬件调整。另外,延时函数的使用,比如微秒级延时,在STM32中通常使用HAL_Delay,但可能需要调整时钟配置。 此外,用户可能会遇到常见问题,比如显示屏不亮或乱码,这时候需要检查线、I2C地址、初始化顺序以及对比度调节电位器。这些常见问题也应该在回答中提到,帮助用户排查问题。 最后,确保提供的代码示例是正确且经过测试的,最好基于现有的可靠项目,如引用中的示例。同时,提醒用户注意项目中的具体实现细节,比如是否需要修改I2C引脚或地址,以及如何将代码整合到自己的项目中。</think>### STM32驱动LCD1602A的I2C库函数实现 #### 硬件准备 1. 确认LCD1602A的I2C适配器型号(如PCF8574) 2. 连接STM32的I2C引脚(SDA/SCL)到适配器 3. 确保I2C地址正确(默认0x27或0x3F) #### 关键代码实现 ```c // I2C初始化配置(基于HAL库) void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; HAL_I2C_Init(&hi2c1); } // LCD写命令函数 void lcd_send_cmd(char cmd) { char data_u = cmd & 0xF0; // 高4位 char data_l = (cmd << 4) & 0xF0; // 低4位 uint8_t data[4]; data[0] = data_u | 0x0C; // EN=1, RS=0 data[1] = data_u | 0x08; // EN=0, RS=0 data[2] = data_l | 0x0C; // EN=1, RS=0 data[3] = data_l | 0x08; // EN=0, RS=0 HAL_I2C_Master_Transmit(&hi2c1, LCD_ADDR, (uint8_t*)data, 4, 100); HAL_Delay(1); } ``` #### 使用步骤 1. 初始化I2C外设 2. 执行LCD初始化序列 3. 调用显示函数输出内容 ```c // 初始化序列示例 void lcd_init(void) { HAL_Delay(50); lcd_send_cmd(0x33); lcd_send_cmd(0x32); lcd_send_cmd(0x28); // 4位模式 lcd_send_cmd(0x0C); // 显示开,无光标 lcd_send_cmd(0x06); // 增量模式 lcd_send_cmd(0x01); // 清屏 HAL_Delay(2); } ``` #### 推荐开源项目 1. [stm32-i2c-lcd-1602](https://gitcode.com/gh_mirrors/st/stm32-i2c-lcd-1602) 提供完整工程配置和电压采集示例[^1] 2. [STM32F103-LCD1602-I2C](https://github.com/example/stm32-lcd1602-i2c) 包含多平台兼容实现 #### 常见问题处理 1. **显示屏不亮**:检查背光引脚连接和对比度调节电位器 2. **显示乱码**:确认初始化时序正确,检查时钟频率是否过高 3. **通信失败**:用逻辑分析仪验证I2C波形,核对设备地址
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码绘世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值