一、目的
这一节我们来学习如何使用合宙ESP32 C3连接控制诺基亚Nokia 5110 LCD 屏幕,实现文字显示。下面我们一起来学习一下吧!
二、环境
ESP32 C3开发板(MicroPython v1.19.1 on 2022-06-18)+ 诺基亚Nokia 5110 LCD 屏幕+ 几根杜邦线 + Win10商业版
ESP32 C3和各模块接线方法:
三、模块介绍
四、屏幕驱动
pcd8544.py
"""
MicroPython Nokia 5110 PCD8544 84x48 LCD driver
"""
from micropython import const
from ustruct import pack
from utime import sleep_us
from machine import Pin,PWM
import framebuf
# Function set 0010 0xxx
FUNCTION_SET = const(0x20)
POWER_DOWN = const(0x04)
ADDRESSING_VERT = const(0x02)
EXTENDED_INSTR = const(0x01)
# Display control 0000 1x0x
DISPLAY_BLANK = const(0x08)
DISPLAY_ALL = const(0x09)
DISPLAY_NORMAL = const(0x0c)
DISPLAY_INVERSE = const(0x0d)
# Temperature control 0000 01xx
TEMP_COEFF_0 = const(0x04)
TEMP_COEFF_1 = const(0x05)
TEMP_COEFF_2 = const(0x06) # default
TEMP_COEFF_3 = const(0x07)
# Bias system 0001 0xxx
BIAS_1_100 = const(0x10)
BIAS_1_80 = const(0x11)
BIAS_1_65 = const(0x12)
BIAS_1_48 = const(0x13)
BIAS_1_40 = const(0x14) # default
BIAS_1_24 = const(0x15)
BIAS_1_18 = const(0x16)
BIAS_1_10 = const(0x17)
# Set operation voltage
SET_VOP = const(0x80)
# DDRAM addresses
COL_ADDR = const(0x80) # x pos (0~83)
BANK_ADDR = const(0x40) # y pos, in banks of 8 rows (0~5)
# Display dimensions
WIDTH = const(0x54) # 84
HEIGHT = const(0x30) # 48
class PCD8544(framebuf.FrameBuffer):
def __init__(self, spi, cs, dc, rst, blk):
self.spi = spi
self.cs = cs # chip enable, active LOW
self.dc = dc # data HIGH, command LOW
self.rst = rst # reset, active LOW
self.blk = PWM(Pin(blk),freq = 1000,duty = 0)#bei guang she zhi
self.height = HEIGHT # For Writer class
self.width = WIDTH
self.cs.init(self.cs.OUT, value=1)
self.dc.init(self.dc.OUT, value=0)
if self.rst:
self.rst.init(self.rst.OUT, value=1)
self.buf = bytearray((HEIGHT // 8) * WIDTH)
super().__init__(self.buf, WIDTH, HEIGHT, framebuf.MONO_VLSB)
self.reset()
self.init()
def init(self, horizontal=True, contrast=0x3f, bias=BIAS_1_40, temp=TEMP_COEFF_2):
# power up, horizontal addressing, basic instruction set
self.fn = FUNCTION_SET
self.addressing(horizontal)
self.contrast(contrast, bias, temp)
self.cmd(DISPLAY_NORMAL)
self.clear()
def reset(self):
# issue reset impulse to reset the display
# you need to call power_on() or init() to resume
self.rst(1)
sleep_us(100)
self.rst(0)
sleep_us(100) # reset impulse has to be >100 ns and <100 ms
self.rst(1)
sleep_us(100)
def power_on(self):
self.cs(1)
self.fn &= ~POWER_DOWN