一、实验目的:
1、了解I2C协议的基本原理和时序协议;
2、掌握0.96寸OLED屏的工作原理,汉字点阵显示原理;
3、掌握开源GUI库U82G在stm32上的移植编译方法,以及图形界面可视化技术。
二、具体过程
利用stm32f103的GPIO管脚、VCC和GND连接 OLED屏的I2C接口,采用cubemx设计一个HAL库程序框架,然后下载U82G源码,针对stm32f103和 0.96寸的I2C接口OLED屏,进行代码裁剪,然后移植到HAL程序程序中,完成OLED的各种显示,包括:
1)U82G的demo例程 2)显示你自己的学号和名字(或网名昵称) 3)掌握上下、左右滑动显示方法4)显示一个图案(比如你的头像肖像),最好有动态效果
test.c
#include "test.h"
#define SEND_BUFFER_DISPLAY_MS(u8g2, ms)\
do {\
u8g2_SendBuffer(u8g2); \
HAL_Delay(ms);\
}while(0);
void testFirst(u8g2_t *u8g2)
{
int t = 1000;
u8g2_ClearBuffer(u8g2);
for (int i = 0; i < 128; i+=16)
{
u8g2_DrawStr(u8g2,i, 38, "632207060623");
SEND_BUFFER_DISPLAY_MS(u8g2,200);
u8g2_ClearBuffer(u8g2);
}
for (int i = 128; i >0 ; i-=16)
{
u8g2_DrawStr(u8g2,i, 38, "632207060623");
SEND_BUFFER_DISPLAY_MS(u8g2,200);
u8g2_ClearBuffer(u8g2);
}
SEND_BUFFER_DISPLAY_MS(u8g2,t);
u8g2_ClearBuffer(u8g2);
u8g2_SetFont(u8g2,u8g2_font_wqy12_t_chinese2);
for (int i = 0; i < 128; i+=16)
{
u8g2_DrawUTF8(u8g2,36,i,"情歌");
SEND_BUFFER_DISPLAY_MS(u8g2,200);
u8g2_ClearBuffer(u8g2);
}
for (int i = 128; i >0 ; i-=16)
{
u8g2_DrawUTF8(u8g2,36,i,"情歌");
SEND_BUFFER_DISPLAY_MS(u8g2,200);
u8g2_ClearBuffer(u8g2);
}
u8g2_ClearBuffer(u8g2);
u8g2_DrawXBM(u8g2,0, 16, 128, 48, bilibili);
SEND_BUFFER_DISPLAY_MS(u8g2,t);
}
void u8g2DrawTest(u8g2_t *u8g2)
{
testFirst(u8g2);
}
test.h
#ifndef __TEST_H
#define __TEST_H
#include "main.h"
#include "u8g2.h"
void testFirst(u8g2_t *u8g2);
void u8g2DrawTest(u8g2_t *u8g2);
#endif
main.c
int main(void)
{
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C2_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
u8g2_t u8g2;
u8g2Init(&u8g2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
u8g2_FirstPage(&u8g2);
do
{
draw(&u8g2);
u8g2DrawTest(&u8g2);
} while (u8g2_NextPage(&u8g2));
}
}
实物图:
三.总结
学习到了新东西
移植参考:https://blog.csdn.net/black_sneak/article/details/126312657