1.stm32使用SSD1322 驱动3.12寸OLED

SSD1322 驱动3.12寸OLED

OLED型号:3.12LED屏模块-TW56640320B03

驱动器IC: SSD1322

传输方式:SPI(用IO口模拟SPI)

接线:SCLK→PB13 SDIN→PB15 DC#→PB4 RES#→PB3 CS#→GND

单片机: stm32f103ret6

驱动代码

cpp 复制代码
//OLED.c
#include "gpio.h"
#include "OLED.h"
#include <stdio.h>

// GPIO初始化
void OLED_GPIO_Init() {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOB_CLK_ENABLE();

    // 配置SCLK、SDIN、DC、RES、CS为推挽输出
    GPIO_InitStruct.Pin = OLED_SCLK_PIN | OLED_SDIN_PIN | OLED_DC_PIN | OLED_RES_PIN ;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 硬件复位序列

    HAL_GPIO_WritePin(OLED_RES_PORT, OLED_RES_PIN, GPIO_PIN_RESET);
    HAL_Delay(20);
    HAL_GPIO_WritePin(OLED_RES_PORT, OLED_RES_PIN, GPIO_PIN_SET);
    HAL_Delay(100);
} 

// 写命令
void Write_Command(uint8_t cmd) {
    HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_RESET); // DC=0
	  
    for(uint8_t i=0; i<8; i++) {
        HAL_GPIO_WritePin(OLED_SCLK_PORT, OLED_SCLK_PIN, GPIO_PIN_RESET);
         __NOP();
        HAL_GPIO_WritePin(OLED_SDIN_PORT, OLED_SDIN_PIN, (cmd & 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET);
       __NOP();
			  cmd <<= 1;
        HAL_GPIO_WritePin(OLED_SCLK_PORT, OLED_SCLK_PIN, GPIO_PIN_SET);
       __NOP();
        
    }
		HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_SET); // DC=1
     __NOP();
}
// 写数据
void Write_Data(uint8_t data) {
    HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_SET); // DC=1
    for(uint8_t i=0; i<8; i++) {
        HAL_GPIO_WritePin(OLED_SCLK_PORT, OLED_SCLK_PIN, GPIO_PIN_RESET);
		 __NOP();
        HAL_GPIO_WritePin(OLED_SDIN_PORT, OLED_SDIN_PIN, (data & 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET);
		 __NOP();
        data <<= 1;
        HAL_GPIO_WritePin(OLED_SCLK_PORT, OLED_SCLK_PIN, GPIO_PIN_SET);
     __NOP();
			  
    }
}

// SSD1322初始化
void OLED_Init(void)
{
	
  OLED_GPIO_Init();
	HAL_GPIO_WritePin(OLED_RES_PORT, OLED_RES_PIN, GPIO_PIN_RESET); //oled reset
	HAL_Delay(10);
  HAL_GPIO_WritePin(OLED_RES_PORT, OLED_RES_PIN, GPIO_PIN_SET);

	Write_Command(0xfd);  /*Command Lock*/ 
	Write_Data(0x12);
	
	Write_Command(0xae); //Sleep In 
	
	Write_Command(0xb3);	//Set Display Clock Divide Ratio/Oscillator Frequency 
	Write_Data(0x91);
	
	Write_Command(0xca);	//Set Multiplex Ratio 
	Write_Data(0x3f);
	
	Write_Command(0xa2);	//Set Display Offset 
	Write_Data(0x00);	//
	
	Write_Command(0xa1);	//Set Display Start Line 
	Write_Data(0x00);	//
	
	Write_Command(0xa0);	//Set Re-Map $ Dual COM Line Mode

	Write_Data(0x14);

	Write_Command(0xB5);	//Set GPIO 
	Write_Data(0x00);
		
	Write_Command(0xab);	//Function Selection
	Write_Data(0x01);	//
	
	Write_Command(0xb4);	//Enable External VSL 
	Write_Data(0xa0);	//
	Write_Data(0xfd);	//
	
	Write_Command(0xc1);	//Set Contrast Current
	Write_Data(0xff);	
	
	Write_Command(0xc7);	//Master Contrast Current Control
	Write_Data(0x0f);	//

	Write_Command(0xb9);	//Select Default Linear Gray Scale Table 
	
	Write_Command(0xb1);	//Set Phase Length
	Write_Data(0xe2);	
	
	Write_Command(0xd1);	//Enhance Driving Scheme Capability 
	Write_Data(0x82);	
	Write_Data(0x20);	

	Write_Command(0xbb);	//Set Pre-Charge Voltage 
	Write_Data(0x1f);	

	Write_Command(0xb6);	//Set Second Pre-Charge Period 
	Write_Data(0x08);	

	Write_Command(0xbe);	//Set VCOMH Deselect Level 
	Write_Data(0x07);		

	Write_Command(0xa6);	//Set Display Mode
	
	fill(0,0);   //Clear Screen

	Write_Command(0xaf);	//Sleep Out
}

// 清屏
void OLED_Clear() {
    Write_Command(0x15); Write_Data(0x00); Write_Data(0x7F); // 列地址
    Write_Command(0x75); Write_Data(0x00); Write_Data(0x3F); // 行地址
    Write_Command(0x5C); // 进入数据模式
    for(uint16_t i=0; i<128*64/2; i++) Write_Data(0x00); // 全屏熄灭
}

void fill2(uint8_t brightness) {
    Write_Command(0x15); Write_Data(0x00); Write_Data(0x7F); // 列地址
    Write_Command(0x75); Write_Data(0x00); Write_Data(0x3F); // 行地址
    Write_Command(0x5C); // 进入数据模式
    for(uint16_t i=0; i<128*64; i++) Write_Data(brightness & 0x0F); // 4位数据
}

void  fill(unsigned dat1,unsigned char dat2){
		unsigned char x,y; 
		Write_Command(0x15); /*SET SECOND PRE-CHARGE PERIOD*/
		Write_Data(0x00); Write_Data(0x77);
		Write_Command(0x75);
		Write_Data(0x00);Write_Data(0x7f);
		Write_Command(0x5c);
		for(y=0;y<128;y++)
	  {
		for(x=0;x<120;x++)
    Write_Data(dat1);
    Write_Data(dat2);
		}
}
cpp 复制代码
//OLEO.h
#ifndef __OLED_H
#define __OLED_H

#include "stm32f1xx_hal.h"

#define OLED_SCLK_PIN    GPIO_PIN_13
#define OLED_SCLK_PORT   GPIOB
#define OLED_SDIN_PIN    GPIO_PIN_15
#define OLED_SDIN_PORT   GPIOB
#define OLED_DC_PIN      GPIO_PIN_4
#define OLED_DC_PORT     GPIOB
#define OLED_RES_PIN     GPIO_PIN_3
#define OLED_RES_PORT    GPIOB

extern uint8_t OLED_Buff[128][120]; // 128行 x 120列(每字节2像素)
// 函数声明
void OLED_Init(void);
void Write_Command(uint8_t cmd);
void Write_Data(uint8_t data);
void OLED_Clear(void);
void OLED_DrawPixel(uint8_t x, uint8_t y, uint8_t brightness);

void OLED_TestPattern(void);
void Test_OLED_Simple(void);
void fill2(uint8_t brightness);
void  fill(unsigned dat1,unsigned char dat2);

#endif
cpp 复制代码
//main.c
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "stm32f1xx_hal.h"
#include "OLED.h"
#include "led.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();
  /* USER CODE BEGIN 2 */
  led_init();
	OLED_Init();
	fill(0xff, 0xff); // 全屏白色
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
        LED0(0);                                /* LED0 亮 */
        LED1(1);                                /* LED1 灭 */
        HAL_Delay(500);
        LED0(1);                                /* LED0 灭 */
        LED1(0);                                /* LED1 亮 */
        HAL_Delay(500);
    /* 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 */

现象:全屏点亮

相关推荐
小智学长 | 嵌入式2 小时前
单片机-STM32部分:10-2、逻辑分析仪
stm32·单片机·嵌入式硬件
美好的事情总会发生3 小时前
ROM详解
嵌入式硬件·硬件工程·智能硬件
喜欢下雨t4 小时前
【嵌入式———SPI的基本操作——实验需求:案列1:软件模拟实现SPI协议和STM32的SPI模块实现(硬件实现)】
stm32·单片机·嵌入式硬件
腾飞的信仰10 小时前
51单片机同一个timer 作为定时器和波特率发生器么?
网络·单片机·51单片机
思考的味道14 小时前
系统的从零开始学习电子的相关知识,该如何规划?
嵌入式硬件
猿饵块16 小时前
STM32--PWM--函数
stm32·单片机·嵌入式硬件
学习噢学个屁16 小时前
基于51单片机步进电机控制—9个等级
c语言·单片机·嵌入式硬件·51单片机
GXSC18 小时前
国芯思辰| 医疗AED可使用2通道24位模拟前端SC2946(ADS1292)
嵌入式硬件
LaoZhangGong12318 小时前
分析rand()和srand()函数的功能
c语言·经验分享·stm32·单片机