import machine
import time
# OLED display address
OLED_I2C_ADDR = 0x3C
# Initialize SoftI2C
i2c = machine.SoftI2C(scl=machine.Pin(22), sda=machine.Pin(21))
# OLED display dimensions
OLED_WIDTH = 128
OLED_HEIGHT = 64
# Basic 5x8 font
FONT = {
' ': [0x00, 0x00, 0x00, 0x00, 0x00],
'!': [0x00, 0x00, 0x5F, 0x00, 0x00],
'"': [0x00, 0x07, 0x00, 0x07, 0x00],
'#': [0x14, 0x7F, 0x14, 0x7F, 0x14],
'$': [0x24, 0x2A, 0x7F, 0x2A, 0x12],
'%': [0x23, 0x13, 0x08, 0x64, 0x62],
'&': [0x36, 0x49, 0x56, 0x20, 0x50],
"'": [0x00, 0x08, 0x07, 0x03, 0x00],
'(': [0x00, 0x1C, 0x22, 0x41, 0x00],
')': [0x00, 0x41, 0x22, 0x1C, 0x00],
'*': [0x14, 0x08, 0x3E, 0x08, 0x14],
'+': [0x08, 0x08, 0x3E, 0x08, 0x08],
',': [0x00, 0x80, 0x70, 0x30, 0x00],
'-': [0x08, 0x08, 0x08, 0x08, 0x08],
'.': [0x00, 0x60, 0x60, 0x00, 0x00],
'/': [0x20, 0x10, 0x08, 0x04, 0x02],
'0': [0x3E, 0x51, 0x49, 0x45, 0x3E],
'1': [0x00, 0x42, 0x7F, 0x40, 0x00],
'2': [0x42, 0x61, 0x51, 0x49, 0x46],
'3': [0x21, 0x41, 0x45, 0x4B, 0x31],
'4': [0x18, 0x14, 0x12, 0x7F, 0x10],
'5': [0x27, 0x45, 0x45, 0x45, 0x39],
'6': [0x3C, 0x4A, 0x49, 0x49, 0x30],
'7': [0x01, 0x71, 0x09, 0x05, 0x03],
'8': [0x36, 0x49, 0x49, 0x49, 0x36],
'9': [0x06, 0x49, 0x49, 0x29, 0x1E],
':': [0x00, 0x36, 0x36, 0x00, 0x00],
';': [0x00, 0x56, 0x36, 0x00, 0x00],
'<': [0x08, 0x14, 0x22, 0x41, 0x00],
'=': [0x14, 0x14, 0x14, 0x14, 0x14],
'>': [0x00, 0x41, 0x22, 0x14, 0x08],
'?': [0x02, 0x01, 0x51, 0x09, 0x06],
'@': [0x32, 0x49, 0x79, 0x41, 0x3E],
'A': [0x7E, 0x11, 0x11, 0x11, 0x7E],
'B': [0x7F, 0x49, 0x49, 0x49, 0x36],
'C': [0x3E, 0x41, 0x41, 0x41, 0x22],
'D': [0x7F, 0x41, 0x41, 0x41, 0x3E],
'E': [0x7F, 0x49, 0x49, 0x49, 0x41],
'F': [0x7F, 0x09, 0x09, 0x09, 0x01],
'G': [0x3E, 0x41, 0x49, 0x49, 0x7A],
'H': [0x7F, 0x08, 0x08, 0x08, 0x7F],
'I': [0x00, 0x41, 0x7F, 0x41, 0x00],
'J': [0x20, 0x40, 0x41, 0x3F, 0x01],
'K': [0x7F, 0x08, 0x14, 0x22, 0x41],
'L': [0x7F, 0x40, 0x40, 0x40, 0x40],
'M': [0x7F, 0x02, 0x1C, 0x02, 0x7F],
'N': [0x7F, 0x04, 0x08, 0x10, 0x7F],
'O': [0x3E, 0x41, 0x41, 0x41, 0x3E],
'P': [0x7F, 0x09, 0x09, 0x09, 0x06],
'Q': [0x3E, 0x41, 0x51, 0x21, 0x5E],
'R': [0x7F, 0x09, 0x19, 0x29, 0x46],
'S': [0x46, 0x49, 0x49, 0x49, 0x31],
'T': [0x01, 0x01, 0x7F, 0x01, 0x01],
'U': [0x3F, 0x40, 0x40, 0x40, 0x3F],
'V': [0x1F, 0x20, 0x40, 0x20, 0x1F],
'W': [0x3F, 0x40, 0x38, 0x40, 0x3F],
'X': [0x63, 0x14, 0x08, 0x14, 0x63],
'Y': [0x07, 0x08, 0x70, 0x08, 0x07],
'Z': [0x61, 0x51, 0x49, 0x45, 0x43],
'[': [0x00, 0x7F, 0x41, 0x41, 0x00],
'\\': [0x02, 0x04, 0x08, 0x10, 0x20],
']': [0x00, 0x41, 0x41, 0x7F, 0x00],
'^': [0x04, 0x02, 0x01, 0x02, 0x04],
'_': [0x80, 0x80, 0x80, 0x80, 0x80],
'`': [0x00, 0x03, 0x07, 0x08, 0x00],
'a': [0x20, 0x54, 0x54, 0x54, 0x78],
'b': [0x7F, 0x48, 0x44, 0x44, 0x38],
'c': [0x38, 0x44, 0x44, 0x44, 0x20],
'd': [0x38, 0x44, 0x44, 0x48, 0x7F],
'e': [0x38, 0x54, 0x54, 0x54, 0x18],
'f': [0x08, 0x7E, 0x09, 0x01, 0x02],
'g': [0x0C, 0x52, 0x52, 0x52, 0x3E],
'h': [0x7F, 0x08, 0x04, 0x04, 0x78],
'i': [0x00, 0x44, 0x7D, 0x40, 0x00],
'j': [0x20, 0x40, 0x44, 0x3D, 0x00],
'k': [0x7F, 0x10, 0x28, 0x44, 0x00],
'l': [0x00, 0x41, 0x7F, 0x40, 0x00],
'm': [0x7C, 0x04, 0x18, 0x04, 0x78],
'n': [0x7C, 0x08, 0x04, 0x04, 0x78],
'o': [0x38, 0x44, 0x44, 0x44, 0x38],
'p': [0x7C, 0x14, 0x14, 0x14, 0x08],
'q': [0x08, 0x14, 0x14, 0x18, 0x7C],
'r': [0x7C, 0x08, 0x04, 0x04, 0x08],
's': [0x48, 0x54, 0x54, 0x54, 0x20],
't': [0x04, 0x3F, 0x44, 0x40, 0x20],
'u': [0x3C, 0x40, 0x40, 0x20, 0x7C],
'v': [0x1C, 0x20, 0x40, 0x20, 0x1C],
'w': [0x3C, 0x40, 0x30, 0x40, 0x3C],
'x': [0x44, 0x28, 0x10, 0x28, 0x44],
'y': [0x0C, 0x50, 0x50, 0x50, 0x3C],
'z': [0x44, 0x64, 0x54, 0x4C, 0x44],
'{': [0x00, 0x08, 0x36, 0x41, 0x00],
'|': [0x00, 0x00, 0x7F, 0x00, 0x00],
'}': [0x00, 0x41, 0x36, 0x08, 0x00],
'~': [0x02, 0x01, 0x02, 0x04, 0x02]
}
def oled_write_cmd(cmd):
i2c.writeto(OLED_I2C_ADDR, bytearray([0x80, cmd]))
def oled_write_data(data):
i2c.writeto(OLED_I2C_ADDR, bytearray([0x40, data]))
def oled_init():
cmds = [
0xAE, # Display off
0xA8, 0x3F, # Set multiplex
0xD3, 0x00, # Display offset
0x40, # Start line
0xA1, # Segment remap
0xC8, # COM scan direction
0xDA, 0x12, # COM pins
0x81, 0x7F, # Contrast
0xA4, # Entire display ON
0xA6, # Normal display
0xD5, 0x80, # Oscillator frequency
0x8D, 0x14, # Charge pump
0xAF # Display ON
]
for cmd in cmds:
oled_write_cmd(cmd)
def oled_clear():
for i in range(8):
oled_write_cmd(0xB0 + i) # Set page address
oled_write_cmd(0x00) # Set lower column address
oled_write_cmd(0x10) # Set higher column address
for j in range(OLED_WIDTH):
oled_write_data(0)
def oled_show_text(text, x=0, y=0):
for char in text:
if char in FONT:
for byte in FONT[char]:
oled_write_cmd(0xB0 + y // 8) # Set page address
oled_write_cmd(0x00 + (x & 0x0F)) # Set lower column address
oled_write_cmd(0x10 + ((x >> 4) & 0x0F)) # Set higher column address
oled_write_data(byte)
x += 1
x += 1
# Initialize the OLED display
oled_init()
oled_clear()
# Main loop to display messages on two lines
while True:
oled_show_text('Hello, LinkedIn!', 0, 0) # First line
oled_show_text('Learn with Maddie', 0, 16) # Second line