import smbus
from time import sleep
from hd44780 import HD44780
from helpers import setup_logger
from output.output import OutputDevice
logger = setup_logger(__name__, "warning")
def delay(time):
sleep(time/1000.0)
def delayMicroseconds(time):
sleep(time/1000000.0)
[docs]class Screen(HD44780, OutputDevice):
"""A driver for PCF8574-based I2C LCD backpacks."""
enable_mask = 1<<2
#rw_mask = 1<<1
rs_mask = 1<<0
backlight_mask = 1<<3
data_mask = 0x00
[docs] def __init__(self, bus=1, addr=0x27, debug=False, **kwargs):
"""Initialises the ``Screen`` object.
Kwargs:
* ``bus``: I2C bus number.
* ``addr``: I2C address of the board.
* ``debug``: enables printing out LCD commands.
* ``**kwargs``: all the other arguments, get passed further to HD44780 constructor
"""
self.bus_num = bus
self.bus = smbus.SMBus(self.bus_num)
if type(addr) in [str, unicode]:
addr = int(addr, 16)
self.addr = addr
self.debug = debug
HD44780.__init__(self, debug = self.debug, **kwargs)
self.enable_backlight()
def enable_backlight(self):
self.data_mask = self.data_mask|self.backlight_mask
def disable_backlight(self):
self.data_mask = self.data_mask& ~self.backlight_mask
[docs] def write_byte(self, data, char_mode = False):
"""Takes a byte and sends the high nibble, then the low nibble (as per HD44780 doc). Passes ``char_mode`` to ``self.write4bits``."""
if self.debug and not char_mode:
logger.debug(hex(data))
self.write4bits((data & 0xF0), char_mode)
self.write4bits((data << 4), char_mode)
[docs] def write4bits(self, value, char_mode = False):
"""Writes a nibble to the display. If ``char_mode`` is set, holds the RS line high."""
if char_mode:
value = value |self.rs_mask
value = value & ~ self.enable_mask
self.expanderWrite(value)
self.expanderWrite(value | self.enable_mask)
self.expanderWrite(value)
[docs] def expanderWrite(self, data):
"""Sends data to PCF8574."""
self.bus.write_byte_data(self.addr, 0, data|self.data_mask)
if __name__ == "__main__":
screen = Screen(bus=1, addr=0x26, cols=16, rows=2, autoscroll=False)
line = "01234567890123456789"
while True:
screen.display_data(line, line[::-1])
sleep(1)
screen.display_data(line[::-1], line)
sleep(1)