(七)树莓派系列教程:树莓派4B连接LCD1602液晶显示屏并且显示内容_raspberry pi 4b 连lcd 16×2 display

181 阅读4分钟

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。 img img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

raspi-config ; 进入树莓派设置界面

Interfacing Options ; 设置 P5 I2C ; 选择I2C选项 enable ; 启动I2C功能


* 下载对应缺的包,例如:



sudo apt-get install i2c-tools sudo apt-get update sudo apt-get install python3-smbus


* 设置好了,重启一次树莓派。


#### 三、连线


![在这里插入图片描述](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/277ad9d365ec465088e426342c3b558e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771919770&x-signature=3XFeZU6vueUkr%2FH50B6rm%2FVceiI%3D)


* 树莓派-------液晶显示屏
* VCC----------3.3V
* GND-----------地
* SDA----------SDA
* SCL-----------SCL


##### 四、代码


方案一:(一个LCD602程序—LCD1602.py)



''' 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')


方案二:(两个python程序:1.LCD1602驱动程序,2.调用驱动程序)



#### 程序1—LCD1602.py(LCD主控制程序):



import LCD1602 as LCD import time

LCD.init_lcd() time.sleep(2) LCD.print_lcd(0,0,'start')


#### 程序2—LCD1602.py(LCD驱动程序1):



import time import smbus import logx import logging BUS = smbus.SMBus(1) LCD_ADDR = 0x27 BLEN = 1 #turn on/off background light

def turn_light(key): global BLEN BLEN = key if key ==1 : BUS.write_byte(LCD_ADDR ,0x08) logging.info('LCD executed turn on BLight') else: BUS.write_byte(LCD_ADDR ,0x00) logging.info('LCD executed turn off BLight')

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

def send_command(comm): # Send bit7-4 firstly buf = comm & 0xF0 buf |= 0x04 # RS = 0, RW = 0, EN = 1 write_word(LCD_ADDR ,buf) time.sleep(0.002) buf &= 0xFB # Make EN = 0 write_word(LCD_ADDR ,buf)

# Send bit3-0 secondly
buf = (comm & 0x0F) << 4
buf |= 0x04               # RS = 0, RW = 0, EN = 1
write\_word(LCD\_ADDR ,buf)
time.sleep(0.002)
buf &= 0xFB               # Make EN = 0
write\_word(LCD\_ADDR ,buf)

def send_data(data): # Send bit7-4 firstly buf = data & 0xF0 buf |= 0x05 # RS = 1, RW = 0, EN = 1 write_word(LCD_ADDR ,buf) time.sleep(0.002) buf &= 0xFB # Make EN = 0 write_word(LCD_ADDR ,buf)

# Send bit3-0 secondly
buf = (data & 0x0F) << 4
buf |= 0x05               # RS = 1, RW = 0, EN = 1
write\_word(LCD\_ADDR ,buf)
time.sleep(0.002)
buf &= 0xFB               # Make EN = 0
write\_word(LCD\_ADDR ,buf)

def init_lcd(): try: send_command(0x33) # Must initialize to 8-line mode at first time.sleep(0.005) send_command(0x32) # Then initialize to 4-line mode time.sleep(0.005) send_command(0x28) # 2 Lines & 5*7 dots time.sleep(0.005)

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取