Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import time
- import RPi.GPIO as GPIO
- class LCD_GPIO(object):
- # Timing constants
- E_PULSE = 0.000005
- E_DELAY = 0.000005
- def __init__(self, RST,RS,RW,E,CS1,CS2, D0, D1, D2, D3, D4, D5, D6, D7):
- #GPIO number Assignment
- self.CS1=CS1
- self.CS2=CS2
- self.RST=RST
- self.E = E
- self.RS = RS
- self.RW = RW
- self.D0 = D0
- self.D1 = D1
- self.D2 = D2
- self.D3 = D3
- 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.RW, GPIO.OUT) # RW
- GPIO.setup(self.RS, GPIO.OUT) # RS
- GPIO.setup(self.D0, GPIO.OUT) # DB0
- GPIO.setup(self.D1, GPIO.OUT) # DB1
- GPIO.setup(self.D2, GPIO.OUT) # DB2
- GPIO.setup(self.D3, GPIO.OUT) # DB3
- 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
- GPIO.setup(self.CS1, GPIO.OUT) # CS1
- GPIO.setup(self.CS2, GPIO.OUT) # CS2
- GPIO.output(self.RS, 0)
- GPIO.output(self.RW, 0)
- GPIO.output(self.E, 0)
- GPIO.output(self.CS1, 0)
- GPIO.output(self.CS2, 0)
- GPIO.setup(self.RST, GPIO.OUT) # RST
- GPIO.output(self.RST, 0)
- time.sleep(0.5)
- GPIO.output(self.RST, 1)
- time.sleep(0.03)
- def useDisp1(self):
- # use Controller 1 (Display's LEFT part)
- GPIO.output(self.CS1, 1)
- GPIO.output(self.CS2, 0)
- def useDisp2(self):
- # use Controller 2 (Display's RIGHT part) -- correction in comment
- GPIO.output(self.CS1, 0)
- GPIO.output(self.CS2, 1)
- def lcd_byte(self,value, mode):
- GPIO.output(self.RW,0) # RW is permanently low (write mode)
- GPIO.output(self.RS,mode)
- GPIO.output(self.D0, (value) & 0x01)
- GPIO.output(self.D1, (value) & 0x02)
- GPIO.output(self.D2, (value) & 0x04)
- GPIO.output(self.D3, (value) & 0x08)
- GPIO.output(self.D4, (value) & 0x10)
- GPIO.output(self.D5, (value) & 0x20)
- GPIO.output(self.D6, (value) & 0x40)
- GPIO.output(self.D7, (value) & 0x80)
- # 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 LCD12864(object):
- def __init__(self, driver):
- self.driver = driver
- self.lcd_init()
- def setPage(self, value):
- # set y=value * 8
- self.driver.lcd_byte(0xB8|(value&0x07),0)
- def setAddress(self, value):
- # set x=value
- self.driver.lcd_byte(0x40|(value&0x3F),0)
- def lcd_cls(self):
- # clear screen by write 0x00 to all display memory
- self.driver.useDisp1()
- for y in range(8):
- self.setPage(y)
- self.setAddress(0)
- for i in range(64):
- self.driver.lcd_byte(0x00,1)
- self.driver.useDisp2()
- for y in range(8):
- self.setPage(y)
- self.setAddress(0)
- for i in range(64):
- self.driver.lcd_byte(0x00,1)
- def lcd_init(self):
- self.driver.useDisp1()
- self.driver.lcd_byte(0x3F,0) # Display ON for controller 1
- self.driver.useDisp2() # Need to select controller 2 as well
- self.driver.lcd_byte(0x3F,0) # Display ON for controller 2
- def lcd_picdemo(self):
- #draw a 16x16 sprite
- self.driver.useDisp1()
- self.setPage(3)
- self.setAddress(0)
- self.driver.lcd_byte(0x00,1)
- self.driver.lcd_byte(0xD0,1)
- self.driver.lcd_byte(0x30,1)
- self.driver.lcd_byte(0x93,1)
- self.driver.lcd_byte(0xDF,1)
- self.driver.lcd_byte(0xB7,1)
- self.driver.lcd_byte(0x77,1)
- self.driver.lcd_byte(0x17,1)
- self.driver.lcd_byte(0x17,1)
- self.driver.lcd_byte(0x77,1)
- self.driver.lcd_byte(0xB7,1)
- self.driver.lcd_byte(0xDF,1)
- self.driver.lcd_byte(0x33,1)
- self.driver.lcd_byte(0xD0,1)
- self.driver.lcd_byte(0x10,1)
- self.setPage(4)
- self.setAddress(0)
- self.driver.lcd_byte(0x04,1)
- self.driver.lcd_byte(0x0A,1)
- self.driver.lcd_byte(0x0B,1)
- self.driver.lcd_byte(0x07,1)
- self.driver.lcd_byte(0x0F,1)
- self.driver.lcd_byte(0xFF,1)
- self.driver.lcd_byte(0x71,1)
- self.driver.lcd_byte(0x71,1)
- self.driver.lcd_byte(0xF1,1)
- self.driver.lcd_byte(0xBF,1)
- self.driver.lcd_byte(0x7F,1)
- self.driver.lcd_byte(0x1F,1)
- self.driver.lcd_byte(0x0F,1)
- self.driver.lcd_byte(0x17,1)
- self.driver.lcd_byte(0x16,1)
- self.driver.lcd_byte(0x08,1)
- def demo():
- driver = LCD_GPIO(
- RS=12,
- RW=0, # Set to 0 because it's hard-wired to GND (write mode)
- E=16,
- D0=20, D1=21, D2=22, D3=23, D4=24, D5=25, D6=26, D7=27,
- CS1=6,
- CS2=13,
- RST=19
- )
- lcd = LCD12864(driver=driver)
- # --- Begin LCD operations ---
- try:
- lcd.lcd_cls()
- lcd.lcd_picdemo()
- time.sleep(15)
- except KeyboardInterrupt:
- print("\nExiting demo.")
- except Exception as e:
- print(f"An error occurred: {e}")
- print("Please check your wiring and ensure the GPIO pin numbers in the script match your connections.")
- print("Also ensure the contrast potentiometer is adjusted correctly.")
- finally:
- GPIO.cleanup() # Clean up GPIO pins on exit
- print("GPIO cleanup complete.")
- def main():
- demo()
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement