-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlcddriver.py
executable file
·131 lines (109 loc) · 3.61 KB
/
lcddriver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
from time import sleep
import smbus
# LCD Address
# ADDRESS = 0x27
# Update 16th Dec 16: I2C address is now set by calling 'lcd = lcddriver.lcd(0x27)' from withing the main program
# commands
LCD_CLEARDISPLAY = 0x01
LCD_RETURNHOME = 0x02
LCD_ENTRYMODESET = 0x04
LCD_DISPLAYCONTROL = 0x08
LCD_CURSORSHIFT = 0x10
LCD_FUNCTIONSET = 0x20
LCD_SETCGRAMADDR = 0x40
LCD_SETDDRAMADDR = 0x80
# flags for display entry mode
LCD_ENTRYRIGHT = 0x00
LCD_ENTRYLEFT = 0x02
LCD_ENTRYSHIFTINCREMENT = 0x01
LCD_ENTRYSHIFTDECREMENT = 0x00
# flags for display on/off control
LCD_DISPLAYON = 0x04
LCD_DISPLAYOFF = 0x00
LCD_CURSORON = 0x02
LCD_CURSOROFF = 0x00
LCD_BLINKON = 0x01
LCD_BLINKOFF = 0x00
# flags for display/cursor shift
LCD_DISPLAYMOVE = 0x08
LCD_CURSORMOVE = 0x00
LCD_MOVERIGHT = 0x04
LCD_MOVELEFT = 0x00
# flags for function set
LCD_8BITMODE = 0x10
LCD_4BITMODE = 0x00
LCD_2LINE = 0x08
LCD_1LINE = 0x00
LCD_5x10DOTS = 0x04
LCD_5x8DOTS = 0x00
# flags for backlight control
LCD_BACKLIGHT = 0x08
LCD_NOBACKLIGHT = 0x00
En = 0b00000100 # Enable bit
Rw = 0b00000010 # Read/Write bit
Rs = 0b00000001 # Register select bit
class lcd(object):
# initializes objects and lcd
def __init__(self, i2c_address=0x27, bus=1):
self.bus = smbus.SMBus(bus)
self.i2c_address = i2c_address
self._backlight = LCD_NOBACKLIGHT
# Set 4bit mode reliably
self.lcd_write(0x03)
self.lcd_write(0x03)
self.lcd_write(0x03)
self.lcd_write(0x02)
self.lcd_write(LCD_FUNCTIONSET | LCD_2LINE | LCD_5x8DOTS | LCD_4BITMODE)
self.lcd_write(LCD_DISPLAYCONTROL | LCD_DISPLAYON)
self.lcd_write(LCD_CLEARDISPLAY)
self.lcd_write(LCD_ENTRYMODESET | LCD_ENTRYLEFT)
sleep(0.2)
@property
def backlight(self):
return self._backlight
@backlight.setter
def backlight(self, state):
self._backlight = state and LCD_BACKLIGHT or LCD_NOBACKLIGHT
self.bus.write_byte(self.i2c_address, self._backlight)
def __setitem__(self, line, string):
if not 0 <= line <= 1:
raise IndexError("line number out of range")
# Format string to exactly the width of LCD
self.lcd_display_string('{0!s:<16.16}'.format(string), line + 1)
# clocks EN to latch command
def lcd_strobe(self, data):
self.bus.write_byte(self.i2c_address, data | En | self._backlight)
sleep(.0005)
self.bus.write_byte(self.i2c_address, ((data & ~En) | self._backlight))
sleep(.0001)
def lcd_write_four_bits(self, data):
self.bus.write_byte(self.i2c_address, data | self._backlight)
self.lcd_strobe(data)
# write a command to lcd
def lcd_write(self, cmd, mode=0):
self.lcd_write_four_bits(mode | (cmd & 0xF0))
self.lcd_write_four_bits(mode | ((cmd << 4) & 0xF0))
sleep(.0001)
# put string function
def lcd_display_string(self, string, line):
if line == 1:
self.lcd_write(0x80)
elif line == 2:
self.lcd_write(0xC0)
elif line == 3:
self.lcd_write(0x94)
elif line == 4:
self.lcd_write(0xD4)
for char in string:
self.lcd_write(ord(char), Rs)
# clear lcd and set to home
def lcd_clear(self):
self.lcd_write(LCD_CLEARDISPLAY)
self.lcd_write(LCD_RETURNHOME)
# install a custom character
def lcd_create_char(self, location, charmap):
if not 0 <= location <= 7:
raise ValueError('There are only 8 character locations (0-7)')
self.lcd_write(LCD_SETCGRAMADDR | (location << 3), 0)
for row in charmap:
self.lcd_write(row, Rs)