#!/usr/bin/python3
# This is a more complicated example utilizing a 74HC595 shift register
# to control a 7 segment display. The wiring from the NodeMCU to the
# shift register is described below.
from nodemcu import NodeMcu, NodeMcuError, D
from time import sleep
from sys import exit
from common import getIPPort
from time import sleep
# Wiring Names from the TI data sheet
DS = D[0] # SER
ST_CP = D[1] # RCLK
SH_CP = D[2] # SRCLK
E = D[5]
RW = D[6]
RS = D[7]
def init_lcd(mcu):
sleep(0.01)
lcdCommand(mcu, 0x38)
sleep(0.01)
lcdCommand(mcu, 0x38)
sleep(0.01)
lcdCommand(mcu, 0x38)
sleep(0.01)
lcdCommand(mcu, 0x06)
sleep(0.01)
lcdCommand(mcu, 0x0c)
sleep(0.01)
lcdCommand(mcu, 0x01)
def lcdCommand(mcu, cmd):
mcu.write(RS, False)
mcu.write(RW, False)
mcu.write(E, True)
lcdDataWrite(mcu, cmd)
sleep(0.01)
mcu.write(E, False)
def lcdData(mcu, data):
mcu.write(RS, True)
mcu.write(RW, False)
mcu.write(E, True)
lcdDataWrite(mcu, data)
sleep(0.01)
mcu.write(E, False)
def lcdDataWrite(mcu, data):
move = 0x80
print("write ", data)
for i in range(0,8):
mcu.write(DS, data & move != 0)
mcu.write(SH_CP, False)
mcu.write(SH_CP, True)
move >>= 1
mcu.write(ST_CP, True)
mcu.write(ST_CP, False)
mcu.write(SH_CP, False)
def lcdXY(mcu, x, y):
x += 0x80
if y == 1:
x += 0x40
lcdCommand(mcu, x)
def lcdString(mcu, s, x=-1, y=-1):
if x >= 0 and y >= 0:
lcdXY(mcu, x, y)
for c in s:
lcdData(mcu, ord(c))
sleep(0.05)
def lcdChar(mcu, x, y, ch):
lcdXY(mcu, x, y)
lcdData(mcu, ord(ch))
try:
mcu = NodeMcu(getIPPort())
for o in [DS, ST_CP, SH_CP, E, RW, RS]:
mcu.setOutput(o)
mcu.write(SH_CP, False)
mcu.write(ST_CP, False)
init_lcd(mcu)
while True:
lcdCommand(mcu, 0x01) # clear screen
lcdString(mcu, "Hello ESP!", 0, 0)
sleep(10)
except NodeMcuError as e:
print("error:", e)
Comments