由于该开发板没配相应的显示器件,为进行显示需自行配置显示器件。
为了与其小巧的身材相匹配,就选取了一款I2C接口的0.91寸单色OLED屏与之配合。
要驱动显示屏,有2种方式,一种是采用模拟的方式来驱动,另一种则通过硬件的方式来驱动。
因厂家提供了一个OLED屏的基本驱动框架,为此可利用它来实现显示功能。
厂家提供的驱动程序框架为:
from machine import FPIOA, I2C
if HARD_I2C:
fpioa = FPIOA()
fpioa.set_function(11, FPIOA.IIC2_SCL)
fpioa.set_function(12, FPIOA.IIC2_SDA)
i2c=I2C(2, freq = 400 * 1000)
print(i2c.scan())
else:
i2c=I2C(5, scl = 11, sda = 12, freq = 400 * 1000)
print(i2c.scan())
OLED_I2C_ADDR = 0x3C
def send_command(command):
i2c.writeto(OLED_I2C_ADDR, bytearray([0x00, command]))
def send_data(data):
i2c.writeto(OLED_I2C_ADDR, bytearray([0x40] + data))
def send_data1(data):
i2c.writeto(OLED_I2C_ADDR, bytearray([0x40, data]))
def oled_init():
send_command(0xAE) # Display OFF
send_command(0xA8) # Set MUX Ratio
send_command(0x3F) # 64MUX
send_command(0xD3) # Set display offset
send_command(0x00) # Offset = 0
send_command(0x40) # Set display start line to 0
send_command(0xA1) # Set segment re-map (A1 for reverse, A0 for normal)
send_command(0xC8) # Set COM output scan direction (C8 for reverse, C0 for normal)
send_command(0xDA) # Set COM pins hardware configuration
send_command(0x12) # Alternative COM pin config, disable left/right remap
send_command(0x81) # Set contrast control
send_command(0x7F) # Max contrast
send_command(0xA4) # Entire display ON, resume to RAM content display
send_command(0xA6) # Set Normal display (A6 for normal, A7 for inverse)
send_command(0xD5) # Set oscillator frequency
send_command(0x80) # Frequency
send_command(0x8D) # Enable charge pump regulator
send_command(0x14) # Enable charge pump
send_command(0xAF) # Display ON
def oled_clear():
for page in range(0, 8): # 8 pages in 64px tall screen
send_command(0xB0 + page) # Set page start address (0xB0 to 0xB7)
send_command(0x00) # Set low column address
send_command(0x10) # Set high column address
send_data([0x00] * 128)
由程序可以得知,显示屏的引脚连接关系为:
SCL-------GPIO11
SDA------GPIO12
经程序运行,其测试效果如图1所示,说明它对显示屏驱动有效。

图1 连接与显示

图2 显示效果
在此基础上要实现显示功能,需配置字库和相应的显示函数。
其字库的存储结构为:
F8X16=[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,#! 1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#" 2
... ...
}
参照清屏函数,实现符号显示的函数为:
def OLED_ShowCharm(x,y,chr):
c=chr
OLED_Set_Pos(x,y)
i=0
for i in range(8):
u=F8X16[c*16+i]
send_data([u]*1)
OLED_Set_Pos(x,y+1)
i=0
for i in range(8):
u=F8X16[c*16+i+8]
send_data([u]*1)
有了字符显示函数,就可在其基础上再添加字符串显示函数和数值显示函数。
为检测片内温度,需导入os和machine,在OLED屏的配合下,实现片温显示的主程序为:
import os
import machine
oled_init()
oled_clear()
OLED_ShowChar(8, 2, 52)
OLED_ShowChar(16, 5, 26)
OLED_ShowString(5,0,"CanMV-K230D")
while True:
os.exitpoint()
temp = machine.temperature()
OLED_ShowNum(24,2,temp,2)
time.sleep_ms(500)
在执行后,其显示效果如图3所示,由此看出其片内的温度还是比较高的,应为其配上散热器来降低芯片的温度。

图3 显示效果