一、理论原理
1.I2C协议
I2C(Inter-Integrated Circuit)协议是一种由飞利浦公司(现在的NXP半导体)开发的一种多主多
从的串行通信协议,用于连接低速的外围设备。I2C协议仅需要两根线:SCL(Serial Clock Line)和SDA(Serial Data Line),即可实现数据的双向传输。
基本原理:
可以有多个主设备(Master)和多个从设备(Slave)。同一时刻只允许一个主设备控制总线。SCL
为时钟线,SDA为数据线。所有设备都连接到这两根线上。每个从设备都有唯一的7位或10位地址,用于主设备访问时识别。数据以字节为单位传输,传输时高位在前。数据传输开始和结束时,主设备会分别发出一个特定的起始和停止条件。
时序协议:
当SCL为高电平时,SDA由高电平向低电平跳变,表示一个数据传输的开始。当SCL为高电平时,
SDA由低电平向高电平跳变,表示一个数据传输的结束。SDA上的数据在SCL为高电平时必须是稳定的,只有在SCL为低电平时,SDA上的数据才允许改变。每个字节传输后,从设备会通过SDA线发送一个应答信号(ACK)给主设备,表示数据已被成功接收。如果从设备发送一个非应答信号(NACK),则表示数据接收失败或从设备无法响应。
2.0.96寸OLED屏的工作原理
0.96寸OLED(有机发光二极管)屏是一种常见的显示技术,特别是在小型便携式设备和嵌入式系
统中。OLED屏幕由有机材料制成,这些材料在电流的作用下能够发光。0.96寸OLED屏通常具有较低的分辨率,因此显示的汉字可能需要使用较小的点阵尺寸,如12x12或16x16。这样可以确保屏幕能够显示足够多的汉字,同时保持可读性。在显示汉字时,OLED屏幕的优势在于其高对比度和宽视角,使得汉字即使在不同的观看角度下也能清晰显示。
3.汉字点阵显示原理
汉字点阵显示通常使用一个预定义的点阵字库,其中每个汉字都被转换成一个特定的点阵图案。每
个汉字的点阵图案被映射到一个二维阵列中,阵列中的每个点对应屏幕上的一个像素。当需要显示一个汉字时,屏幕会根据点阵字库中的数据来控制相应的像素点。如果某个点在点阵字库中为1,则对应的屏幕像素点亮;如果为0,则像素点不亮。
二、完成OLED的显示
利用stm32f103的GPIO管脚、VCC和GND连接 OLED屏的I2C接口,采用cubemx设计一个HAL库程
序框架,然后下载U82G源码,针对stm32f103和 0.96寸的I2C接口OLED屏,进行代码裁剪,然后移植到HAL程序程序中,完成OLED的各种显示,包括:
1)U82G的demo例程; 2)显示自己的学号和昵称;3)掌握上下、左右滑动显示方法;4)显示一个图案
显示学号昵称代码及滑动:
void scrollTextTogether(u8g2_t *u8g2, const char *text1, const char *text2, int y, int stepSize, int delayMs) {
int x1 = (128 - u8g2_GetUTF8Width(u8g2, text1)) / 2;
int x2 = (128 - u8g2_GetUTF8Width(u8g2, text2)) / 2;
int height = u8g2_GetMaxCharHeight(u8g2);
int startX = -u8g2_GetUTF8Width(u8g2, text1);
int endX = 128;
int startY = y + height;
int endY = -height;
for (int yPos = startY; yPos >= endY; yPos -= stepSize) {
u8g2_ClearBuffer(u8g2);
u8g2_DrawUTF8(u8g2, x1, yPos, text1);
u8g2_DrawUTF8(u8g2, x2, yPos + 16, text2); // 16??????????
u8g2_SendBuffer(u8g2);
HAL_Delay(delayMs);
}
for (int xPos = startX; xPos <= endX; xPos += stepSize) {
u8g2_ClearBuffer(u8g2);
u8g2_DrawUTF8(u8g2, xPos, y, text1);
u8g2_DrawUTF8(u8g2, xPos, y + 16, text2);
u8g2_SendBuffer(u8g2);
HAL_Delay(delayMs);
}
}
void testDisplayNumberName(u8g2_t *u8g2) {
u8g2_ClearBuffer(u8g2);
u8g2_SetFont(u8g2, u8g2_font_ncenB08_tr);
const char *text1 = "632207060330";
const char *text2 = "zk";
int y = 24;
int stepSize = 2;
int delayMs = 50;
scrollTextTogether(u8g2, text1, text2, y, stepSize, delayMs);
}
显示图案:
下载安装PCtol,完成设置:
导入bmp格式的图片后,生成字模并保存为txt格式:
显示图片代码:
const unsigned char Yuki[] U8X8_PROGMEM = {
//将字模粘贴
};
void testDrawXBM1(u8g2_t *u8g2)
{
int t=3000;
u8g2_ClearBuffer(u8g2);
u8g2_DrawXBM(u8g2,0, 0, 128, 64, Yuki);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
}
Keil:
实物演示:
实物演示