from machine import I2C,Pin from ssd1306 import SSD1306_I2C import math chine=[ #/*-- 文字: 执 --*/ #/*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0x00, 0x04,0x44,0x82,0x7F,0x01,0x80,0x40,0x21,0x1A,0x07,0x18,0x00,0x3F,0x40,0xF0,0x00, #/*-- 文字: 念 --*/ #/*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x40,0x40,0x20,0x20,0x90,0x88,0x94,0xE3,0x84,0x88,0x90,0x20,0x20,0x40,0x40,0x00, 0x40,0x30,0x00,0x00,0x38,0x40,0x40,0x44,0x5A,0x41,0x40,0x70,0x00,0x08,0x30,0x00, #/*-- 文字: 执 --*/ #/*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0x00, 0x04,0x44,0x82,0x7F,0x01,0x80,0x40,0x21,0x1A,0x07,0x18,0x00,0x3F,0x40,0xF0,0x00, #/*-- 文字: 战 --*/ #/*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x40,0x40,0x40,0xFF,0x20,0x22,0xAC,0x20,0x00, 0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x80,0x40,0x20,0x17,0x18,0x26,0x41,0xF0,0x00, ] i2c=I2C(-1, sda=Pin(4), scl=Pin(5), freq=400000) oled = SSD1306_I2C(128, 64, i2c) def ByteOpera(num,dat): byte= [0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80] if dat&byte[num]: return 1 else: return 0 def hline(x0,y0,le,color): for i in range(le): oled.pixel(x0+i,y0,color) def shuline(x0,y0,le,color): for i in range(le): oled.pixel(x0,y0+i,color) class GUI: #画点 def DrawDot(x,y): oled.pixel(x,y) #横线 def hline(x0,y0,le,color): for i in range(le): oled.pixel(x0+i,y0,color) #竖线 def shuline(x0,y0,le,color): for i in range(le): oled.pixel(x0,y0+i,color) ########################## #函数:Line #功能:任意画线 #描述: # x0,y0:起始位置 # x1,y1:终止位置 # color:颜色 # def Line(x0,y0,x1,y1,color): dx=x1-x0 if(dx>0): s1=1 else: s1=-1 dy=y1-y0 if(dy>0): s2=1 else: s2=-1 dx=math.fabs(x1-x0) dy=math.fabs(y1-y0) if(dy>dx): temp=dx dx=dy dy=temp status=1 else: status=0 if(dx==0): hline(x0,y0,y1-y0,color) if(dy==0): shuline(x0,y0,x1-x0,color) sub=2*dy-dx for i in range(dx): oled.pixel(x0,y0,color) if(sub>0): if(status==1): x0+=s1 else: y0+=s2 sub-=2*dx if(status==1): y0+=s2 else: x0+=s1 sub+=2*dy #oled.show() ####################### #画矩形函数 #fill为是否填充,默认不填充 def DrawBox(x0,y0,x1,y1,color=1,fill=0): if (fill==1): for i in range(y1-y0): hline(x0,y0+i,x1-x0,color) else: hline(x0,y0,x1-x0,color) hline(x0,y1,x1-x0,color) shuline(x0,y0,y1-y0,color) shuline(x1,y0,y1-y0,color) ############################## #画圆函数,很占CPU #fill 为是否填充 #画两遍,是因为只画一遍的话中间有点画不上 def DrawCircle_math(x,y,r,color,fill=0): if(fill==0): for i in range(x-r,x+r+1): oled.pixel(i,int(y-math.sqrt(r*r-(x-i)*(x-i))),color) oled.pixel(i,int(y+math.sqrt(r*r-(x-i)*(x-i))),color) for i in range(y-r,y+r+1): oled.pixel(int(x-math.sqrt(r*r-(y-i)*(y-i))),i,color) oled.pixel(int(x+math.sqrt(r*r-(y-i)*(y-i))),i,color) else: for i in range(x-r,x+r+1): a=int(math.sqrt(r*r-(x-i)*(x-i))) shuline(i,y-a,a*2,color) for i in range(y-r,y+r+1): a=int(math.sqrt(r*r-(y-i)*(y-i))) hline(x-a,i,a*2,color) ######################### #画圆函数 #网上的算法,不怎么圆 def DrawCircle(x,y,r,color): a=0 b=r di=3-2*r while a0): a+=1 for i in range(a): for n in range(w): for z in range(8): if(ByteOpera(z,pic[a*w+n])): oled.pixel(w,y+a*8+z,1) else: oled.pixel(w,y+a*8+z,0) #奇数时反相显示,偶数时正常显示 def invert(n): oled.invert(n) #调整亮度。0最暗,255最亮 def contrast(n): oled.contrast(n) #在(x, y)处显示字符串,注意text()函数内置的字体是8x8的,暂时不能替换 def text(char,x,y): oled.text(char,x,y) #n=0,清空屏幕,n大于0,填充屏幕 def fill(n): oled.fill(n) ####################### #显示函数 def show(): oled.show() #关屏函数 def poweroff(): oled.poweroff() def poweron(): oled.poweron()