合宙air001硬件spi驱动7针oled屏幕。

合宙air001真的便宜,只要0.7元

    他的hal库代码是稍微有一点点区别的

     评价:确实好用

上图

是不是很不错呢?

之前看到哪个大佬写的四针的驱动感觉非常不错,心想着能不能驱动7针,用硬件的方式

移植hal库

四针oled​​​​​​http://t.csdnimg.cn/FKMh9

这个是那位大佬写的,用gpio模拟翻转实现

七针oled代码如下

main.c

/**
  ******************************************************************************
  * @file    main.c
  * @author  MCU Application Team
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) AirM2M.
  * All rights reserved.</center></h2>
  *
  * <h2><center>&copy; Copyright (c) 2016 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
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "oled.h"

/* Private define ------------------------------------------------------------*/


/* Private variables ---------------------------------------------------------*/


DMA_HandleTypeDef HdmaCh1;
DMA_HandleTypeDef HdmaCh2;
DMA_HandleTypeDef HdmaCh3;

/* Private user code ---------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
static void APP_SystemClockConfig(void);


/**
  * @brief  应用程序入口函数.
  * @retval int
  */
int main(void)
{
  /* 复位所有外设,初始化flash接口和systick */
  HAL_Init();
  
  /* 时钟配置 */
  APP_SystemClockConfig();
  
  /* 初始化LED */
  BSP_LED_Init(LED_RED);

  /* 初始化按键BUTTON */
  BSP_PB_Init(BUTTON_KEY,BUTTON_MODE_GPIO);
  HAL_Delay(500);
 OLED_Init();
	
	HAL_Delay(500);
		OLED_ShowString(2,1,"aaaaa");
  while (1)
  {
//		OLED_Init();
//			OLED_ShowString(2,1,"aaaaa");
//		OLED_ShowString(2,1,"aaaaa");
		
  }
}

/**
  * @brief  系统时钟配置函数
  * @param  无
  * @retval 无
  */
static void APP_SystemClockConfig(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /*配置时钟源HSE/HSI/LSE/LSI*/
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;                                                      /* 开启HSI */
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_16MHz;                           /* 配置HSI输出时钟为16MHz */
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;                                                      /* HSI不分频 */
  RCC_OscInitStruct.HSEState = RCC_HSE_OFF;                                                     /* 关闭HSE */
  RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz;                                                 /* HSE工作频率范围16M~32M */
  RCC_OscInitStruct.LSIState = RCC_LSI_OFF;                                                     /* 关闭LSI */
  RCC_OscInitStruct.LSEState = RCC_LSE_OFF;                                                     /* 关闭LSE */
  RCC_OscInitStruct.LSEDriver = RCC_LSEDRIVE_MEDIUM;                                            /* LSE默认驱动能力 */
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;                                                  /* 关闭PLL */
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /* 初始化CPU,AHB,APB总线时钟 */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; /* RCC系统时钟类型 */
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;                                        /* SYSCLK的源选择为HSI */
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;                                            /* APH时钟不分频 */
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;                                             /* APB时钟不分频 */
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief  SPI1等待传输完成,并校验数据
  * @param  无
  * @retval 无
  */

/**
  * @brief  错误执行函数
  * @param  无
  * @retval 无
  */
void Error_Handler(void)
{
  /* 无限循环 */
  while (1)
  {
  }
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  输出产生断言错误的源文件名及行号
  * @param  file:源文件名指针
  * @param  line:发生断言错误的行号
  * @retval 无
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* 用户可以根据需要添加自己的打印信息,
     例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* 无限循环 */
  while (1)
  {
  }
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT AirM2M *****END OF FILE******************/

main.h

/**
  ******************************************************************************
  * @file    main.h
  * @author  MCU Application Team
  * @brief   Header for main.c file.
  *          This file contains the common defines of the application.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) AirM2M.
  * All rights reserved.</center></h2>
  *
  * <h2><center>&copy; Copyright (c) 2016 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
  *
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "air001xx_hal.h"
#include "air001_Core_Board.h"
#include "stdio.h"
#include <stdbool.h>

/* Private includes ----------------------------------------------------------*/
/* Private defines -----------------------------------------------------------*/
/* Exported variables prototypes ---------------------------------------------*/
extern DMA_HandleTypeDef HdmaCh1;
extern DMA_HandleTypeDef HdmaCh2;
extern DMA_HandleTypeDef HdmaCh3;
extern SPI_HandleTypeDef Spi1Handle;
extern uint8_t DmaOnFlag, DmaTxRxFlag;

/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);

#ifdef __cplusplus
}
#endif

#endif /* __MAIN_H */

/************************ (C) COPYRIGHT AirM2M *****END OF FILE******************/

spi.c

#include "spi.h"


uint8_t TxBuff[15] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
uint8_t RxBuff[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};


SPI_HandleTypeDef Spi1Handle;


void spi_init(void)
{
		/*反初始化SPI配置*/
	
	
	
	
	
	
	/*
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;			//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工 	       ok
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;														//设置SPI工作模式:设置为主SPI    ok
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;												//设置SPI的数据大小:SPI发送接收8位帧结构     ok
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;															//串行同步时钟的空闲状态为高电平 	       ok
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;														//串行同步时钟的第二个跳变沿(上升或下降)数据被采样  ok
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;																//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 	       ok
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;			//定义波特率预分频的值:波特率预分频值为2 	       ok
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;											//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始     ok
	SPI_InitStructure.SPI_CRCPolynomial = 7;	
————————————————                    
原文链接:https://blog.csdn.net/m0_46309225/article/details/127337279
	*/
			
	
			Spi1Handle.Instance               = SPI1;                       /* SPI1         ok */
			Spi1Handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2 ;    /* 2分频  	           ok*/
			Spi1Handle.Init.Direction         = SPI_DIRECTION_2LINES;       /* 全双工  	       ok*/
			Spi1Handle.Init.CLKPolarity       = SPI_POLARITY_HIGH ;           /* 时钟极性高 */
			Spi1Handle.Init.CLKPhase          = SPI_PHASE_2EDGE ;           /* 数据采样从第一个时钟边沿开始 ok*/
			Spi1Handle.Init.DataSize          = SPI_DATASIZE_8BIT;          /* SPI数据长度为8bit 	       ok*/
			Spi1Handle.Init.FirstBit          = SPI_FIRSTBIT_MSB;           /* 先发送MSB   						   ok*/
			Spi1Handle.Init.NSS               = SPI_NSS_SOFT;       			  /* NSS软件模式(硬件模式)      ok*/
			Spi1Handle.Init.Mode = SPI_MODE_MASTER;                         /* 配置为主机   					  	  ok*/
			if (HAL_SPI_DeInit(&Spi1Handle) != HAL_OK)
			{
				Error_Handler();
			}
//			
			/*SPI初始化*/
			if (HAL_SPI_Init(&Spi1Handle) != HAL_OK)
			{
				Error_Handler();
			}
			
//			/* 等待按键按下 */
//			while (BSP_PB_GetState(BUTTON_KEY) == 1)
//			{
//			}
//			
//			/*SPI DMA方式传输*/
//			if (HAL_SPI_TransmitReceive_DMA(&Spi1Handle, (uint8_t *)TxBuff, (uint8_t *)RxBuff, DARA_LENGTH) != HAL_OK)
//			{
//				Error_Handler();
//			}
//			
//			/* 等待传输结束并检查接收到的数据 */
//			APP_WaitAndCheckEndOfTransfer();
}





/以下为调用函数

static void APP_WaitAndCheckEndOfTransfer(void)
{
  /* 等待传输结束 */
  while (Spi1Handle.State != HAL_SPI_STATE_READY)
  {}

  /* 比较发送数据和接收数据 */
  if(APP_Buffercmp8((uint8_t*)TxBuff, (uint8_t*)RxBuff, DARA_LENGTH))
  {
    /* 错误处理 */
    APP_LedBlinking();
  }
  else
  {
    /* 如果数据接收到,则打开 LED */
    BSP_LED_On(LED_RED);
  }
}

/**
  * @brief  字符比较函数
  * @param  pBuffer1:待比较缓冲区1
  * @param  pBuffer2:待比较缓冲区2
  * @param  BufferLength:待比较字符的个数
  * @retval 0:比较值相同;1:比较值不同
  */
static uint8_t APP_Buffercmp8(uint8_t* pBuffer1, uint8_t* pBuffer2, uint8_t BufferLength)
{
  while (BufferLength--)
  {
    if (*pBuffer1 != *pBuffer2)
    {
      return 1;
    }
    pBuffer1++;
    pBuffer2++;
  }

  return 0;
}

/**
  * @brief  LED灯闪烁
  * @param  无
  * @retval 无
  */
static void APP_LedBlinking(void)
{
  while (1)
  {
    BSP_LED_Toggle(LED_RED);; 
    HAL_Delay(500);
  }
}
/*HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)*/

//written by li        2024 6.29

spi.h


#ifndef __SPI_H
#define __SPI_H
#define DARA_LENGTH       15


#include "main.h"

void spi_init(void);

static void APP_WaitAndCheckEndOfTransfer(void);
static uint8_t APP_Buffercmp8(uint8_t* pBuffer1, uint8_t* pBuffer2, uint8_t BufferLength);
static void APP_LedBlinking(void);



#endif

oled.c

#include "oled.h"
//PA7 为mosi miso
#include "oled_frog.h"

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 //初始化gpio
 //
 void gpio_init (void){
 GPIO_InitTypeDef  GPIO_InitStruct;
  __HAL_RCC_GPIOB_CLK_ENABLE();                          /* 使能GPIOB时钟 */
  __HAL_RCC_GPIOA_CLK_ENABLE();
	 
  GPIO_InitStruct.Pin = NSSS;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
  GPIO_InitStruct.Pull = GPIO_NOPULL;                    /* 使能上拉 */
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;          /* GPIO速度 */  
  /* dc初始化 */
  HAL_GPIO_Init(NSSP, &GPIO_InitStruct);    


	GPIO_InitStruct.Pin = CS;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
  GPIO_InitStruct.Pull = GPIO_NOPULL;                    /* 使能上拉 */
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;          /* GPIO速度 */  
  /* cs初始化 */
  HAL_GPIO_Init(CSP, &GPIO_InitStruct);  	 


	GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;            /* 推挽输出 */
  GPIO_InitStruct.Pull = GPIO_NOPULL;                    /* 使能上拉 */
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;          /* GPIO速度 */  
  /* miso mosi clk初始化 */
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);   

	 
		/*
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
			GPIO_Init(GPIOA, &GPIO_InitStructure)
			//此代码为标准库
		*/














 }
///
 
 
//读写命令
///
 uint8_t OLED_WriteCmd(uint8_t cmd)
{
		uint8_t RxData = 0;
		HAL_GPIO_WritePin(CSP,  CS, 0);//低电平片选
		HAL_GPIO_WritePin(NSSP,  NSSS, 0);//低电平写命令
		HAL_SPI_TransmitReceive(&Spi1Handle, &cmd, &RxData, 1, 500);
		HAL_GPIO_WritePin(CSP,  CS, 1);//高电平片选
	return RxData;
}


uint8_t OLED_WriteData(uint8_t Data)
{
		uint8_t RxData = 0;
		HAL_GPIO_WritePin(CSP,  CS, 0);//低电平片选
		HAL_GPIO_WritePin(NSSP,  NSSS, 1);//高电平写数据
		HAL_SPI_TransmitReceive(&Spi1Handle, &Data, &RxData, 1, 500);
		HAL_GPIO_WritePin(CSP,  CS, 1);//高电平片选
	return RxData;
}
//


















///
/**
  * @brief  OLED设置光标位置
  * @param  Y 以左上角为原点,向下方向的坐标,范围:0~7
  * @param  X 以左上角为原点,向右方向的坐标,范围:0~127
  * @retval 无
  */
	
	void OLED_SPI_Init(void)
{

	gpio_init ();
	spi_init();
	
	
	
	
}
/*此方案为软件spi协议*/
	
	
	
	
	
	
	
	
	
	
	
	
	
	
void OLED_SetCursor(uint8_t Y, uint8_t X)
{
	OLED_WriteCmd(0xB0 | Y);									//设置Y位置
	OLED_WriteCmd(0x10 | ((X & 0xF0) >> 4));	//设置X位置高4位
	OLED_WriteCmd(0x00 | (X & 0x0F));					//设置X位置低4位
}

/**
  * @brief  OLED清屏
  * @param  无
  * @retval 无
  */
void OLED_Clear(void)
{  
	uint8_t i, j;
	for (j = 0; j < 8; j++)
	{
		OLED_SetCursor(j, 0);
		for(i = 0  ; i < 128; i++)
		{
			OLED_WriteData(0x00);
		}
	}
}

/**
  * @brief  OLED显示一个字符
  * @param  Line 行位置,范围:1~4
  * @param  Column 列位置,范围:1~16
  * @param  Char 要显示的一个字符,范围:ASCII可见字符
  * @retval 无
  */
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{      	
	uint8_t i;
	OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);		//设置光标位置在上半部分
	for (i = 0; i < 8; i++)
	{
		OLED_WriteData(OLED_F8x16[Char - ' '][i]);			//显示上半部分内容
	}
	OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//设置光标位置在下半部分
	for (i = 0; i < 8; i++)
	{
		OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);		//显示下半部分内容
	}
}

/**
  * @brief  OLED显示字符串
  * @param  Line 起始行位置,范围:1~4
  * @param  Column 起始列位置,范围:1~16
  * @param  String 要显示的字符串,范围:ASCII可见字符
  * @retval 无
  */
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i++)
	{
		OLED_ShowChar(Line, Column + i, String[i]);
	}
}

/**
  * @brief  OLED显示汉字
  * @param  Line 起始行位置,范围:1~4
  * @param  Column 起始列位置,范围:1~16
  * @param  No:要显示汉字的个数
  * @param  Length 要显示数字的长度,范围:1~16
  * @retval 无
  */
void OLED_ShowChinese(uint8_t Line,uint8_t Column,uint8_t No)
{
	uint8_t i;
	OLED_SetCursor((Line-1)*2,(Column-1)*16);
	for(i=0;i<16;i++)
	{
		OLED_WriteData(Chinese[2*No][i]);
	}
	OLED_SetCursor((Line-1)*2+1,(Column-1)*16);
	for(i=0;i<16;i++)
	{
		OLED_WriteData(Chinese[2*No+1][i]);
	}
}

/**
  * @brief  OLED显示图像
  * @param  Row1 起始行位置,范围:0~8
  * @param  Column1 起始列位置,范围:0~128
  * @param  Row2 起始行位置,范围:0~8
  * @param  Column2 起始列位置,范围:0~128
  * @param  BMP1:要显示gif的数组
  * @retval 无
  */
void OLED_ShowBMP(uint8_t Row1, uint8_t Column1,uint8_t Row2, uint8_t Column2,uint8_t BMP1[])
{     
 unsigned int i=0;
 unsigned char x,y;
  
//  if(y1%8==0) y=y1/8;      
//  else y=y1/8+1;
    for(x=Row1;x<Row2;x++)
    {
        OLED_SetCursor(x,Column1);
    for(y=Column1;y<Column2;y++)
        {      
            OLED_WriteData(BMP1[i++]);            
        }
    }
} 

/**
  * @brief  OLED次方函数
  * @retval 返回值等于X的Y次方
  */
uint32_t OLED_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y--)
	{
		Result *= X;
	}
	return Result;
}

/**
  * @brief  OLED显示数字(十进制,正数)
  * @param  Line 起始行位置,范围:1~4
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~4294967295
  * @param  Length 要显示数字的长度,范围:1~10
  * @retval 无
  */
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');
	}
}

/**
  * @brief  OLED显示数字(十进制,带符号数)
  * @param  Line 起始行位置,范围:1~4
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:-2147483648~2147483647
  * @param  Length 要显示数字的长度,范围:1~10
  * @retval 无
  */
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{
	uint8_t i;
	uint32_t Number1;
	if (Number >= 0)
	{
		OLED_ShowChar(Line, Column, '+');
		Number1 = Number;
	}
	else
	{
		OLED_ShowChar(Line, Column, '-');
		Number1 = -Number;
	}
	for (i = 0; i < Length; i++)							
	{
		OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');
	}
}

/**
  * @brief  OLED显示数字(十六进制,正数)
  * @param  Line 起始行位置,范围:1~4
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~0xFFFFFFFF
  * @param  Length 要显示数字的长度,范围:1~8
  * @retval 无
  */
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
	uint8_t i, SingleNumber;
	for (i = 0; i < Length; i++)							
	{
		SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;
		if (SingleNumber < 10)
		{
			OLED_ShowChar(Line, Column + i, SingleNumber + '0');
		}
		else
		{
			OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');
		}
	}
}

/**
  * @brief  OLED显示数字(二进制,正数)
  * @param  Line 起始行位置,范围:1~4
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
  * @param  Length 要显示数字的长度,范围:1~16
  * @retval 无
  */
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');
	}
}


void OLED_CloseRoll(void)
{
    //以下添加水平滚动效果
    OLED_WriteCmd(0x2e);//关滚动
    OLED_WriteCmd(0x2a);//29向右,2a向左
    OLED_WriteCmd(0x00);//A:空字节
    OLED_WriteCmd(0x00);//B:水平起始页
    OLED_WriteCmd(0x07);//C:水平滚动速度
    OLED_WriteCmd(0x07);//D:水平结束页
    OLED_WriteCmd(0x00);//E:每次垂直滚动位移
//    OLED_WriteCmd(0x2f);//开滚动
}
void OLED_OpenRoll(void)
{
    //以下添加水平滚动效果
    OLED_WriteCmd(0x2f);//开滚动
}

/**
  * @brief  OLED初始化
  * @param  无
  * @retval 无
  */
void OLED_Init(void)
{
	HAL_Delay(500);	//上电延时一小会
	
	OLED_SPI_Init();			//端口初始化
	
	OLED_WriteCmd(0xAE);	//关闭显示
	
	OLED_WriteCmd(0xD5);	//设置显示时钟分频比/振荡器频率
	OLED_WriteCmd(0x80);
	
	OLED_WriteCmd(0xA8);	//设置多路复用率
	OLED_WriteCmd(0x3F);
	
	OLED_WriteCmd(0xD3);	//设置显示偏移
	OLED_WriteCmd(0x00);
	
	OLED_WriteCmd(0x40);	//设置显示开始行
	
	OLED_WriteCmd(0xA1);	//设置左右方向,0xA1正常 0xA0左右反置
	
	OLED_WriteCmd(0xC8);	//设置上下方向,0xC8正常 0xC0上下反置

	OLED_WriteCmd(0xDA);	//设置COM引脚硬件配置
	OLED_WriteCmd(0x12);
	
	OLED_WriteCmd(0x81);	//设置对比度控制
	OLED_WriteCmd(0xCF);

	OLED_WriteCmd(0xD9);	//设置预充电周期
	OLED_WriteCmd(0xF1);

	OLED_WriteCmd(0xDB);	//设置VCOMH取消选择级别
	OLED_WriteCmd(0x30);

	OLED_WriteCmd(0xA4);	//设置整个显示打开/关闭

	OLED_WriteCmd(0xA6);	//设置正常/倒转显示

	OLED_WriteCmd(0x8D);	//设置充电泵
	OLED_WriteCmd(0x14);

	OLED_WriteCmd(0xAF);	//开启显示
		
	OLED_Clear();				//OLED清屏
}










//written by li  2024.6 29

oled.h 

#ifndef __OLED_H
#define __OLED_H


 #define NSSS  GPIO_PIN_2
  #define NSSP   GPIOB
 #define CS  GPIO_PIN_6
 #define CSP  GPIOB




#include "spi.h"


 void gpio_init (void);//高低电平读写命令

 uint8_t OLED_WriteCmd(uint8_t cmd);
uint8_t OLED_WriteData(uint8_t Data);
//

void OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowChinese(uint8_t Line,uint8_t Column,uint8_t No);
void OLED_ShowBMP(uint8_t Row1, uint8_t Column1,uint8_t Row2, uint8_t Column2,uint8_t BMP1[]);
void OLED_ShowChinese(uint8_t Line,uint8_t Column,uint8_t No);




#endif

工程源码地址luatos-soc-air001-master\ModuleDemo\SPI\Example_HAL

打开文件夹自己找!

工程在最上面置顶文件里,直接下载,免费,开源。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值