I²C
Móc nó lên là khá đơn giản. Pin tương phản (V O ) của màn hình cụ thể tôi đang sử dụng cần được kết nối với mặt đất. Thông thường, bạn sẽ kết nối nó với một chiết áp để đặt điện áp giữa V SS và V CC
Màn hình của tôi không có đèn nền, vì vậy tôi đã không kết nối chúng để giảm sự lộn xộn trên sơ đồ. Nếu đèn của bạn có đèn nền, dĩ nhiên bạn nên kết nối nó theo cách thông thường
Bạn có thể kết nối tối đa 3 màn hình song song với mỗi cổng của MCP23017. Sự khác biệt duy nhất là pin cho phép từ mỗi màn hình cần kết nối với một pin riêng (GPB1-GPB3)
#!/usr/bin/env python
"""World Clock Demo
It should be fairly obvious how to change this code to work for other timezones"""
import time
class LCD_23017(object):
# Timing constants
E_PULSE = 0.00005
E_DELAY = 0.00005
def __init__(self, bus, addr, port, rs, en):
self.bus = bus
self.addr = addr
self.rs = rs
self.en = en
self.DIRECTION = 0x00 if port == 'A' else 0x01
self.DATA = 0x12 if port == 'A' else 0x13
self.bus.write_byte_data(addr, self.DIRECTION, 0x00)
def lcd_byte(self, data, rs):
rs <<= self.rs
en = 1 << self.en
for nybble in (data&0xf0, data<<4):
self.bus.write_byte_data(self.addr, self.DATA, nybble | rs)
time.sleep(self.E_DELAY)
self.bus.write_byte_data(self.addr, self.DATA, nybble | rs | en)
time.sleep(self.E_PULSE)
self.bus.write_byte_data(self.addr, self.DATA, nybble | rs)
class HD47780(object):
LCD_CHR = True
LCD_CMD = False
# Base addresses for lines on a 20x4 display
LCD_BASE = 0x80, 0xC0, 0x94, 0xD4
def __init__(self, driver, rows=2, width=16):
self.rows = rows
self.width = width
self.driver = driver
self.lcd_init()
def lcd_init(self):
# Initialise display
lcd_byte = self.driver.lcd_byte
for i in 0x33, 0x32, 0x28, 0x0C, 0x06, 0x01:
lcd_byte(i, self.LCD_CMD)
def lcd_string(self, message, line=0):
# Send string to display
lcd_byte = self.driver.lcd_byte
lcd_byte(self.LCD_BASE[line], self.LCD_CMD)
for i in bytearray(message.ljust(self.width)):
lcd_byte(i, self.LCD_CHR)
def test_i2c():
from datetime import datetime
import pytz
import smbus
## For Rev1.0 Raspberry Pi
driver1 = LCD_23017(bus=smbus.SMBus(0), addr=0x27, port='B', rs=0, en=1)
driver2 = LCD_23017(bus=smbus.SMBus(0), addr=0x27, port='B', rs=0, en=2)
driver3 = LCD_23017(bus=smbus.SMBus(0), addr=0x27, port='B', rs=0, en=3)
## For Rev2.0 Raspberry Pi
#driver1 = LCD_23017(bus=smbus.SMBus(1), addr=0x27, port='B', rs=0, en=1)
#driver2 = LCD_23017(bus=smbus.SMBus(1), addr=0x27, port='B', rs=0, en=2)
#driver3 = LCD_23017(bus=smbus.SMBus(1), addr=0x27, port='B', rs=0, en=3)
lcd1 = HD47780(driver=driver1, rows=2, width=16)
lcd2 = HD47780(driver=driver2, rows=2, width=16)
lcd3 = HD47780(driver=driver3, rows=2, width=16)
lcd1.lcd_string(" New York")
lcd2.lcd_string(" London")
lcd3.lcd_string(" Melbourne")
new_york_tz = pytz.timezone("America/New_York")
london_tz = pytz.timezone("Europe/London")
melbourne_tz = pytz.timezone("Australia/Melbourne")
while True:
time.sleep(1-time.time()%1) # Wait until the next second
lcd1.lcd_string(datetime.now(new_york_tz).ctime()[3:], line=1)
lcd2.lcd_string(datetime.now(london_tz).ctime()[3:], line=1)
lcd3.lcd_string(datetime.now(melbourne_tz).ctime()[3:], line=1)
def main():
test_i2c()
if __name__ == "__main__":
main()