from machine import Pin
from utime import sleep_ms

class LCD1602:
    def __init__(self, rs, en, d4, d5, d6, d7):
        self.rs = rs
        self.en = en
        self.d4 = d4
        self.d5 = d5
        self.d6 = d6
        self.d7 = d7

        for pin in (self.rs, self.en, self.d4, self.d5, self.d6, self.d7):
            pin.init(pin.OUT)
        
        self._send(0x33, False)
        self._send(0x32, False)
        self._send(0x28, False)
        self._send(0x0C, False)
        self._send(0x06, False)
        self.clear()

    def clear(self):
        self._send(0x01, False)
        sleep_ms(2)

    def _send(self, data, is_data):
        self.rs.value(is_data)
        for nibble in (data >> 4, data & 0x0F):
            self.d4.value((nibble >> 0) & 1)
            self.d5.value((nibble >> 1) & 1)
            self.d6.value((nibble >> 2) & 1)
            self.d7.value((nibble >> 3) & 1)
            self.en.value(1)
            sleep_ms(1)
            self.en.value(0)
            sleep_ms(1)

    def set_cursor(self, col, row):
        addr = col + (0x40 if row else 0x00)
        self._send(0x80 | addr, False)

    def print(self, text):
        for char in text:
            self._send(ord(char), True)
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT