diff --git a/adafruit_displayio_sh1107.py b/adafruit_displayio_sh1107.py index 11593c3..fef9177 100644 --- a/adafruit_displayio_sh1107.py +++ b/adafruit_displayio_sh1107.py @@ -26,6 +26,7 @@ """ +import sys import displayio from micropython import const @@ -65,23 +66,47 @@ # Sequence from sh1107 framebuf driver formatted for displayio init -_INIT_SEQUENCE = ( - b"\xae\x00" # display off, sleep mode - b"\xdc\x01\x00" # display start line = 0 (POR = 0) - b"\x81\x01\x2f" # contrast setting = 0x2f - b"\x21\x00" # vertical (column) addressing mode (POR=0x20) - b"\xa0\x00" # segment remap = 1 (POR=0, down rotation) - b"\xcf\x00" # common output scan direction = 15 (0 to n-1 (POR=0)) - b"\xa8\x01\x7f" # multiplex ratio = 128 (POR) - b"\xd3\x01\x60" # set display offset mode = 0x60 - b"\xd5\x01\x51" # divide ratio/oscillator: divide by 2, fOsc (POR) - b"\xd9\x01\x22" # pre-charge/dis-charge period mode: 2 DCLKs/2 DCLKs (POR) - b"\xdb\x01\x35" # VCOM deselect level = 0.770 (POR) - b"\xb0\x00" # set page address = 0 (POR) - b"\xa4\x00" # entire display off, retain RAM, normal status (POR) - b"\xa6\x00" # normal (not reversed) display - b"\xaf\x00" # DISPLAY_ON -) +# we fixed sh110x addressing in 7, so we have slightly different setups +if sys.implementation.version[0] < 7: + _INIT_SEQUENCE = ( + b"\xae\x00" # display off, sleep mode + b"\xdc\x01\x00" # display start line = 0 (POR = 0) + b"\x81\x01\x2f" # contrast setting = 0x2f + b"\x21\x00" # vertical (column) addressing mode (POR=0x20) + b"\xa0\x00" # segment remap = 1 (POR=0, down rotation) + b"\xcf\x00" # common output scan direction = 15 (0 to n-1 (POR=0)) + b"\xa8\x01\x7f" # multiplex ratio = 128 (POR) + b"\xd3\x01\x60" # set display offset mode = 0x60 + b"\xd5\x01\x51" # divide ratio/oscillator: divide by 2, fOsc (POR) + b"\xd9\x01\x22" # pre-charge/dis-charge period mode: 2 DCLKs/2 DCLKs (POR) + b"\xdb\x01\x35" # VCOM deselect level = 0.770 (POR) + b"\xb0\x00" # set page address = 0 (POR) + b"\xa4\x00" # entire display off, retain RAM, normal status (POR) + b"\xa6\x00" # normal (not reversed) display + b"\xaf\x00" # DISPLAY_ON + ) + _PIXELS_IN_ROW = True + _ROTATION_OFFSET = 0 +else: + _INIT_SEQUENCE = ( + b"\xae\x00" # display off, sleep mode + b"\xdc\x01\x00" # set display start line 0 + b"\x81\x01\x4f" # contrast setting = 0x2f + b"\x20\x00" # vertical (column) addressing mode (POR=0x20) + b"\xa0\x00" # segment remap = 1 (POR=0, down rotation) + b"\xc0\x00" # common output scan direction = 15 (0 to n-1 (POR=0)) + b"\xa8\x01\x3f" # multiplex ratio = 128 (POR) + b"\xd3\x01\x60" # set display offset mode = 0x60 + # b"\xd5\x01\x51" # divide ratio/oscillator: divide by 2, fOsc (POR) + b"\xd9\x01\x22" # pre-charge/dis-charge period mode: 2 DCLKs/2 DCLKs (POR) + b"\xdb\x01\x35" # VCOM deselect level = 0.770 (POR) + # b"\xb0\x00" # set page address = 0 (POR) + b"\xa4\x00" # entire display off, retain RAM, normal status (POR) + b"\xa6\x00" # normal (not reversed) display + b"\xaf\x00" # DISPLAY_ON + ) + _PIXELS_IN_ROW = False + _ROTATION_OFFSET = 90 class SH1107(displayio.Display): @@ -102,6 +127,7 @@ def __init__( self, bus, display_offset=DISPLAY_OFFSET_ADAFRUIT_FEATHERWING_OLED_4650, + rotation=0, **kwargs ): init_sequence = bytearray(_INIT_SEQUENCE) @@ -112,11 +138,12 @@ def __init__( **kwargs, color_depth=1, grayscale=True, - pixels_in_byte_share_row=True, # in vertical (column) mode + pixels_in_byte_share_row=_PIXELS_IN_ROW, # in vertical (column) mode data_as_commands=True, # every byte will have a command byte preceeding set_vertical_scroll=0xD3, # TBD -- not sure about this one! brightness_command=0x81, single_byte_bounds=True, + rotation=(rotation + _ROTATION_OFFSET) % 360, # for sh1107 use column and page addressing. # lower column command = 0x00 - 0x0F # upper column command = 0x10 - 0x17 diff --git a/examples/displayio_sh1107_simpletest.py b/examples/displayio_sh1107_simpletest.py index c0f17df..1f7c79c 100644 --- a/examples/displayio_sh1107_simpletest.py +++ b/examples/displayio_sh1107_simpletest.py @@ -29,7 +29,9 @@ HEIGHT = 64 BORDER = 2 -display = adafruit_displayio_sh1107.SH1107(display_bus, width=WIDTH, height=HEIGHT) +display = adafruit_displayio_sh1107.SH1107( + display_bus, width=WIDTH, height=HEIGHT, rotation=0 +) # Make the display context splash = displayio.Group()