基于I2C协议的OLED显示(利用U82G库)

一、理论原理

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,完成设置:
![[8b4d5f64cf2f64dc441090c125277fd.png]]

导入bmp格式的图片后,生成字模并保存为txt格式:
![[bfe6d46f4584b43a64e060bf8e4efc6.png]]

显示图片代码:

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:

![[a4c1fd82bddc64e2f8cada5f52925ae.png]]

实物演示:

实物演示

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值