_E='Linux' _D='microbit' _C=True _B=False _A=None _SET_CONTRAST=129 _SET_ENTIRE_ON=164 _SET_NORM_INV=166 _SET_DISP=174 _SET_MEM_ADDR=32 _SET_COL_ADDR=33 _SET_PAGE_ADDR=34 _SET_DISP_START_LINE=64 _SET_SEG_REMAP=160 _SET_MUX_RATIO=168 _SET_IREF_SELECT=173 _SET_COM_OUT_DIR=192 _SET_DISP_OFFSET=211 _SET_COM_PIN_CFG=218 _SET_DISP_CLK_DIV=213 _SET_PRECHARGE=217 _SET_VCOM_DESEL=219 _SET_CHARGE_PUMP=141 WIDTH=128 HEIGHT=64 from PiicoDev_Unified import* from math import cos,sin,radians compat_str='\nUnified PiicoDev library out of date. Get the latest module: https://piico.dev/unified \n' _SYSNAME=os.uname().sysname if _SYSNAME==_D:from microbit import*;from utime import sleep_ms;from ustruct import pack_into elif _SYSNAME==_E:from struct import pack_into else:import framebuf if _SYSNAME==_D or _SYSNAME==_E: class framebuf: class FrameBuffer: def _set_pos(self,col=0,page=0):self.write_cmd(176|page);c1,c2=col*2&15,col>>3;self.write_cmd(0|c1);self.write_cmd(16|c2) def fill(self,c=0): for i in range(0,1024): if c>0:self.buffer[i]=255 else:self.buffer[i]=0 def pixel(self,x,y,color):x=x&WIDTH-1;y=y&HEIGHT-1;page,shift_page=divmod(y,8);ind=x+page*128;b=self.buffer[ind]|1<B',self.buffer,ind,b);self._set_pos(x,page) def line(self,x1,y1,x2,y2,c): steep=abs(y2-y1)>abs(x2-x1) if steep:tmp=x1;x1=y1;y1=tmp;tmp=y2;y2=x2;x2=tmp if x1>x2:tmp=x1;x1=x2;x2=tmp;tmp=y1;y1=y2;y2=tmp dx=x2-x1;dy=abs(y2-y1);err=dx/2 if y1=(r-r*t-1)**2:self.pixel(i,j,c) def arc(self,x,y,r,stAng,enAng,t=0,c=1): for i in range(r*(1-t)-1,r): for ta in range(stAng,enAng,1):X=int(i*cos(radians(ta))+x);Y=int(i*sin(radians(ta))+y);self.pixel(X,Y,c) def load_pbm(self,filename,c): with open(filename,'rb')as f: line=f.readline() if line.startswith(b'P4')is _B:print('Not a valid pbm P4 file');return line=f.readline() while line.startswith(b'#')is _C:line=f.readline() data_piicodev=bytearray(f.read()) for byte in range(WIDTH//8*HEIGHT): for bit in range(8): if data_piicodev[byte]&1<graph.width:graph.data.pop() x=graph.originX+graph.width-1;m=graph.c for value in graph.data: y=round(graph.m*value+graph.offset) if graph.bars==_C: for idx in range(y,graph.originY+1): if x>=graph.originX and xgraph.originY-graph.height:self.pixel(x,idx,m) elif x>=graph.originX and xgraph.originY-graph.height:self.pixel(x,y,m) x-=1 class PiicoDev_SSD1306_MicroPython(PiicoDev_SSD1306): def __init__(self,bus=_A,freq=_A,sda=_A,scl=_A,addr=60):self.i2c=create_unified_i2c(bus=bus,freq=freq,sda=sda,scl=scl);self.addr=addr;self.temp=bytearray(2);self.write_list=[b'@',_A];self.init_display();super().__init__(self.buffer,WIDTH,HEIGHT,framebuf.MONO_VLSB);self.fill(0);self.show() class PiicoDev_SSD1306_MicroBit(PiicoDev_SSD1306): def __init__(self,bus=_A,freq=_A,sda=_A,scl=_A,addr=60):self.i2c=create_unified_i2c(bus=bus,freq=freq,sda=sda,scl=scl);self.addr=addr;self.temp=bytearray(2);self.write_list=[b'@',_A];self.init_display();self.fill(0);self.show() class PiicoDev_SSD1306_Linux(PiicoDev_SSD1306): def __init__(self,bus=_A,freq=_A,sda=_A,scl=_A,addr=60):self.i2c=create_unified_i2c(bus=bus,freq=freq,sda=sda,scl=scl);self.addr=addr;self.temp=bytearray(2);self.write_list=[b'@',_A];self.init_display();self.fill(0);self.show() def create_PiicoDev_SSD1306(address=60,bus=_A,freq=_A,sda=_A,scl=_A,asw=_A): if asw==0:_a=60 elif asw==1:_a=61 else:_a=address try: if compat_ind>=1:0 else:print(compat_str) except:print(compat_str) if _SYSNAME==_D:display=PiicoDev_SSD1306_MicroBit(addr=_a,freq=freq) elif _SYSNAME==_E:display=PiicoDev_SSD1306_Linux(addr=_a,freq=freq) else:display=PiicoDev_SSD1306_MicroPython(addr=_a,bus=bus,freq=freq,sda=sda,scl=scl) return display