image.png

Esp8266,刷microPython 1.12版本的固件,测试通过

esp8266_i2c_lcd_test.py

# PCF8574 LCD1602 测试模块 ( 2020.09.25 我开心 )

# 注意:是指一种颜色背光的LCD1602, 不是背光可调多种颜色的那种RGB1602!

# Pin5一般指芯片上的D1针脚、Pin4一般是指D2针脚

from time import sleep_ms, ticks_ms

from machine import I2C, Pin

from esp8266_i2c_lcd import I2cLcd

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

DEFAULT_I2C_ADDR = 0x27

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) # Pin5对应ESP8266芯片的D1针脚、Pin4对应D2针脚

lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16) # 指定几行几列

while True:

print("从第几列、第几行开始显示, 最左上角为0,0")

lcd.move_to(0,0)

print("在屏幕上显示内容")

lcd.putstr("1234567890123456")

sleep_ms(2000)

print("在屏幕上显示内容(加\n表示换行)")

lcd.move_to(0,0)

lcd.putstr("LCD1602 Test!\nSecond Line")

sleep_ms(2000)

print("关闭背光")

lcd.backlight_off()

sleep_ms(2000)

print("打开背光")

lcd.backlight_on()

sleep_ms(2000)

print("关闭显示")

lcd.display_off()

sleep_ms(2000)

print("打开显示")

lcd.display_on()

sleep_ms(2000)

print("清除屏幕")

lcd.clear()

sleep_ms(2000)

上面一个代码文件,加下面2个代码文件,共3个,上传到芯片中,文件夹结构如下图所示:

image.png

下面为 lcd_api.py 文件名必须为这个名称,不能修改

import time

class LcdApi:

"""Implements the API for talking with HD44780 compatible character LCDs.

This class only knows what commands to send to the LCD, and not how to get

them to the LCD.

It is expected that a derived class will implement the hal_xxx functions.

"""

# The following constant names were lifted from the avrlib lcd.h

# header file, however, I changed the definitions from bit numbers

# to bit masks.

#

# HD44780 LCD controller command set

LCD_CLR = 0x01 # DB0: clear display

LCD_HOME = 0x02 # DB1: return to home position

LCD_ENTRY_MODE = 0x04 # DB2: set entry mode

LCD_ENTRY_INC = 0x02 # --DB1: increment

LCD_ENTRY_SHIFT = 0x01 # --DB0: shift

LCD_ON_CTRL = 0x08 # DB3: turn lcd/cursor on

LCD_ON_DISPLAY = 0x04 # --DB2: turn display on

LCD_ON_CURSOR = 0x02 # --DB1: turn cursor on

LCD_ON_BLINK = 0x01 # --DB0: blinking cursor

LCD_MOVE = 0x10 # DB4: move cursor/display

LCD_MOVE_DISP = 0x08 # --DB3: move display (0-> move cursor)

LCD_MOVE_RIGHT = 0x04 # --DB2: move right (0-> left)

LCD_FUNCTION = 0x20 # DB5: function set

LCD_FUNCTION_8BIT = 0x10 # --DB4: set 8BIT mode (0->4BIT mode)

LCD_FUNCTION_2LINES = 0x08 # --DB3: two lines (0->one line)

LCD_FUNCTION_10DOTS = 0x04 # --DB2: 5x10 font (0->5x7 font)

LCD_FUNCTION_RESET = 0x30 # See "Initializing by Instruction" section

LCD_CGRAM = 0x40 # DB6: set CG RAM address

LCD_DDRAM = 0x80 # DB7: set DD RAM address

LCD_RS_CMD = 0

LCD_RS_DATA = 1

LCD_RW_WRITE = 0

LCD_RW_READ = 1

def __init__(self, num_lines, num_columns):

self.num_lines = num_lines

if self.num_lines > 4:

self.num_lines = 4

self.num_columns = num_columns

if self.num_columns > 40:

self.num_columns = 40

self.cursor_x = 0

self.cursor_y = 0

self.backlight = True

self.display_off()

self.backlight_on()

self.clear()

self.hal_write_command(self.LCD_ENTRY_MODE | self.LCD_ENTRY_INC)

self.hide_cursor()

self.display_on()

def clear(self):

"""Clears the LCD display and moves the cursor to the top left

corner.

"""

self.hal_write_command(self.LCD_CLR)

self.hal_write_command(self.LCD_HOME)

self.cursor_x = 0

self.cursor_y = 0

def show_cursor(self):

"""Causes the cursor to be made visible."""

self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |

self.LCD_ON_CURSOR)

def hide_cursor(self):

"""Causes the cursor to be hidden."""

self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY)

def blink_cursor_on(self):

"""Turns on the cursor, and makes it blink."""

self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |

self.LCD_ON_CURSOR | self.LCD_ON_BLINK)

def blink_cursor_off(self):

"""Turns on the cursor, and makes it no blink (i.e. be solid)."""

self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |

self.LCD_ON_CURSOR)

def display_on(self):

"""Turns on (i.e. unblanks) the LCD."""

self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY)

def display_off(self):

"""Turns off (i.e. blanks) the LCD."""

self.hal_write_command(self.LCD_ON_CTRL)

def backlight_on(self):

"""Turns the backlight on.

This isn't really an LCD command, but some modules have backlight

controls, so this allows the hal to pass through the command.

"""

self.backlight = True

self.hal_backlight_on()

def backlight_off(self):

"""Turns the backlight off.

This isn't really an LCD command, but some modules have backlight

controls, so this allows the hal to pass through the command.

"""

self.backlight = False

self.hal_backlight_off()

def move_to(self, cursor_x, cursor_y):

"""Moves the cursor position to the indicated position. The cursor

position is zero based (i.e. cursor_x == 0 indicates first column).

"""

self.cursor_x = cursor_x

self.cursor_y = cursor_y

addr = cursor_x & 0x3f

if cursor_y & 1:

addr += 0x40 # Lines 1 & 3 add 0x40

if cursor_y & 2:

addr += 0x14 # Lines 2 & 3 add 0x14

self.hal_write_command(self.LCD_DDRAM | addr)

def putchar(self, char):

"""Writes the indicated character to the LCD at the current cursor

position, and advances the cursor by one position.

"""

if char != '\n':

self.hal_write_data(ord(char))

self.cursor_x += 1

if self.cursor_x >= self.num_columns or char == '\n':

self.cursor_x = 0

self.cursor_y += 1

if self.cursor_y >= self.num_lines:

self.cursor_y = 0

self.move_to(self.cursor_x, self.cursor_y)

def putstr(self, string):

"""Write the indicated string to the LCD at the current cursor

position and advances the cursor position appropriately.

"""

for char in string:

self.putchar(char)

def custom_char(self, location, charmap):

"""Write a character to one of the 8 CGRAM locations, available

as chr(0) through chr(7).

"""

location &= 0x7

self.hal_write_command(self.LCD_CGRAM | (location << 3))

self.hal_sleep_us(40)

for i in range(8):

self.hal_write_data(charmap[i])

self.hal_sleep_us(40)

self.move_to(self.cursor_x, self.cursor_y)

def hal_backlight_on(self):

"""Allows the hal layer to turn the backlight on.

If desired, a derived HAL class will implement this function.

"""

pass

def hal_backlight_off(self):

"""Allows the hal layer to turn the backlight off.

If desired, a derived HAL class will implement this function.

"""

pass

def hal_write_command(self, cmd):

"""Write a command to the LCD.

It is expected that a derived HAL class will implement this

function.

"""

raise NotImplementedError

def hal_write_data(self, data):

"""Write data to the LCD.

It is expected that a derived HAL class will implement this

function.

"""

raise NotImplementedError

def hal_sleep_us(self, usecs):

"""Sleep for some time (given in microseconds)."""

time.sleep_us(usecs)

下面为 esp8266_i2c_lcd.py 文件名必须为这个名称,不能修改

from lcd_api import LcdApi

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 I2cLcd(LcdApi):

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

LcdApi.__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]))

micropython lcd_Esp8266+PCF8574 LCD1602液晶显示屏+MicroPython测试(2020-09-25)相关推荐

  1. STM32通过(软/硬IIC)控制LCD1602液晶显示屏(IIC转8位并口的PCF8574转接板的使用)原创

    STM32通过(软/硬IIC)控制LCD1602液晶显示屏(IIC转8位并口的PCF8574转接板的使用)原创 A0,A1,A2全部悬空,那么PCF8574的IIC地址为0x4e.(具体原因,看PCF ...

  2. 和12岁小同志搞创客开发:如何驱动LCD1602液晶显示屏?

     目录 1.简介和驱动原理 2.实践 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/cate ...

  3. STC89C52单片机 LCD1602液晶显示屏

    LCD1602显示 VVcat #include <reg52.h>typedef unsigned char uchar; typedef unsigned int uint;sbit ...

  4. micropython入门教程-我的MicroPython入门之路

    我刚工作的时候,部门花大价钱买了一套基于FPGA的实时仿真系统,编译的时候看到.py的文件生成让我很感兴趣,从此开始接触python. 后来,我利用空闲时间开始学习python,近几年正是python ...

  5. 51单片机——LCD1602液晶显示屏

    如下图:红框就是LCD1602液晶显示屏,他是可插拔的,插上去后数码管就会乱码无效了,因为他两共用了MCU的8个P0口 LCD1602原理图 从上面两幅图可以看出来 LCD1602的LCD_D0~LC ...

  6. 外设驱动库开发笔记33:LCD1602液晶显示屏驱动

      LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符.LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示出图形.在这一章我们就来讨论LCD ...

  7. 【Proteus仿真】Arduino UNO+PCF8574+LCD1602+MPX4250电子秤

    [Proteus仿真]Arduino UNO+PCF8574+LCD1602+MPX4250电子秤 基于VSM Studio Proteus仿真演示 原理图 所需库 可以在Arduino IDE管理库 ...

  8. 51单片机用c语言在液晶1602上显示汉字,lcd1602与单片机连接图,基于51单片机的lcd1602液晶显示屏连接电路图...

    描述 LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符.LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示, ...

  9. LCD1602液晶显示屏模块资料

    模块实例https://blog.csdn.net/qq_38393591/article/details/108643827 LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符. ...

最新文章

  1. 集成的分层强化学习,让人工智能在解决智能问题时表现得更聪明
  2. 获300万美元融资!Dgraph宣布:其图数据库正式发布!
  3. 修复IE9-- safari 的sort方法
  4. .Net微服务实战之DevOps篇
  5. icoding复习6 图
  6. 剑指offer---用两个栈实现队列
  7. simulink学习仿真(微分模块、传递函数模块使用、波特图频率特性)day3
  8. 【视频】Vue作者分享:Vue 3.0 进展
  9. Linux UDP编程
  10. WINDOWS 2008Server 配置nginx 反向代理服务器 安装成服务
  11. C语言的数组简单复习
  12. ISO27145协议解析
  13. 项目新增需求确认单(模板)
  14. ubuntu下交叉编译libyuv到RK3399平台(ARM64)((提高YUV图像转换效率)
  15. html期末设计作业——品牌红酒销售网页模板(4页) html网页设计期末大作业_网页设计平时作业
  16. 移动端input提起数字键盘如何设置小数点?
  17. 2012年第一批中关村高端领军人才公示公告
  18. 今日学习在线编程题:幻数
  19. Chromium的GPU进程启动过程分析
  20. java excel文件转html

热门文章

  1. c# Winform 程序嵌入PPT
  2. 解析:人人都可以做***的勒索模式RaaS到底什么来头?
  3. 1999—2019年地级市人口变动数据(增长率\出生人口\死亡人口)
  4. 生物信息学竞赛:糖尿病数据挖掘
  5. php计算八字的算法,C#编写的生辰八字计算程序
  6. Java项目校园兼职平台(三层架构+设计模式重构版)(含代码)
  7. matlab离散信号的绘制
  8. rnss和rdss的应用_浅谈北斗二代RDSS和RNSS组合技术.doc
  9. CC2640R2F BLE5.0 CC2640R2F增加一个具有通知属性的characteristic
  10. 大数据时代,统计学方法有多大的效果?