Skip to content

Commit b2e2d04

Browse files
committed
Initial commit
0 parents  commit b2e2d04

File tree

4 files changed

+412
-0
lines changed

4 files changed

+412
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__pycache__/

BasicFont.py

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
# Font bitmaps, more slender than the font built into famebuf
2+
# Source https://github.com/KahKitZheng/greenhouse/blob/master/raspberry_pi/grove.py/grove/display/sh1107g.py
3+
BasicFont = [
4+
[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
5+
[0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00],
6+
[0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00],
7+
[0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00],
8+
[0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00],
9+
[0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00],
10+
[0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00],
11+
[0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00],
12+
[0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00],
13+
[0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00],
14+
[0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00],
15+
[0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00],
16+
[0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00],
17+
[0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00],
18+
[0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00],
19+
[0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00],
20+
[0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00],
21+
[0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00],
22+
[0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00],
23+
[0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00],
24+
[0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00],
25+
[0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00],
26+
[0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00],
27+
[0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00],
28+
[0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00],
29+
[0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00],
30+
[0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00],
31+
[0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00],
32+
[0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00],
33+
[0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00],
34+
[0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00],
35+
[0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00],
36+
[0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00],
37+
[0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00],
38+
[0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00],
39+
[0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00],
40+
[0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00],
41+
[0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00],
42+
[0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00],
43+
[0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00],
44+
[0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00],
45+
[0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00],
46+
[0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00],
47+
[0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00],
48+
[0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00],
49+
[0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00],
50+
[0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00],
51+
[0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00],
52+
[0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00],
53+
[0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00],
54+
[0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00],
55+
[0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00],
56+
[0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00],
57+
[0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00],
58+
[0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00],
59+
[0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00],
60+
[0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00],
61+
[0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00],
62+
[0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00],
63+
[0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00],
64+
[0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00],
65+
[0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00],
66+
[0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00],
67+
[0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00],
68+
[0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00],
69+
[0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00],
70+
[0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00],
71+
[0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00],
72+
[0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00],
73+
[0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00],
74+
[0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00],
75+
[0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00],
76+
[0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00],
77+
[0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00],
78+
[0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00],
79+
[0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00],
80+
[0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00],
81+
[0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00],
82+
[0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00],
83+
[0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00],
84+
[0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00],
85+
[0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00],
86+
[0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00],
87+
[0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00],
88+
[0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00],
89+
[0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00],
90+
[0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00],
91+
[0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00],
92+
[0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00],
93+
[0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00],
94+
[0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00],
95+
[0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00],
96+
[0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00],
97+
[0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00],
98+
[0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00],
99+
[0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00]
100+
]
101+
102+
# Basic font(as above) with the last vertical line of empty data removed
103+
# The condensed version of the font is 7 pixels wide instead of 8 (8x7)
104+
BasicFontCondensed = [
105+
[0x00,0x00,0x00,0x00,0x00],
106+
[0x00,0x5F,0x00,0x00,0x00],
107+
[0x00,0x07,0x00,0x07,0x00],
108+
[0x00,0x14,0x7F,0x14,0x7F,0x14,0x00],
109+
[0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00],
110+
[0x00,0x23,0x13,0x08,0x64,0x62,0x00],
111+
[0x00,0x36,0x49,0x55,0x22,0x50,0x00],
112+
[0x00,0x05,0x03,0x00],
113+
[0x00,0x1C,0x22,0x41,0x00],
114+
[0x00,0x41,0x22,0x1C,0x00],
115+
[0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00],
116+
[0x00,0x08,0x08,0x3E,0x08,0x08,0x00],
117+
[0x00,0xA0,0x60,0x00],
118+
[0x00,0x08,0x08,0x08,0x08,0x08,0x00],
119+
[0x00,0x60,0x60,0x00],
120+
[0x00,0x20,0x10,0x08,0x04,0x02,0x00],
121+
[0x00,0x3E,0x51,0x49,0x45,0x3E,0x00],
122+
[0x00,0x42,0x7F,0x40,0x00],
123+
[0x00,0x62,0x51,0x49,0x49,0x46,0x00],
124+
[0x00,0x22,0x41,0x49,0x49,0x36,0x00],
125+
[0x00,0x18,0x14,0x12,0x7F,0x10,0x00],
126+
[0x00,0x27,0x45,0x45,0x45,0x39,0x00],
127+
[0x00,0x3C,0x4A,0x49,0x49,0x30,0x00],
128+
[0x00,0x01,0x71,0x09,0x05,0x03,0x00],
129+
[0x00,0x36,0x49,0x49,0x49,0x36,0x00],
130+
[0x00,0x06,0x49,0x49,0x29,0x1E,0x00],
131+
[0x00,0x36,0x36,0x00],
132+
[0x00,0xAC,0x6C,0x00],
133+
[0x00,0x08,0x14,0x22,0x41,0x00],
134+
[0x00,0x14,0x14,0x14,0x14,0x14,0x00],
135+
[0x00,0x41,0x22,0x14,0x08,0x00],
136+
[0x00,0x02,0x01,0x51,0x09,0x06,0x00],
137+
[0x00,0x32,0x49,0x79,0x41,0x3E,0x00],
138+
[0x00,0x7E,0x09,0x09,0x09,0x7E,0x00],
139+
[0x00,0x7F,0x49,0x49,0x49,0x36,0x00],
140+
[0x00,0x3E,0x41,0x41,0x41,0x22,0x00],
141+
[0x00,0x7F,0x41,0x41,0x22,0x1C,0x00],
142+
[0x00,0x7F,0x49,0x49,0x49,0x41,0x00],
143+
[0x00,0x7F,0x09,0x09,0x09,0x01,0x00],
144+
[0x00,0x3E,0x41,0x41,0x51,0x72,0x00],
145+
[0x00,0x7F,0x08,0x08,0x08,0x7F,0x00],
146+
[0x00,0x41,0x7F,0x41,0x00],
147+
[0x00,0x20,0x40,0x41,0x3F,0x01,0x00],
148+
[0x00,0x7F,0x08,0x14,0x22,0x41,0x00],
149+
[0x00,0x7F,0x40,0x40,0x40,0x40,0x00],
150+
[0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00],
151+
[0x00,0x7F,0x04,0x08,0x10,0x7F,0x00],
152+
[0x00,0x3E,0x41,0x41,0x41,0x3E,0x00],
153+
[0x00,0x7F,0x09,0x09,0x09,0x06,0x00],
154+
[0x00,0x3E,0x41,0x51,0x21,0x5E,0x00],
155+
[0x00,0x7F,0x09,0x19,0x29,0x46,0x00],
156+
[0x00,0x26,0x49,0x49,0x49,0x32,0x00],
157+
[0x00,0x01,0x01,0x7F,0x01,0x01,0x00],
158+
[0x00,0x3F,0x40,0x40,0x40,0x3F,0x00],
159+
[0x00,0x1F,0x20,0x40,0x20,0x1F,0x00],
160+
[0x00,0x3F,0x40,0x38,0x40,0x3F,0x00],
161+
[0x00,0x63,0x14,0x08,0x14,0x63,0x00],
162+
[0x00,0x03,0x04,0x78,0x04,0x03,0x00],
163+
[0x00,0x61,0x51,0x49,0x45,0x43,0x00],
164+
[0x00,0x7F,0x41,0x41,0x00],
165+
[0x00,0x02,0x04,0x08,0x10,0x20,0x00],
166+
[0x00,0x41,0x41,0x7F,0x00],
167+
[0x00,0x04,0x02,0x01,0x02,0x04,0x00],
168+
[0x00,0x80,0x80,0x80,0x80,0x80,0x00],
169+
[0x00,0x01,0x02,0x04,0x00],
170+
[0x00,0x20,0x54,0x54,0x54,0x78,0x00],
171+
[0x00,0x7F,0x48,0x44,0x44,0x38,0x00],
172+
[0x00,0x38,0x44,0x44,0x28,0x00],
173+
[0x00,0x38,0x44,0x44,0x48,0x7F,0x00],
174+
[0x00,0x38,0x54,0x54,0x54,0x18,0x00],
175+
[0x00,0x08,0x7E,0x09,0x02,0x00],
176+
[0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00],
177+
[0x00,0x7F,0x08,0x04,0x04,0x78,0x00],
178+
[0x00,0x7D,0x00],
179+
[0x00,0x80,0x84,0x7D,0x00],
180+
[0x00,0x7F,0x10,0x28,0x44,0x00],
181+
[0x00,0x41,0x7F,0x40,0x00],
182+
[0x00,0x7C,0x04,0x18,0x04,0x78,0x00],
183+
[0x00,0x7C,0x08,0x04,0x7C,0x00],
184+
[0x00,0x38,0x44,0x44,0x38,0x00],
185+
[0x00,0xFC,0x24,0x24,0x18,0x00],
186+
[0x00,0x18,0x24,0x24,0xFC,0x00],
187+
[0x00,0x7C,0x08,0x04,0x00],
188+
[0x00,0x48,0x54,0x54,0x24,0x00],
189+
[0x00,0x04,0x7F,0x44,0x00],
190+
[0x00,0x3C,0x40,0x40,0x7C,0x00],
191+
[0x00,0x1C,0x20,0x40,0x20,0x1C,0x00],
192+
[0x00,0x3C,0x40,0x30,0x40,0x3C,0x00],
193+
[0x00,0x44,0x28,0x10,0x28,0x44,0x00],
194+
[0x00,0x1C,0xA0,0xA0,0x7C,0x00],
195+
[0x00,0x44,0x64,0x54,0x4C,0x44,0x00],
196+
[0x00,0x08,0x36,0x41,0x00],
197+
[0x00,0x7F,0x00],
198+
[0x00,0x41,0x36,0x08,0x00],
199+
[0x00,0x02,0x01,0x01,0x02,0x01,0x00],
200+
[0x00,0x02,0x05,0x05,0x02,0x00]
201+
]

PicoOled13.py

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
from machine import Pin,SPI
2+
import framebuf
3+
import time
4+
import BasicFont
5+
6+
# Pin Definitions
7+
DC = 8
8+
RST = 12
9+
MOSI = 11
10+
SCK = 10
11+
CS = 9
12+
13+
KEY0=15
14+
KEY1=17
15+
16+
display=None
17+
18+
class OLED_1inch3_SPI(framebuf.FrameBuffer):
19+
def __init__(self):
20+
self.width = 128
21+
self.height = 64
22+
23+
self.white = 0xffff
24+
self.black = 0x0000
25+
26+
self.font=BasicFont.BasicFontCondensed
27+
28+
# framebuf init
29+
self.buffer = bytearray(self.height * self.width // 8)
30+
super().__init__(self.buffer, self.width, self.height, framebuf.MONO_HMSB)
31+
32+
# SPI init
33+
self.cs = Pin(CS,Pin.OUT)
34+
self.rst = Pin(RST,Pin.OUT)
35+
36+
self.cs(1)
37+
self.spi = SPI(1)
38+
self.spi = SPI(1,2000_000)
39+
self.spi = SPI(1,20000_000,polarity=0, phase=0,sck=Pin(SCK),mosi=Pin(MOSI),miso=None)
40+
self.dc = Pin(DC,Pin.OUT)
41+
self.dc(1)
42+
43+
# display init
44+
self.init_display()
45+
46+
# Clear the screen on init - needs frambuf init, spi init and display init
47+
self.clear()
48+
49+
# Init Keys
50+
self.KEY0=KEY0
51+
self.KEY1=KEY1
52+
self.key0=Pin(KEY0,Pin.IN,Pin.PULL_UP)
53+
self.key1=Pin(KEY1,Pin.IN,Pin.PULL_UP)
54+
55+
def is_pressed(self, key):
56+
if key == self.KEY0:
57+
return not(self.key0.value())
58+
elif key == self.KEY1:
59+
return not(self.key1.value())
60+
else:
61+
return None
62+
63+
def get_width(self):
64+
return self.width
65+
66+
def get_height(self):
67+
return self.height
68+
69+
def write_cmd(self, cmd):
70+
self.cs(1)
71+
self.dc(0)
72+
self.cs(0)
73+
self.spi.write(bytearray([cmd]))
74+
self.cs(1)
75+
76+
def write_data(self, buf):
77+
self.cs(1)
78+
self.dc(1)
79+
self.cs(0)
80+
self.spi.write(bytearray([buf]))
81+
self.cs(1)
82+
83+
def init_display(self):
84+
"""Initialize dispaly"""
85+
self.rst(1)
86+
time.sleep(0.001)
87+
self.rst(0)
88+
time.sleep(0.01)
89+
self.rst(1)
90+
91+
self.write_cmd(0xAE)#turn off OLED display
92+
93+
self.write_cmd(0x00) # set lower column address
94+
self.write_cmd(0x10) # set higher column address
95+
96+
self.write_cmd(0xB0) # set page address
97+
98+
self.write_cmd(0xdc) # set display start line
99+
self.write_cmd(0x00) # (2nd param)
100+
101+
self.write_cmd(0x81) # contract control
102+
self.write_cmd(0x80) # 128
103+
104+
self.write_cmd(0x21) # Set Memory addressing mode (0x20/0x21) #
105+
self.write_cmd(0xa0) # set segment remap
106+
self.write_cmd(0xc0) # Com scan direction
107+
self.write_cmd(0xa4) # Disable Entire Display On (0xA4/0xA5)
108+
self.write_cmd(0xa6) # normal / reverse
109+
110+
self.write_cmd(0xa8) # multiplex ratio ??
111+
self.write_cmd(0x3f) # duty = 1/64 ??
112+
113+
self.write_cmd(0xd3) # set display offset
114+
self.write_cmd(0x60)
115+
116+
self.write_cmd(0xd5) # set osc division
117+
self.write_cmd(0x50)
118+
119+
self.write_cmd(0xd9) # set pre-charge period
120+
self.write_cmd(0x22)
121+
122+
self.write_cmd(0xdb) # set vcomh
123+
self.write_cmd(0x35)
124+
125+
self.write_cmd(0xad) # set charge pump enable
126+
self.write_cmd(0x8a) #Set DC-DC enable (a=0:disable; a=1:enable)
127+
128+
self.write_cmd(0XAF) # turn on display
129+
130+
def show(self):
131+
self.write_cmd(0xb0)
132+
for page in range(0,64):
133+
self.column = 63 - page
134+
self.write_cmd(0x00 + (self.column & 0x0f))
135+
self.write_cmd(0x10 + (self.column >> 4))
136+
for num in range(0,16):
137+
self.write_data(self.buffer[page*16+num])
138+
139+
def clear(self):
140+
self.fill(self.black)
141+
self.show()
142+
143+
def text(self,s,x0,y0,col=0xffff):
144+
x=x0
145+
for i in range(len(s)):
146+
C = ord(s[i])
147+
if C < 32 or C > 127:
148+
C = 32
149+
cdata = self.font[C - 32]
150+
if x+len(cdata) > self.width:
151+
x=0
152+
y0=y0+9
153+
for j in range(len(cdata)):
154+
if 0 <= x and x < self.width:
155+
vline_data = cdata[j]
156+
y = y0
157+
while vline_data:
158+
if vline_data & 1:
159+
if 0 <= y and y < self.height:
160+
self.pixel(x, y, col);
161+
vline_data=vline_data>>1
162+
y=y+1
163+
x=x+1
164+
return [x,y0+9]
165+
166+
def get():
167+
global display
168+
if display is None:
169+
display=OLED_1inch3_SPI()
170+
return display

0 commit comments

Comments
 (0)