合宙air001真的便宜,只要0.7元
他的hal库代码是稍微有一点点区别的
评价:确实好用
上图
是不是很不错呢?
之前看到哪个大佬写的四针的驱动感觉非常不错,心想着能不能驱动7针,用硬件的方式
移植hal库
四针oledhttp://t.csdnimg.cn/FKMh9
这个是那位大佬写的,用gpio模拟翻转实现
七针oled代码如下
main.c
/**
******************************************************************************
* @file main.c
* @author MCU Application Team
* @brief Main program body
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) AirM2M.
* All rights reserved.</center></h2>
*
* <h2><center>© 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>© Copyright (c) AirM2M.
* All rights reserved.</center></h2>
*
* <h2><center>© 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
打开文件夹自己找!
工程在最上面置顶文件里,直接下载,免费,开源。