树莓派 使用 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')
    

说明

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

写在最后

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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
FM33LG048是一款基于ARM Cortex-M0内核的微控制器,支持I2C总线通讯协议,而1602A是一款常用的16x2字符液晶显示屏,其控制芯片通常是HD44780或兼容芯片。 以下是使用FM33LG048驱动1602A的步骤: 1. 确定1602A的I2C地址:1602A通过I2C总线与FM33LG048进行通讯,需要先确定1602A的I2C地址。通常情况下,1602A的I2C地址为0x27或0x3F,具体请参考1602A的数据手册。 2. 配置I2C总线:在FM33LG048上配置I2C总线,设置I2C时钟频率、发送和接收缓存等参数。配置完毕后,可通过I2C总线向1602A发送指令或数据。 3. 发送指令或数据:通过I2C总线向1602A发送指令或数据,例如设置光标位置、显示字符等。1602A的指令和数据格式请参考其数据手册。 以下是一段示例代码,演示了如何在FM33LG048上使用I2C驱动1602A: ```c #include "fm33xx.h" #define I2C_ADDR 0x27 void delay_us(uint32_t us) { uint32_t i; for(i=0; i<us*4; i++); } void I2C_Init(void) { /* 配置GPIO口为I2C模式 */ GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_20MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); /* 配置I2C总线 */ I2C_InitTypeDef I2C_InitStruct = {0}; I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; I2C_InitStruct.I2C_ClockSpeed = 400000; /* I2C时钟频率为400kHz */ I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStruct.I2C_OwnAddress = 0x00; I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; I2C_Init(I2C0, &I2C_InitStruct); /* 使能I2C总线 */ I2C_Cmd(I2C0, ENABLE); } void I2C_WriteByte(uint8_t addr, uint8_t data) { /* 等待I2C总线空闲 */ while(I2C_GetFlagStatus(I2C0, I2C_FLAG_BUSBUSY)); /* 发送START信号 */ I2C_GenerateSTART(I2C0, ENABLE); /* 等待START信号发送完成 */ while(!I2C_GetFlagStatus(I2C0, I2C_FLAG_SBSEND)); /* 发送从设备地址 */ I2C_Send7bitAddress(I2C0, addr, I2C_Direction_Transmitter); /* 等待从设备地址发送完成 */ while(!I2C_GetFlagStatus(I2C0, I2C_FLAG_ADDSEND)); I2C_ClearFlag(I2C0, I2C_FLAG_ADDSEND); /* 发送数据 */ I2C_SendData(I2C0, data); /* 等待数据发送完成 */ while(!I2C_GetFlagStatus(I2C0, I2C_FLAG_TBE)); /* 发送STOP信号 */ I2C_GenerateSTOP(I2C0, ENABLE); delay_us(5); /* 延时一段时间 */ } void LCD_Init(void) { /* 发送初始化指令 */ I2C_WriteByte(I2C_ADDR, 0x38); /* 8位数据总线,2行显示,5x8点阵字符 */ I2C_WriteByte(I2C_ADDR, 0x08); /* 关闭显示 */ I2C_WriteByte(I2C_ADDR, 0x01); /* 清屏 */ I2C_WriteByte(I2C_ADDR, 0x06); /* 光标右移,不移动显示 */ I2C_WriteByte(I2C_ADDR, 0x0C); /* 开启显示,关闭光标 */ } void LCD_WriteChar(uint8_t ch) { I2C_WriteByte(I2C_ADDR, ch); } void LCD_WriteString(uint8_t *str) { while(*str) { LCD_WriteChar(*str++); } } int main(void) { SystemInit(); I2C_Init(); LCD_Init(); LCD_WriteString("Hello, World!"); while(1); } ``` 此示例代码只是简单地演示了如何使用FM33LG048驱动1602A,实际应用中还需要根据具体情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代码绘世界

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

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

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

打赏作者

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

抵扣说明:

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

余额充值