K210
前言
前面学习了按键输入设备后,这一节我们来学习输出设备 OLED 显示屏,其实之前的 LED 灯也算是输出设备,因为它们确切地告诉了我们硬件的状态。只是相对于只有亮灭的 LED 而言,显示屏可以显示更多的信息,体验更好。
一、I2C和OLED
什么是 I2C?
I2C 是用于设备之间通信的双线协议,在物理层面,它由 2 条线组成:SCL 和 SDA,分别是时钟线和数据线。也就是说不通设备间通过这两根线就可以进行通信。
什么是 OLED 显示屏?
OLED 的特性是自己发光,不像 TFT LCD 需要背光,因此可视度和亮度均高,其次是电压需求低且省电效率高,加上反应快、重量轻、厚度薄,构造简单,成本低等特点。简单来说跟传统液晶的区别就是里面像素的材料是由一个个发光二极管组成,因为密度不高导致像素分辨率低,所以早期一般用作户外 LED 广告牌。随着技术的成熟,使得集成度越来越高。小屏也可以制作出较高的分辨率。
二、相关函数
对应 pyAI-K210 的关系是:IO27→SCL,IO28→SDA
1.machine.I2C
machine.I2C(id, mode=I2C.MODE_MASTER, scl=None, sda=None,
freq=400000, timeout=1000, addr=0, addr_size=7)
构建 I2C 对象。
【id】I2C ID,[ I2C.I2C0~I2C.I2C2 ]
【scl】时钟引脚;直接传引脚编号;
【sda】数据引脚; 直接传引脚编号;
【freq】通信频率,即速度; 【timeout】参数保留,设置无效;
【addr】从机地址; 【addr_size】地址长度, 支持 7 位寻址和 10 位寻址, 取值 7 或者 10。
i2c.scan()
扫描 I2C 总线的设备。返回地址,如:0x3c; i2c.readfrom(addr,len)
从指定地址读数据。addr:指定设备地址;len:读取字节数;
i2c.writeto(addr,buf)
写数据。addr:从机地址;buf:数据内容;
i2c.deinit()
注销 I2C。
2.OLED函数
定义好 I2C 后,还需要驱动一下 OLED。这里已经写好了 OLED 的库函数,在 ssd1306k.py 文件里面。开发者只需要将改 py 文件拷贝到 pyAI-K210 文件系统里面,然后在 main.py 里面调用函数即可。人生苦短,我们学会调用函数即可,也就是注重顶层的应用
_init_command = [0xAE, 0x20, 0x10, 0xB0,
0xC8, 0x00, 0x10, 0x40,
0x81, 0xFF, 0xA1, 0xA6,
0xA8, 0x3F, 0xA4, 0xD3,
0x00, 0xD5, 0xF0, 0xD9,
0x22, 0xDA, 0x12, 0xDB,
0x20, 0x8D, 0x14, 0xAF]
_on_command = [0x8D, 0x14, 0xAF]
_off_command = [0x8D, 0x10, 0xAE]
Font6x8 = [[0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x00, 0x2f, 0x00, 0x00],
[0x00, 0x00, 0x07, 0x00, 0x07, 0x00],
[0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14],
[0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12],
[0x00, 0x62, 0x64, 0x08, 0x13, 0x23],
[0x00, 0x36, 0x49, 0x55, 0x22, 0x50],
[0x00, 0x00, 0x05, 0x03, 0x00, 0x00],
[0x00, 0x00, 0x1c, 0x22, 0x41, 0x00],
[0x00, 0x00, 0x41, 0x22, 0x1c, 0x00],
[0x00, 0x14, 0x08, 0x3E, 0x08, 0x14],
[0x00, 0x08, 0x08, 0x3E, 0x08, 0x08],
[0x00, 0x00, 0x00, 0xA0, 0x60, 0x00],
[0x00, 0x08, 0x08, 0x08, 0x08, 0x08],
[0x00, 0x00, 0x60, 0x60, 0x00, 0x00],
[0x00, 0x20, 0x10, 0x08, 0x04, 0x02],
[0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E],
[0x00, 0x00, 0x42, 0x7F, 0x40, 0x00],
[0x00, 0x42, 0x61, 0x51, 0x49, 0x46],
[0x00, 0x21, 0x41, 0x45, 0x4B, 0x31],
[0x00, 0x18, 0x14, 0x12, 0x7F, 0x10],
[0x00, 0x27, 0x45, 0x45, 0x45, 0x39],
[0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30],
[0x00, 0x01, 0x71, 0x09, 0x05, 0x03],
[0x00, 0x36, 0x49, 0x49, 0x49, 0x36],
[0x00, 0x06, 0x49, 0x49, 0x29, 0x1E],
[0x00, 0x00, 0x36, 0x36, 0x00, 0x00],
[0x00, 0x00, 0x56, 0x36, 0x00, 0x00],
[0x00, 0x08, 0x14, 0x22, 0x41, 0x00],
[0x00, 0x14, 0x14, 0x14, 0x14, 0x14],
[0x00, 0x00, 0x41, 0x22, 0x14, 0x08],
[0x00, 0x02, 0x01, 0x51, 0x09, 0x06],
[0x00, 0x32, 0x49, 0x59, 0x51, 0x3E],
[0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C],
[0x00, 0x7F, 0x49, 0x49, 0x49, 0x36],
[0x00, 0x3E, 0x41, 0x41, 0x41, 0x22],
[0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C],
[0x00, 0x7F, 0x49, 0x49, 0x49, 0x41],
[0x00, 0x7F, 0x09, 0x09, 0x09, 0x01],
[0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A],
[0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F],
[0x00, 0x00, 0x41, 0x7F, 0x41, 0x00],
[0x00, 0x20, 0x40, 0x41, 0x3F, 0x01],
[0x00, 0x7F, 0x08, 0x14, 0x22, 0x41],
[0x00, 0x7F, 0x40, 0x40, 0x40, 0x40],
[0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F],
[0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F],
[0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E],
[0x00, 0x7F, 0x09, 0x09, 0x09, 0x06],
[0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E],
[0x00, 0x7F, 0x09, 0x19, 0x29, 0x46],
[0x00, 0x46, 0x49, 0x49, 0x49, 0x31],
[0x00, 0x01, 0x01, 0x7F, 0x01, 0x01],
[0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F],
[0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F],
[0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F],
[0x00, 0x63, 0x14, 0x08, 0x14, 0x63],
[0x00, 0x07, 0x08, 0x70, 0x08, 0x07],
[0x00, 0x61, 0x51, 0x49, 0x45, 0x43],
[0x00, 0x00, 0x7F, 0x41, 0x41, 0x00],
[0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55],
[0x00, 0x00, 0x41, 0x41, 0x7F, 0x00],
[0x00, 0x04, 0x02, 0x01, 0x02, 0x04],
[0x00, 0x40, 0x40, 0x40, 0x40, 0x40],
[0x00, 0x00, 0x01, 0x02, 0x04, 0x00],
[0x00, 0x20, 0x54, 0x54, 0x54, 0x78],
[0x00, 0x7F, 0x48, 0x44, 0x44, 0x38],
[0x00, 0x38, 0x44, 0x44, 0x44, 0x20],
[0x00, 0x38, 0x44, 0x44, 0x48, 0x7F],
[0x00, 0x38, 0x54, 0x54, 0x54, 0x18],
[0x00, 0x08, 0x7E, 0x09, 0x01, 0x02],
[0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C],
[0x00, 0x7F, 0x08, 0x04, 0x04, 0x78],
[0x00, 0x00, 0x44, 0x7D, 0x40, 0x00],
[0x00, 0x40, 0x80, 0x84, 0x7D, 0x00],
[0x00, 0x7F, 0x10, 0x28, 0x44, 0x00],
[0x00, 0x00, 0x41, 0x7F, 0x40, 0x00],
[0x00, 0x7C, 0x04, 0x18, 0x04, 0x78],
[0x00, 0x7C, 0x08, 0x04, 0x04, 0x78],
[0x00, 0x38, 0x44, 0x44, 0x44, 0x38],
[0x00, 0xFC, 0x24, 0x24, 0x24, 0x18],
[0x00, 0x18, 0x24, 0x24, 0x18, 0xFC],
[0x00, 0x7C, 0x08, 0x04, 0x04, 0x08],
[0x00, 0x48, 0x54, 0x54, 0x54, 0x20],
[0x00, 0x04, 0x3F, 0x44, 0x40, 0x20],
[0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C],
[0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C],
[0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C],
[0x00, 0x44, 0x28, 0x10, 0x28, 0x44],
[0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C],
[0x00, 0x44, 0x64, 0x54, 0x4C, 0x44],
[0x00, 0x00, 0x10, 0xFE, 0x82, 0x00],
[0x00, 0x00, 0x00, 0xFF, 0x00, 0x00],
[0x00, 0x82, 0xFE, 0x10, 0x00, 0x00],
[0x02, 0x01, 0x01, 0x02, 0x02, 0x01]]
class SSD1306:
def __init__(self, i2c, addr = 0x3c):
self.i2c = i2c
self.ADDR = addr
self.Init()
def _write_register(self, register, data):
self.i2c.writeto_mem(self.ADDR, register, data, mem_size = 8)
def _set_pos(self, x, y):
if x<128 and y<8:
self._write_register(0x00, 0xb0+y)
self._write_register(0x00, ((x&0xf0)>>4)|0x10)
self._write_register(0x00, x&0x0f)
def Init(self):
for i in _init_command:
self._write_register(0x00, i)
def On(self):
for i in _on_command:
self._write_register(0x00, i)
def Off(self):
for i in _off_command:
self._write_register(0x00, i)
def fill(self, data):
for i in range(0,8):
self._write_register(0x00, 0xb0+i)
self._write_register(0x00, 0x10)
self._write_register(0x00, 0x01)
for j in range(0,128):
self._write_register(0x40, data)
def text (self, STR, x, y ):
self._set_pos(x, y)
for i in range(len(STR)):
Num = ord(STR[i])-32
for j in range(6):
self._write_register(0x40, Font6x8[Num][j])
oled = SSD1306_I2C(i2c, addr)
构 OLED 显示屏对象。
默认分辨率 128*64;
【i2c】定义好的 I2C 对象;
【addr】显示屏设备地址
oled.fill([value])
清屏;
value=0x00 (黑屏);value=0xFF(白屏)
115
oled.text(string,x,y)
将 string 字符写在指定为位置。
【string】:字符;
【x】横坐标;[0-127];
【y】纵坐标。[0-7] 共 8 行。
三、完成代码
from machine import I2C
from ssd1306k import SSD1306
#定义I2C接口和OLED对象
i2c = I2C(I2C.I2C0, mode=I2C.MODE_MASTER,scl=27, sda=28)
oled = SSD1306(i2c, addr=0x3c)
#清屏,0x00(白屏),0xff(黑屏)
oled.fill(0)
#显示字符。参数格式为(str,x,y),其中x范围是0-127,y范围是0-7(共8行)
oled.text("Hello World!", 0, 0) #写入第 0 行内容
oled.text("qichenxi", 0, 2) #写入第 2 行内容
oled.text("csdn", 0, 5) #写入第 5 行内容