数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 4530|回复: 9

[Arduino] micropython玩ESP8266(nodemcu)I2C连接1602液晶

[复制链接]
发表于 2020-5-3 23:25:04 | 显示全部楼层 |阅读模式
一直在研究8266 iic   1602 在ESP8266(nodemcu)I2C连接1602液晶
https://www.mydigit.cn/forum.php?mod=viewthread&tid=150235
已经把ARDUIN下调通了,主要是电源问题,3.3伏下背光调不上来,看不清楚
这次是在伟大的micropython下搞的,其实是和那个一起研究的,1602点不亮就啥也玩不了,在ARDUINO 下搞定后,
今天成功在micropython下点亮IIC 1602,这样留再也不用为8266缺少引脚发愁了,快搞了一个月了,
这方面资料少,所以贡献给大家,少走弯路,翻Q真麻烦,用翻译软件硬一点点肯,micropython知道成功点亮,但程序还没搞懂
剩下的就简单了,顺便吧micropython库发来,也可以翻Q去下
micropython和ARDUINO好像不通用,没仔细研究,有懂的交流下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 2家元 +20 收起 理由
keye + 10 謝謝分享
不长叶子的树 + 10

查看全部打赏

发表于 2020-5-5 11:37:17 | 显示全部楼层
"""Implements a HD44780 character LCD connected via PCF8574 on I2C.
   This was tested with: https://www.wemos.cc/product/d1-mini.html"""

from drivers import lcd_api
from machine import I2C
from time import sleep_ms

# The PCF8574 has a jumper selectable address: 0x20 - 0x27
DEFAULT_I2C_ADDR = 0x27

# Defines shifts or masks for the various LCD line attached to the PCF8574

MASK_RS = 0x01
MASK_RW = 0x02
MASK_E = 0x04
SHIFT_BACKLIGHT = 3
SHIFT_DATA = 4


class I2c_Lcd(lcd_api.Lcd_Api):
    """Implements a HD44780 character LCD connected via PCF8574 on I2C."""

    def __init__(self, i2c, i2c_addr, num_lines, num_columns):
        self.i2c = i2c
        self.i2c_addr = i2c_addr
        self.i2c.writeto(self.i2c_addr, bytearray([0]))
        sleep_ms(20)   # Allow LCD time to powerup
        # Send reset 3 times
        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)
        sleep_ms(5)    # need to delay at least 4.1 msec
        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)
        sleep_ms(1)
        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)
        sleep_ms(1)
        # Put LCD into 4 bit mode
        self.hal_write_init_nibble(self.LCD_FUNCTION)
        sleep_ms(1)
        lcd_api.Lcd_Api.__init__(self, num_lines, num_columns)
        cmd = self.LCD_FUNCTION
        if num_lines > 1:
            cmd |= self.LCD_FUNCTION_2LINES
        self.hal_write_command(cmd)

    def hal_write_init_nibble(self, nibble):
        """Writes an initialization nibble to the LCD.
        This particular function is only used during initialization.
        """
        byte = ((nibble >> 4) & 0x0f) << SHIFT_DATA
        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytearray([byte]))

    def hal_backlight_on(self):
        """Allows the hal layer to turn the backlight on."""
        self.i2c.writeto(self.i2c_addr, bytearray([1 << SHIFT_BACKLIGHT]))

    def hal_backlight_off(self):
        """Allows the hal layer to turn the backlight off."""
        self.i2c.writeto(self.i2c_addr, bytearray([0]))

    def hal_write_command(self, cmd):
        """Writes a command to the LCD.
        Data is latched on the falling edge of E.
        """
        byte = ((self.backlight << SHIFT_BACKLIGHT) | (((cmd >> 4) & 0x0f) << SHIFT_DATA))
        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytearray([byte]))
        byte = ((self.backlight << SHIFT_BACKLIGHT) | ((cmd & 0x0f) << SHIFT_DATA))
        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytearray([byte]))
        if cmd <= 3:
            # The home and clear commands require a worst case delay of 4.1 msec
            sleep_ms(5)

    def hal_write_data(self, data):
        """Write data to the LCD."""
        byte = (MASK_RS | (self.backlight << SHIFT_BACKLIGHT) | (((data >> 4) & 0x0f) << SHIFT_DATA))
        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytearray([byte]))
        byte = (MASK_RS | (self.backlight << SHIFT_BACKLIGHT) | ((data & 0x0f) << SHIFT_DATA))
        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytearray([byte]))
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-7 08:34:34 | 显示全部楼层
lyy-cy 发表于 2020-5-5 11:37
"""Implements a HD44780 character LCD connected via PCF8574 on I2C.
   This was tested with: https:/ ...

看不懂啊,俺软件白痴,尤其C++就更看不懂了,只会点灯:sad:
你们软件好的给普及下
回复 支持 反对

使用道具 举报

发表于 2020-5-7 09:10:02 | 显示全部楼层
zxy882266 发表于 2020-5-7 08:34
看不懂啊,俺软件白痴,尤其C++就更看不懂了,只会点灯
你们软件好的给普及下 ...

那是python
不是C++
:sweat:
回复 支持 反对

使用道具 举报

发表于 2022-8-29 15:36:25 | 显示全部楼层
能不能连19264LCD屏呢?
回复 支持 反对

使用道具 举报

发表于 2022-9-5 16:40:00 | 显示全部楼层
microPython,用过几次,发现有时候程序跑飞,不知道是程序问题,还是自己的水平太差。
回复 支持 反对

使用道具 举报

发表于 2022-9-6 10:29:46 来自手机浏览器 | 显示全部楼层
液晶屏和iic转换模块的电源电压是3.3还是5v ?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-5 11:43:28 | 显示全部楼层
sii 发表于 2022-8-29 15:36
能不能连19264LCD屏呢?

可以的  得找到响应得库
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-5 11:45:04 | 显示全部楼层
广东梁百万 发表于 2022-9-6 10:29
液晶屏和iic转换模块的电源电压是3.3还是5v ?

ESP8266(nodemcu)I2C连接1602液晶 - 第2页 - 我爱单片机 数码之家  https://www.mydigit.cn/forum.php ... ;page=2#pid13147566
老看我这篇文章,里边讲的很详细了
回复 支持 反对

使用道具 举报

发表于 2022-11-5 20:37:31 | 显示全部楼层
zxy882266 发表于 2022-11-5 11:45
ESP8266(nodemcu)I2C连接1602液晶 - 第2页 - 我爱单片机 数码之家  https://www.mydigit.cn/forum.php?mo ...

我已经验证过了,那个模块接5V电源没问题。
现在遇到第二个问题:不能显示字符串,
比如  
lcd.setCursor(0,1);  
lcd.print("abc");// 显示字符串 abc

实际只能显示出a ,  不知问题出在哪里?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-9-18 13:15 , Processed in 0.140400 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表