一、在cubemx配置I2C
I2C的其他参数不用改直接生成文件即可。
二、将OLED.C、OLED.H、oledfont.h引入工程
3个关键文件如下:
链接:https://pan.baidu.com/s/1TyZWs72CaFkaIIk7bAY5ow
提取码:1234
1.在cubemx中生成的文件中的MDK-ARM中新建一个文件夹oled.c.h。将3个关键文件放入
2.在工程中将OLED.C加入
3.将头文件路径引入
4.在main.c里引入OLED.H
三、在main.c中调用函数
1.在while之前调用
OLED_Init();//oled初始化
OLED_Clear();//清除屏幕的值
2.在while中调用
OLED_ShowNum(8,3,7,3,16);//x,y,数字,位数,长度
部分代码如下(main.c):
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "gpio.h"
#include "OLED.H"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* 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_I2C1_Init();
/* USER CODE BEGIN 2 */
OLED_Init();//oled初始化
OLED_Clear();//清除屏幕的值
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
OLED_ShowNum(8,3,7,3,16);//x,y,数字,位数,长度
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
四、效果展示
五、打印图片的方法
1、找自己喜欢的图片最好是黑白的
2. 用lmage2lcd将图片转化为数组代码
3. 在代码中建立数组
unsigned char BMP1[] =
{
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X80,0XC0,
0XC0,0XE0,0XF0,0XF0,0XF0,0XF8,0XF8,0XF8,0XFC,0X3C,0X3C,0X3C,0X3C,0X3C,0X3C,0X3E,
0X3E,0X3C,0X3C,0X3C,0X3C,0X3C,0X3C,0XFC,0XF8,0XF8,0XF8,0XF0,0XF0,0XF0,0XE0,0XC0,
0XC0,0X80,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0XE0,0XF0,0XF8,0X7C,0X3E,0X1F,0X0F,0X07,0X07,
0X03,0X01,0X01,0X0F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XE0,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X80,0XE0,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0X3F,0X07,0X01,0X03,
0X07,0X07,0X0F,0X1F,0X3E,0X7C,0XF8,0XF0,0XE0,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0XE0,0XF8,0XFE,0XFF,0X1F,0X0F,0X0F,0X1F,0X7F,0XFF,0XFF,0XD7,0X37,0X77,
0X67,0X47,0XC7,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,
0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0XC7,0X67,
0X67,0X37,0XB7,0XFF,0XFF,0XFF,0X7F,0X1F,0X0F,0X1F,0XFF,0XFE,0XF8,0XE0,0X00,0X00,
0XE0,0XFF,0XFF,0XFF,0X9F,0X80,0X80,0X80,0X80,0X80,0XC0,0XC1,0XC7,0XDF,0XFF,0XFC,
0XF8,0XE0,0X80,0X00,0X03,0X0F,0X1F,0X7F,0XFF,0XFF,0XE7,0XEF,0XDF,0X1F,0X1F,0X1F,
0X1F,0X1F,0X1F,0X9F,0XCF,0XE7,0XF7,0XFF,0XFF,0X3F,0X1F,0X07,0X01,0X00,0XC0,0XF0,
0XF8,0XFE,0XFF,0XCF,0XC3,0XC0,0XC0,0XC0,0X80,0X80,0X80,0X9F,0XFF,0XFF,0XFF,0XC0,
0X07,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X3F,0X3F,0X3F,0X3F,0X1F,0X1F,0X1F,0X1F,0X0F,
0X0F,0X0F,0X1F,0X7E,0XFC,0XF0,0XC0,0X80,0X01,0X03,0X0F,0X3F,0XFF,0XFF,0XFC,0XD0,
0X80,0XF8,0XFE,0XFF,0X7F,0X1F,0X07,0X03,0X00,0X80,0XE0,0XF8,0XFC,0X3F,0X1F,0X0F,
0X0F,0X0F,0X1F,0X1F,0X1F,0X1F,0X1F,0X3F,0X3F,0X3F,0XBF,0XFF,0XFF,0XFF,0XFF,0X03,
0X00,0X00,0X07,0X1F,0X7F,0XFF,0XF8,0XF0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,
0X80,0XC0,0XE0,0XF0,0XF9,0XFF,0XFF,0XFF,0XFE,0XF8,0XE0,0XC0,0X00,0X03,0X07,0X1F,
0XFF,0X0F,0X07,0X01,0X00,0XC0,0XF0,0XF8,0XFE,0XFF,0XFF,0XFF,0XFC,0XF8,0XE0,0XC0,
0X80,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0XF0,0XF8,0XFF,0X7F,0X1F,0X07,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X07,0X0F,0X1F,0X3E,0X7C,0XF8,0XF8,0XFC,0XFF,
0XFF,0XFF,0XFF,0X3F,0X1F,0X0F,0X07,0X03,0X01,0X01,0X07,0X1F,0X3F,0XFC,0XF8,0XEE,
0XFF,0XE0,0XF8,0XFE,0X3F,0X0F,0X07,0X01,0X01,0X03,0X07,0X0F,0X1F,0XBF,0XFF,0XFF,
0XFF,0XFF,0XFE,0XFC,0X7C,0X3E,0X1F,0X0F,0X07,0X03,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,
0X03,0X07,0X07,0X0F,0X0F,0X1F,0X1E,0X1E,0X3E,0X3C,0X3C,0X3C,0X3C,0X3C,0X3F,0X3F,
0X3F,0X3F,0X3F,0X3C,0X3C,0X3C,0X3C,0X3E,0X1E,0X1E,0X1F,0X0F,0X0F,0X07,0X07,0X03,
0X03,0X01,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
};
4.调用函数
/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{
unsigned int j=0;
unsigned char x,y;
if(y1%8==0) y=y1/8;
else y=y1/8+1;
for(y=y0;y<y1;y++)
{
OLED_Set_Pos(x0,y);
for(x=x0;x<x1;x++)
{
OLED_WR_Byte(BMP[j++],OLED_DATA);
}
}
}
5.部分代码如下:
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "gpio.h"
#include "OLED.H"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
unsigned char BMP1[] =
{
//0X32,0X01,0X00,0X40,0X00,0X40,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X80,0XC0,
0XC0,0XE0,0XF0,0XF0,0XF0,0XF8,0XF8,0XF8,0XFC,0X3C,0X3C,0X3C,0X3C,0X3C,0X3C,0X3E,
0X3E,0X3C,0X3C,0X3C,0X3C,0X3C,0X3C,0XFC,0XF8,0XF8,0XF8,0XF0,0XF0,0XF0,0XE0,0XC0,
0XC0,0X80,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0XE0,0XF0,0XF8,0X7C,0X3E,0X1F,0X0F,0X07,0X07,
0X03,0X01,0X01,0X0F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XE0,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X80,0XE0,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0X3F,0X07,0X01,0X03,
0X07,0X07,0X0F,0X1F,0X3E,0X7C,0XF8,0XF0,0XE0,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0XE0,0XF8,0XFE,0XFF,0X1F,0X0F,0X0F,0X1F,0X7F,0XFF,0XFF,0XD7,0X37,0X77,
0X67,0X47,0XC7,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,
0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0X87,0XC7,0X67,
0X67,0X37,0XB7,0XFF,0XFF,0XFF,0X7F,0X1F,0X0F,0X1F,0XFF,0XFE,0XF8,0XE0,0X00,0X00,
0XE0,0XFF,0XFF,0XFF,0X9F,0X80,0X80,0X80,0X80,0X80,0XC0,0XC1,0XC7,0XDF,0XFF,0XFC,
0XF8,0XE0,0X80,0X00,0X03,0X0F,0X1F,0X7F,0XFF,0XFF,0XE7,0XEF,0XDF,0X1F,0X1F,0X1F,
0X1F,0X1F,0X1F,0X9F,0XCF,0XE7,0XF7,0XFF,0XFF,0X3F,0X1F,0X07,0X01,0X00,0XC0,0XF0,
0XF8,0XFE,0XFF,0XCF,0XC3,0XC0,0XC0,0XC0,0X80,0X80,0X80,0X9F,0XFF,0XFF,0XFF,0XC0,
0X07,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X3F,0X3F,0X3F,0X3F,0X1F,0X1F,0X1F,0X1F,0X0F,
0X0F,0X0F,0X1F,0X7E,0XFC,0XF0,0XC0,0X80,0X01,0X03,0X0F,0X3F,0XFF,0XFF,0XFC,0XD0,
0X80,0XF8,0XFE,0XFF,0X7F,0X1F,0X07,0X03,0X00,0X80,0XE0,0XF8,0XFC,0X3F,0X1F,0X0F,
0X0F,0X0F,0X1F,0X1F,0X1F,0X1F,0X1F,0X3F,0X3F,0X3F,0XBF,0XFF,0XFF,0XFF,0XFF,0X03,
0X00,0X00,0X07,0X1F,0X7F,0XFF,0XF8,0XF0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,
0X80,0XC0,0XE0,0XF0,0XF9,0XFF,0XFF,0XFF,0XFE,0XF8,0XE0,0XC0,0X00,0X03,0X07,0X1F,
0XFF,0X0F,0X07,0X01,0X00,0XC0,0XF0,0XF8,0XFE,0XFF,0XFF,0XFF,0XFC,0XF8,0XE0,0XC0,
0X80,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0XF0,0XF8,0XFF,0X7F,0X1F,0X07,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X07,0X0F,0X1F,0X3E,0X7C,0XF8,0XF8,0XFC,0XFF,
0XFF,0XFF,0XFF,0X3F,0X1F,0X0F,0X07,0X03,0X01,0X01,0X07,0X1F,0X3F,0XFC,0XF8,0XEE,
0XFF,0XE0,0XF8,0XFE,0X3F,0X0F,0X07,0X01,0X01,0X03,0X07,0X0F,0X1F,0XBF,0XFF,0XFF,
0XFF,0XFF,0XFE,0XFC,0X7C,0X3E,0X1F,0X0F,0X07,0X03,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,
0X03,0X07,0X07,0X0F,0X0F,0X1F,0X1E,0X1E,0X3E,0X3C,0X3C,0X3C,0X3C,0X3C,0X3F,0X3F,
0X3F,0X3F,0X3F,0X3C,0X3C,0X3C,0X3C,0X3E,0X1E,0X1E,0X1F,0X0F,0X0F,0X07,0X07,0X03,
0X03,0X01,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
};
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* 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_I2C1_Init();
/* USER CODE BEGIN 2 */
OLED_Init();//oled初始化
OLED_Clear();//清除屏幕的值
OLED_DrawBMP(34,1,98,7,BMP1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
6.效果如下:
7.注意事项:
注意图像起止点。可通过调节
OLED_DrawBMP(34,1,98,7,BMP1);
中的参数来移动到自己想要的效果。
接线方法:VCC接3.3V、SCL接PB6、SDA接PB7.