mirror of
https://github.com/node-red/node-red-nodes.git
synced 2023-10-10 13:36:58 +02:00
187 lines
4.8 KiB
Python
Executable File
187 lines
4.8 KiB
Python
Executable File
#!/usr/bin/python
|
|
#
|
|
# HD44780 LCD Test Script for
|
|
# Raspberry Pi
|
|
#
|
|
# Original Author : Matt Hawkins
|
|
# Site : http://www.raspberrypi-spy.co.uk
|
|
# Modified to use PINS not BCM : Dave Conway-Jones
|
|
|
|
#import
|
|
import RPi.GPIO as GPIO
|
|
import time
|
|
import sys
|
|
import os, select
|
|
|
|
# Turn off warnings if you run it a second time...
|
|
GPIO.setwarnings(False)
|
|
|
|
# Define initial Pins to LCD mapping
|
|
LCD_RS = 26
|
|
LCD_E = 24
|
|
LCD_D4 = 22
|
|
LCD_D5 = 18
|
|
LCD_D6 = 16
|
|
LCD_D7 = 12
|
|
|
|
# Define some device constants
|
|
LCD_WIDTH = 20 # Maximum characters per line
|
|
LCD_CHR = True
|
|
LCD_CMD = False
|
|
|
|
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
|
|
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
|
|
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
|
|
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line
|
|
|
|
# Timing constants
|
|
E_PULSE = 0.0005
|
|
E_DELAY = 0.0005
|
|
|
|
def lcd_init():
|
|
# Initialise display
|
|
lcd_byte(0x33,LCD_CMD)
|
|
lcd_byte(0x32,LCD_CMD)
|
|
lcd_byte(0x0C,LCD_CMD)
|
|
lcd_byte(0x06,LCD_CMD)
|
|
lcd_byte(0x28,LCD_CMD)
|
|
lcd_byte(0x01,LCD_CMD)
|
|
time.sleep(E_DELAY)
|
|
|
|
def lcd_string(message):
|
|
# Send string to display
|
|
message = message.ljust(LCD_WIDTH," ")
|
|
for i in range(LCD_WIDTH):
|
|
lcd_byte(ord(message[i]),LCD_CHR)
|
|
|
|
def lcd_byte(bits, mode):
|
|
# Send byte to data pins
|
|
# bits = data
|
|
# mode = True for character
|
|
# False for command
|
|
GPIO.output(LCD_RS, mode) # RS
|
|
|
|
# High bits
|
|
GPIO.output(LCD_D4, False)
|
|
GPIO.output(LCD_D5, False)
|
|
GPIO.output(LCD_D6, False)
|
|
GPIO.output(LCD_D7, False)
|
|
if bits&0x10==0x10:
|
|
GPIO.output(LCD_D4, True)
|
|
if bits&0x20==0x20:
|
|
GPIO.output(LCD_D5, True)
|
|
if bits&0x40==0x40:
|
|
GPIO.output(LCD_D6, True)
|
|
if bits&0x80==0x80:
|
|
GPIO.output(LCD_D7, True)
|
|
|
|
# Toggle 'Enable' pin
|
|
time.sleep(E_DELAY)
|
|
GPIO.output(LCD_E, True)
|
|
time.sleep(E_PULSE)
|
|
GPIO.output(LCD_E, False)
|
|
time.sleep(E_DELAY)
|
|
|
|
# Low bits
|
|
GPIO.output(LCD_D4, False)
|
|
GPIO.output(LCD_D5, False)
|
|
GPIO.output(LCD_D6, False)
|
|
GPIO.output(LCD_D7, False)
|
|
if bits&0x01==0x01:
|
|
GPIO.output(LCD_D4, True)
|
|
if bits&0x02==0x02:
|
|
GPIO.output(LCD_D5, True)
|
|
if bits&0x04==0x04:
|
|
GPIO.output(LCD_D6, True)
|
|
if bits&0x08==0x08:
|
|
GPIO.output(LCD_D7, True)
|
|
|
|
# Toggle 'Enable' pin
|
|
time.sleep(E_DELAY)
|
|
GPIO.output(LCD_E, True)
|
|
time.sleep(E_PULSE)
|
|
GPIO.output(LCD_E, False)
|
|
time.sleep(E_DELAY)
|
|
|
|
# Main program loop
|
|
if len(sys.argv) > 1:
|
|
pins = sys.argv[1].lower().split(',')
|
|
if len(pins) != 6:
|
|
print("Bad number of pins supplied")
|
|
print(" "+pins)
|
|
sys.exit(0)
|
|
|
|
LCD_RS = int(pins[0])
|
|
LCD_E = int(pins[1])
|
|
LCD_D4 = int(pins[2])
|
|
LCD_D5 = int(pins[3])
|
|
LCD_D6 = int(pins[4])
|
|
LCD_D7 = int(pins[5])
|
|
|
|
GPIO.setwarnings(False)
|
|
GPIO.setmode(GPIO.BOARD) # Use GPIO BOARD numbers
|
|
GPIO.setup(LCD_RS, GPIO.OUT) # RS
|
|
GPIO.setup(LCD_E, GPIO.OUT) # E
|
|
GPIO.setup(LCD_D4, GPIO.OUT) # DB4
|
|
GPIO.setup(LCD_D5, GPIO.OUT) # DB5
|
|
GPIO.setup(LCD_D6, GPIO.OUT) # DB6
|
|
GPIO.setup(LCD_D7, GPIO.OUT) # DB7
|
|
|
|
# Initialise display
|
|
lcd_init()
|
|
|
|
# Send some test
|
|
lcd_byte(LCD_LINE_1, LCD_CMD)
|
|
lcd_string("Node-RED")
|
|
lcd_byte(LCD_LINE_2, LCD_CMD)
|
|
lcd_string("LCD online")
|
|
time.sleep(2) # 2 second delay
|
|
lcd_byte(0x01,LCD_CMD)
|
|
|
|
# Flush stdin so we start clean
|
|
while len(select.select([sys.stdin.fileno()], [], [], 0.0)[0])>0:
|
|
os.read(sys.stdin.fileno(), 4096)
|
|
|
|
while True:
|
|
try:
|
|
data = raw_input()
|
|
data = data.rstrip("\r\n\t")
|
|
if data == "c:lose": # cleanup and exit
|
|
GPIO.cleanup(LCD_RS)
|
|
GPIO.cleanup(LCD_E)
|
|
GPIO.cleanup(LCD_D4)
|
|
GPIO.cleanup(LCD_D5)
|
|
GPIO.cleanup(LCD_D6)
|
|
GPIO.cleanup(LCD_D7)
|
|
sys.exit(0)
|
|
elif data == "clr:": # clear the display
|
|
lcd_init()
|
|
elif data.startswith("1:"):
|
|
lcd_byte(LCD_LINE_1, LCD_CMD)
|
|
lcd_string(data[2:])
|
|
elif data.startswith("2:"):
|
|
lcd_byte(LCD_LINE_2, LCD_CMD)
|
|
lcd_string(data[2:])
|
|
elif data.startswith("3:"):
|
|
lcd_byte(LCD_LINE_3, LCD_CMD)
|
|
lcd_string(data[2:])
|
|
elif data.startswith("4:"):
|
|
lcd_byte(LCD_LINE_4, LCD_CMD)
|
|
lcd_string(data[2:])
|
|
else: # default to line 1
|
|
lcd_byte(LCD_LINE_1, LCD_CMD)
|
|
lcd_string(data)
|
|
except EOFError: # hopefully always caused by us sigint'ing the program
|
|
GPIO.cleanup(LCD_RS)
|
|
GPIO.cleanup(LCD_E)
|
|
GPIO.cleanup(LCD_D4)
|
|
GPIO.cleanup(LCD_D5)
|
|
GPIO.cleanup(LCD_D6)
|
|
GPIO.cleanup(LCD_D7)
|
|
sys.exit(0)
|
|
|
|
else:
|
|
print("Bad params")
|
|
print(" sudo nrlcd.py RS,E,D4,D5,D6,D7")
|
|
sys.exit(0)
|