You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Raspberry Pi 5使用smbus2控制LCD1602故障排查求助

Raspberry Pi 5 通过smbus2库控制LCD1602故障排查

初始代码

try:
    import smbus2
    LCD = smbus2.SMBus(1)
    address = 0x27
    IR = 0
    DR = 1
    ASCII_WORD = "HELLO"

    LCD.write_byte_data(address, IR, 0x80, force=None) #set the cursor at the beginning of line 1

    for char in ASCII_WORD:
        LCD.write_byte_data(address, IR, 0x10, force=None) #set the cursor 1 column left
        for bit in range(8):
            LCD.write_byte_data(address, DR, ord(char) >> (7 - bit), force=None)#write ASCII character
except KeyboardInterrupt:
    LCD.write_byte_data(address, IR, 0x01, force=None)#clear display
    LCD.close()

注:数据位取值参考16x2 LCD引脚图资料

代码逻辑

  • 设置光标位置
  • 写入目标字符的ASCII值

初始问题

运行代码后出现异常:光标位于第二行第5列,第一行第二列显示≣符号。推测for bit in range(8):循环多余,因为smbus2库会自动将十进制值转二进制逐位发送(若理解有误请指正),该循环可能导致ASCII码重复发送。

第一次调试后代码

try:
    import time
    import smbus2
    LCD = smbus2.SMBus(1)
    address = 0x27
    IR = 0
    DR = 1
    ASCII_WORD = "HELLO"

    LCD.write_byte_data(address, IR, 0x80, force=None) #set the cursor at the beginning of line 1
    for char in ASCII_WORD:
        LCD.write_byte_data(address, IR, 0x10, force=None) #set the cursor 1 column left
            LCD.write_byte_data(address, DR, ord(char) >> (7 - bit), force=None)#write ASCII character
except KeyboardInterrupt:
    LCD.write_byte_data(address, IR, 0x01, force=None)#clear display
    LCD.close()

注:代码存在缩进错误,内部write语句未正确对齐

新问题

运行此代码后,LCD背光完全熄灭(电源LED仍保持亮起)。

调试过程

  • 移除except块,背光仍熄灭;
  • 单独执行每条LCD.write_byte_data()语句,发现每条都会导致背光熄灭;
  • 发现代码保留了>> (7 - bit),移除后修改代码如下:

第二次修改后代码

try:
    import time
    import smbus2
    LCD = smbus2.SMBus(1)
    address = 0x27
    IR = 0
    DR = 1
    ASCII_WORD = "HELLO"

    LCD.write_byte_data(address, IR, 0x80, force=None) #set the cursor at the beginning of line 1
    for char in ASCII_WORD:
        LCD.write_byte_data(address, IR, 0x10, force=None) #set the cursor 1 column left
            LCD.write_byte_data(address, DR, ord(char), force=None)#write ASCII character
except KeyboardInterrupt:
    LCD.write_byte_data(address, IR, 0x01, force=None)#clear display
    LCD.close()

注:代码仍存在缩进错误

最新问题

  • 运行此代码后,LCD屏幕保持开机时的蓝色背景无任何变化;
  • 重新运行最初的代码,结果变为直接熄灭屏幕,而非之前的异常显示。

恳请帮忙排查这些问题,尤其是LCD为何会熄灭或无任何变化,非常感谢!


内容的提问来源于stack exchange,提问作者Matthew Moller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:02:02