ฉันจะเชื่อมต่อ LCD ที่ใช้ HD44780 ได้อย่างไร


13

การขยายคำถามนี้ ฉันกำลังมองหาวิธีที่แตกต่างกันสองสามประการในการเชื่อมต่อ HD44780 กับพิน GPIO และการแลกเปลี่ยนที่หลากหลาย

นี่คือ "นาฬิกาโลก" ของฉันใช้RPi โดยใช้I²C RPi ที่ใช้งาน 3 HD44780 แสดงผลผ่านI²C

จนถึงตอนนี้ฉันเพิ่งได้งานหนึ่งชิ้นโดยใช้ 6 GPIO คล้ายกับบทช่วยสอนที่ Adafruitและรุ่นI²Cโดยใช้MCP23017

ความคิดอื่น ๆ ที่ฉันอยากจะทำงานคือ:

รุ่น 6 GPIO ขาเป็นเรื่องง่าย แต่ใช้ 6 ที่มีคุณค่าหมุด GPIO
รุ่น CD4094 ราคาถูกมากและต้องการเพียง 2 ขา GPIO รุ่นI²Cเป็นเพียงเล็กน้อยราคาแพงกว่า แต่สามารถทำงานได้ถึง 6 จอแสดงผลที่มี MCP23017 เดียวและแบ่งปันI²Cกับอุปกรณ์อื่น ๆ

ใครบ้างที่คิดว่าตัวเลือกอื่น ๆ ที่จะลอง?


ลองดูที่: schnatterente.net/technik/ …มันเป็น RSS Reader สุดเจ๋งสำหรับ Raspberry Pi + HD44780 Display! :)

คำตอบ:


5

6 GPIO พิน

นี่คือรหัสที่ฉันกำลังใช้อยู่ จนถึงตอนนี้แค่ GPIO ทำงาน ดูtest_gpioฟังก์ชั่นเพื่อดู / เปลี่ยนพิน GPIO ที่เชื่อมต่อกับพินบนโมดูล LCD

import time
import RPi.GPIO as GPIO

class LCD_GPIO(object):
    # Timing constants
    E_PULSE = 0.00005
    E_DELAY = 0.00005
    def __init__(self, RS, E, D4, D5, D6, D7):
        self.RS = RS
        self.E = E
        self.D4 = D4
        self.D5 = D5
        self.D6 = D6
        self.D7 = D7

        GPIO.setmode(GPIO.BCM)        # Use BCM GPIO numbers
        GPIO.setup(self.E, GPIO.OUT)  # E
        GPIO.setup(self.RS, GPIO.OUT) # RS
        GPIO.setup(self.D4, GPIO.OUT) # DB4
        GPIO.setup(self.D5, GPIO.OUT) # DB5
        GPIO.setup(self.D6, GPIO.OUT) # DB6
        GPIO.setup(self.D7, GPIO.OUT) # DB7

    def lcd_byte(self, data, mode):
        GPIO.output(self.RS, mode)

        for bits in (data>>4, data):
            GPIO.output(self.D4, bits&0x01)
            GPIO.output(self.D5, bits&0x02)
            GPIO.output(self.D6, bits&0x04)
            GPIO.output(self.D7, bits&0x08)

            # Toggle E
            time.sleep(self.E_DELAY)
            GPIO.output(self.E, True)
            time.sleep(self.E_PULSE)
            GPIO.output(self.E, False)
            time.sleep(self.E_DELAY)


class LCD_23017(object):
    pass

class LCD_4094(object):
    pass    

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):
        # Send string to display
        lcd_byte = self.driver.lcd_byte
        lcd_byte(self.LCD_BASE[0], self.LCD_CMD)
        for i in bytearray(message.ljust(self.width)):
            lcd_byte(i, self.LCD_CHR)

def test_gpio():
    driver = LCD_GPIO(RS=7, E=8, D4=25, D5=24, D6=23, D7=18)
    lcd = HD47780(driver=driver, rows=4, width=20)
    lcd.lcd_string("Welcome gnibbler")


def main():
    test_gpio()

if __name__ == "__main__":
    main()

5

I²C

การต่อมันค่อนข้างตรงไปตรงมา พินความเปรียบต่าง (V O ) ของจอแสดงผลเฉพาะที่ฉันใช้จำเป็นต้องเชื่อมต่อกับกราวด์ โดยปกติแล้วคุณจะเชื่อมต่อกับโพเทนชิออมิเตอร์เพื่อตั้งค่าแรงดันไฟฟ้าระหว่าง V SSและ V CC

จอแสดงผลของฉันไม่มีแสงไฟดังนั้นฉันจึงไม่ได้เชื่อมต่อสิ่งเหล่านั้นเพื่อลดความยุ่งเหยิงในแผนผัง หากคุณมีแสงไฟคุณควรเชื่อมต่อด้วยวิธีปกติ

คุณสามารถเชื่อมต่อจอแสดงผลได้สูงสุด 3 จอในแนวขนานกับแต่ละพอร์ตของ MCP23017 ข้อแตกต่างเพียงอย่างเดียวคือพินการเปิดใช้งานจากแต่ละจอแสดงผลจำเป็นต้องเชื่อมต่อกับพินแยกต่างหาก (GPB1-GPB3)

Raspberry Pi ขับรถผ่าน HD44780 ผ่าน MCP23017

#!/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()

ขอบคุณ มันได้ผล!. โพสต์ที่ยอดเยี่ยมนี้ช่วยฉันได้มาก เฉพาะความคิดเห็นสำหรับมือใหม่ (เช่นฉัน) หากคุณใช้ Raspberry Rev.2 ให้ใช้ bus = smbus.SMBus (1) แทน bus = smbus.SMBus (0) ในรหัส ที่อยู่สามารถกำหนดได้ด้วยการรันคำสั่งนี้: "sudo i2cdetect -y 1" (ใช้ 0 แทน 1 สำหรับ Raspberry Rev.1) ในกรณีของฉันคือ 0x20 แทน 0x27 ขอบคุณมาก.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.