查看: 6320|回复: 6

[求助] 求助!I2C转LCD1602出现乱码

[复制链接]

该用户从未签到

发表于 2015-8-5 16:34:12 | 显示全部楼层 |阅读模式
分享到:
我使用的是淘宝上常见的那种I2C转LCD1602模块,屏幕是5V的,整个供电也接的5V,刚开始使用LCD1602.py成功驱动,出现了英文字符,但是过一会无论如何调试都是乱码了。过一会又成功了几次,大部分时候是乱码。

网上搜索了一番,翻墙到google看到说树莓派的gpio输出是3.3v的,所以容易造成乱码。

不知道有没有遇到过的兄弟,是如何解决的?


评分

参与人数 1与非币 +5 收起 理由
loveeeboard + 5 三周年铜板双倍!

查看全部评分

回复

使用道具 举报

  • TA的每日心情
    奋斗
    2022-9-16 05:52
  • 签到天数: 1368 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-8-5 16:41:07 | 显示全部楼层
    乱码应该是时序的问题
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-8-5 16:49:51 | 显示全部楼层
    tjcfeng 发表于 2015-8-5 16:41
    乱码应该是时序的问题

    感谢版主,
    时序的话同样的程序,有时候又可以

    我用的是这个程序
    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)
            send_command(0x0C) # Enable display without cursor
            time.sleep(0.005)
            send_command(0x01) # Clear Screen
            logging.info('LCD init over')
            BUS.write_byte(LCD_ADDR ,0x08)
            logging.info('LCD turning on BLight')
        except:
            return False
        else:
            return True

    def clear_lcd():
        send_command(0x01) # Clear Screen

    def print_lcd(x, y, str):
        if x < 0:
            x = 0
        if x > 15:
            x = 15
        if y <0:
            y = 0
        if y > 1:
            y = 1

        # Move cursor
        addr = 0x80 + 0x40 * y + x
        send_command(addr)
       
        for chr in str:
            send_data(ord(chr))

    if __name__ == '__main__':
        init_lcd()
        print_lcd(0, 0, 'Hello, world!')
        print_lcd(8, 1, 'by Jerry')




    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-12-15 11:51
  • 签到天数: 24 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2015-8-5 17:53:17 | 显示全部楼层
    这个不清楚
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-9-16 05:52
  • 签到天数: 1368 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-8-5 22:36:13 | 显示全部楼层
    本帖最后由 tjcfeng 于 2015-8-5 22:37 编辑
    blueanima 发表于 2015-8-5 16:49
    感谢版主,
    时序的话同样的程序,有时候又可以

    抱歉我不会python,不过我在香蕉派上调试时也出现过这种情况,最后发现是时序造成的。
    把代码中的Sleep都注释掉试一下。有时可以是因为刚开始跑稍微有点误差不会影响,但是累积后误差达到一定程度就会显现出来。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-8-6 16:58:40 | 显示全部楼层
    tjcfeng 发表于 2015-8-5 22:36
    抱歉我不会python,不过我在香蕉派上调试时也出现过这种情况,最后发现是时序造成的。
    把代码中的Sleep都 ...

    感谢版主提点
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-11-27 12:35
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-8-7 07:07:16 | 显示全部楼层
    帮顶
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 11:45 , Processed in 0.210019 second(s), 28 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.