89 lines
3.0 KiB
Python
89 lines
3.0 KiB
Python
from machine import Pin,SPI
|
|
import framebuf
|
|
import time
|
|
|
|
DC = 8
|
|
RST = 12
|
|
MOSI = 11
|
|
SCK = 10
|
|
CS = 9
|
|
|
|
class Oled(framebuf.FrameBuffer):
|
|
def __init__(self):
|
|
self.width = 128
|
|
self.height = 32
|
|
|
|
self.cs = Pin(CS,Pin.OUT)
|
|
self.rst = Pin(RST,Pin.OUT)
|
|
|
|
self.cs(1)
|
|
self.spi = SPI(1)
|
|
self.spi = SPI(1,1000_000)
|
|
self.spi = SPI(1,10000_000,polarity=0, phase=0,sck=Pin(SCK),mosi=Pin(MOSI),miso=None)
|
|
self.dc = Pin(DC,Pin.OUT)
|
|
self.dc(1)
|
|
self.buffer = bytearray(self.height * self.width // 8)
|
|
super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)
|
|
self.init_display()
|
|
|
|
self.white = 0xffff
|
|
self.black = 0x0000
|
|
|
|
def write_cmd(self, cmd):
|
|
self.cs(1)
|
|
self.dc(0)
|
|
self.cs(0)
|
|
self.spi.write(bytearray([cmd]))
|
|
self.cs(1)
|
|
|
|
def write_data(self, buf):
|
|
self.cs(1)
|
|
self.dc(1)
|
|
self.cs(0)
|
|
self.spi.write(bytearray([buf]))
|
|
self.cs(1)
|
|
|
|
def init_display(self):
|
|
"""Initialize dispaly"""
|
|
self.rst(1)
|
|
time.sleep(0.001)
|
|
self.rst(0)
|
|
time.sleep(0.01)
|
|
self.rst(1)
|
|
|
|
self.write_cmd(0xAE)#turn off OLED display*/
|
|
|
|
self.write_cmd(0x04)#turn off OLED display*/
|
|
|
|
self.write_cmd(0x10)#turn off OLED display*/
|
|
|
|
self.write_cmd(0x40)#set lower column address*/
|
|
self.write_cmd(0x81)#set higher column address*/
|
|
self.write_cmd(0x80)#--set start line address Set Mapping RAM Display Start Line (0x00~0x3F, SSD1305_CMD)
|
|
self.write_cmd(0xA1)#--set contrast control register
|
|
self.write_cmd(0xA6)# Set SEG Output Current Brightness
|
|
self.write_cmd(0xA8)#--Set SEG/Column Mapping
|
|
self.write_cmd(0x1F)#Set COM/Row Scan Direction
|
|
self.write_cmd(0xC8)#--set normal display
|
|
self.write_cmd(0xD3)#--set multiplex ratio(1 to 64)
|
|
self.write_cmd(0x00)#--1/64 duty
|
|
self.write_cmd(0xD5)#-set display offset Shift Mapping RAM Counter (0x00~0x3F)
|
|
self.write_cmd(0xF0)#-not offset
|
|
self.write_cmd(0xD8) #--set display clock divide ratio/oscillator frequency
|
|
self.write_cmd(0x05)#--set divide ratio, Set Clock as 100 Frames/Sec
|
|
self.write_cmd(0xD9)#--set pre-charge period
|
|
self.write_cmd(0xC2)#Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
|
|
self.write_cmd(0xDA) #--set com pins hardware configuration
|
|
self.write_cmd(0x12)
|
|
self.write_cmd(0xDB) #set vcomh
|
|
self.write_cmd(0x08)#Set VCOM Deselect Level
|
|
self.write_cmd(0xAF); #-Set Page Addressing Mode (0x00/0x01/0x02)
|
|
|
|
def show(self):
|
|
for page in range(0,4):
|
|
self.write_cmd(0xb0 + page)
|
|
self.write_cmd(0x04)
|
|
self.write_cmd(0x10)
|
|
self.dc(1)
|
|
for num in range(0,128):
|
|
self.write_data(self.buffer[page*128+num]) |