【西门子杯工业嵌入式-7-OLED】
西门子杯工业嵌入式-7-OLED
- 一、OLED 显示屏简介
- 1. OLED 的基本特性
- 2. 本次课程使用的 OLED 说明
- 二、I2C(IPHONEC)通信协议详解
- 1. I2C 协议简介
- 2. I2C 的实现方式
- 三、SSD1306 驱动芯片及显示流程
- 1. 驱动芯片简介
- 2. OLED 驱动程序设计要点
- 四、OLED 驱动代码结构说明
- 1. 头文件和源文件说明
- 2. 驱动引脚设置
- 五、汉字显示与取模方法
- 1. 汉字取模软件使用方法(PCtoLCD2002)
- 2. show_chinese 函数使用说明
- 六、动态数据显示:ADC 电压显示实例
- 1. 基础思路
- 2. 具体实现
- 七、优化建议与总结
- 1. 字模与显示优化技巧
- 2. 总结与扩展建议
链接: B站视频
一、OLED 显示屏简介
1. OLED 的基本特性
自发光,无需背光源
对比度高
响应速度快
视角广
功耗低
在嵌入式系统中应用广泛
2. 本次课程使用的 OLED 说明
使用 I2C (I²C, IPHONEC) 接口通信
驱动芯片为 SSD1306
显示屏为 0.91 寸 OLED
OLED 接口:采用 模拟 I2C 模式,GPIO 引脚为 PB8(SCL) 和 PB9(SDA)
二、I2C(IPHONEC)通信协议详解
1. I2C 协议简介
飞利浦公司开发的同步串行通信协议
使用两根线:
SCL(串行时钟线)
SDA(串行数据线)
特性:
双向通信
多主多从支持
地址和数据均为 8 位
支持总线仲裁
2. I2C 的实现方式
(1)软件模拟 I2C
使用任意 GPIO 模拟时序
优点:灵活、调试方便、不受硬件限制
缺点:占用 CPU,速度慢,需精确延时
(2)硬件 I2C
使用 MCU 内置 I2C 外设
优点:速度快、支持中断/DMA、CPU 占用低
缺点:引脚固定、调试复杂
三、SSD1306 驱动芯片及显示流程
1. 驱动芯片简介
支持命令设置对比度、显示开关、显示模式等
通过 I2C 接收 MCU 命令进行控制
2. OLED 驱动程序设计要点
初始化:设置地址模式、方向、对比度等
显示缓冲区设计:
数据先写入缓存,再刷新显示屏
避免闪烁、提高刷新效率
注意事项:
使用硬件复位模式
初始化必须在发送指令之前完成
四、OLED 驱动代码结构说明
1. 头文件和源文件说明
oled.h / oled.c:基础驱动函数定义与实现
很多都是写好的,可以直接拿来用,以下师oled.h
#ifndef __OLED_H
#define __OLED_H/************************* 头文件 *************************/#include "HeaderFiles.h"//-----------------OLED端口定义---------------- #define u8 unsigned char
#define u32 unsigned int/* 引脚定义 - 模拟IIC */
#define OLED_SCL_PORT GPIOB
#define OLED_SCL_PIN GPIO_PIN_8
#define OLED_SDA_PORT GPIOB
#define OLED_SDA_PIN GPIO_PIN_9
/* SCL和SDA引脚控制宏定义 */
#define OLED_SCLK_Set() gpio_bit_set(OLED_SCL_PORT, OLED_SCL_PIN)
#define OLED_SCLK_Clr() gpio_bit_reset(OLED_SCL_PORT, OLED_SCL_PIN)
#define OLED_SDIN_Set() gpio_bit_set(OLED_SDA_PORT, OLED_SDA_PIN)
#define OLED_SDIN_Clr() gpio_bit_reset(OLED_SDA_PORT, OLED_SDA_PIN)
#define IIC_READ_SDA gpio_input_bit_get(OLED_SDA_PORT, OLED_SDA_PIN)#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据void OLED_ClearPoint(u8 x,u8 y);
void OLED_ColorTurn(u8 i);
void OLED_DisplayTurn(u8 i);
void I2C_Start(void);
void I2C_Stop(void);
void I2C_WaitAck(void);
void Send_Byte(u8 dat);
void OLED_WR_Byte(u8 dat,u8 mode);
void OLED_DisPlay_On(void);
void OLED_DisPlay_Off(void);
void OLED_Refresh(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y);
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2);
void OLED_DrawCircle(u8 x,u8 y,u8 r);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1);
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1);
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1);
void OLED_ScrollDisplay(u8 num,u8 space);
void OLED_WR_BP(u8 x,u8 y);
void OLED_ShowPicture(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[]);
void OLED_Init(void);#endif
oledfont.h:字模库文件(包含 ASCII 字符与汉字模组)
2. 驱动引脚设置
模拟 I2C 使用引脚:PB8 (SCL)、PB9 (SDA)
五、汉字显示与取模方法
1. 汉字取模软件使用方法(PCtoLCD2002)
设置格式为:
扫描方式:音码逆向列行式
输出格式:C51 格式
输入汉字,例如“智能制造”
选择字体,点击生成字模
将生成的数据复制进 oledfont.h 汉字库中
2. show_chinese 函数使用说明
函数原型:Show_Chinese(x, y, num, size)
参数说明:
x, y:起始坐标
num:汉字在数组中的编号
size:字体大小(16/24)
排列显示时,注意按字宽(如 16)偏移 x 坐标
//显示汉字
//x,y:起点坐标
//num:汉字对应的序号
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1)
{u8 i,m,n=0,temp,chr1;u8 x0=x,y0=y;u8 size3=size1/8;while(size3--){chr1=num*size1/8+n;n++;for(i=0;i<size1;i++){if(size1==16){temp=Hzk1[chr1][i];}//调用16*16字体else if(size1==24){temp=Hzk2[chr1][i];}//调用24*24字体else if(size1==32) {temp=Hzk3[chr1][i];}//调用32*32字体else if(size1==64){temp=Hzk4[chr1][i];}//调用64*64字体else return;for(m=0;m<8;m++){if(temp&0x01)OLED_DrawPoint(x,y);else OLED_ClearPoint(x,y);temp>>=1;y++;}x++;if((x-x0)==size1){x=x0;y0=y0+8;}y=y0;}}
}
六、动态数据显示:ADC 电压显示实例
1. 基础思路
板子本身不带oled,要自己焊接
通过 ADC 获取电压值
使用 printf + OLED 显示电压值
利用 sprintf 将变量格式化为字符串显示
2. 具体实现
char date[20];
sprintf(date, "Voltage=%.2fV", voltage_value);
OLED_ShowString(0, 16, date, 16);
OLED_ShowString 函数参数:
x = 0,y = 16 显示在第二行
date:要显示的字符串
16:字体大小
void UsrFunction(void)
{unsigned char data[]=" ";while(1){OLED_ShowString(0,0,"**Hello CIMC**",16);/* 延时1秒 */delay_1ms(1000);adc_flag_clear(ADC0,ADC_FLAG_EOC); // 清除结束标志while(SET != adc_flag_get(ADC0,ADC_FLAG_EOC)){} // 获取转换结束标志adc_value = ADC_RDATA(ADC0); // 读取ADC数据Vol_Value = adc_value*3.3/4095; // 转换成电压值printf("adc_value=%d\r\n",adc_value); // 结果输出原始值printf("Vol_Value=%.2f\r\n",Vol_Value); // 结果输出电压值sprintf(data,"Vol=%.2f V",Vol_Value);OLED_ShowString(0,16,data,16);delay_1ms(1000);OLED_Refresh();}
}
七、优化建议与总结
1. 字模与显示优化技巧
使用页面缓存、局部更新,提升刷新效率
利用 DMA 传输降低 CPU 占用
适当管理显示缓冲区,避免重复刷新
2. 总结与扩展建议
掌握 OLED 驱动和显示流程
可扩展应用如:电压表、菜单系统、图形显示等
鼓励学生动手实现更多创意功能