Source code for grove.display.jhd1802
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# The MIT License (MIT)
# Copyright (C) 2018 Seeed Technology Co.,Ltd.
#
# This is the library for Grove Base Hat
# which used to connect grove sensors for Raspberry Pi.
'''
This is the code for
- `Grove - 16 x 2 LCD (Black on Red) <https://www.seeedstudio.com/Grove-16-x-2-LCD-Black-on-Re-p-3197.html>`_
- `Grove - 16 x 2 LCD (Black on Yellow) <https://www.seeedstudio.com/Grove-16-x-2-LCD-Black-on-Yello-p-3198.html>`_
- `Grove - 16 x 2 LCD (White on Blue) <https://www.seeedstudio.com/Grove-16-x-2-LCD-White-on-Blu-p-3196.html>`_
Examples:
.. code-block:: python
import time
from grove.factory import Factory
# LCD 16x2 Characters
lcd = Factory.getDisplay("JHD1802")
rows, cols = lcd.size()
print("LCD model: {}".format(lcd.name))
print("LCD type : {} x {}".format(cols, rows))
lcd.setCursor(0, 0)
lcd.write("hello world!")
lcd.setCursor(0, cols - 1)
lcd.write('X')
lcd.setCursor(rows - 1, 0)
for i in range(cols):
lcd.write(chr(ord('A') + i))
time.sleep(3)
lcd.clear()
'''
from grove.display.base import *
from grove.i2c import Bus
import time
import sys
# sphinx autoapi required
__all__ = ["JHD1802"]
[docs]
class JHD1802(Display):
'''
Grove - 16 x 2 LCD, using chip JHD1802.
- Grove - 16 x 2 LCD (Black on Yellow)
- Grove - 16 x 2 LCD (Black on Red)
- Grove - 16 x 2 LCD (White on Blue)
Also, it's our class name,
which could drive the above three LCDs.
Args:
address(int): I2C device address, default to 0x3E.
'''
def __init__(self, address = 0x3E):
self._bus = Bus()
self._addr = address
if self._bus.write_byte(self._addr, 0):
print("Check if the LCD {} inserted, then try again"
.format(self.name))
sys.exit(1)
self.textCommand(0x02)
time.sleep(0.1)
self.textCommand(0x08 | 0x04) # display on, no cursor
self.textCommand(0x28)
@property
def name(self):
'''
Get device name
Returns:
string: JHD1802
'''
return "JHD1802"
[docs]
def type(self):
'''
Get device type
Returns:
int: ``TYPE_CHAR``
'''
return TYPE_CHAR
[docs]
def size(self):
'''
Get display size
Returns:
(Rows, Columns): the display size, in characters.
'''
# Charactor 16x2
# return (Rows, Columns)
return 2, 16
[docs]
def clear(self):
'''
Clears the screen and positions the cursor in the upper-left corner.
'''
self.textCommand(0x01)
[docs]
def draw(self, data, bytes):
'''
Not implement for char type display device.
'''
return False
[docs]
def home(self):
'''
Positions the cursor in the upper-left of the LCD.
That is, use that location in outputting subsequent text to the display.
'''
self.textCommand(0x02)
time.sleep(0.2)
[docs]
def setCursor(self, row, column):
'''
Position the LCD cursor; that is, set the location
at which subsequent text written to the LCD will be displayed.
Args:
row (int): the row at which to position cursor, with 0 being the first row
column(int): the column at which to position cursor, with 0 being the first column
Returns:
None
'''
# print("setCursor: row={}, column={}".format(row,column))
self.textCommand((0x40 * row) + (column % 0x10) + 0x80)
[docs]
def write(self, msg):
'''
Write character(s) to the LCD.
Args:
msg (string): the character(s) to write to the display
Returns:
None
'''
for c in msg:
self._bus.write_byte_data(self._addr,0x40,ord(c))
def _cursor_on(self, enable):
if enable:
self.textCommand(0x0E)
else:
self.textCommand(0x0C)
def textCommand(self, cmd):
self._bus.write_byte_data(self._addr,0x80,cmd)
def main():
import time
lcd = JHD1802()
rows, cols = lcd.size()
print("LCD model: {}".format(lcd.name))
print("LCD type : {} x {}".format(cols, rows))
lcd.backlight(False)
time.sleep(1)
lcd.backlight(True)
lcd.setCursor(0, 0)
lcd.write("hello world!")
lcd.setCursor(0, cols - 1)
lcd.write('X')
lcd.setCursor(rows - 1, 0)
for i in range(cols):
lcd.write(chr(ord('A') + i))
time.sleep(3)
lcd.clear()
if __name__ == '__main__':
main()