1.cubemx设置
2.驱动代码
- oled.c
#include "oled.h"
#include <string.h>
#include "spi.h"
#include "gpio.h"
#include "Delay.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RES_Clr() HAL_GPIO_WritePin(OLED_RES_GPIO_Port,OLED_RES_Pin,GPIO_PIN_RESET)//RES
#define OLED_RES_Set() HAL_GPIO_WritePin(OLED_RES_GPIO_Port,OLED_RES_Pin,GPIO_PIN_SET)
#define OLED_DC_Clr() HAL_GPIO_WritePin(OLED_DC_GPIO_Port,OLED_DC_Pin,GPIO_PIN_RESET)//DC
#define OLED_DC_Set() HAL_GPIO_WritePin(OLED_DC_GPIO_Port,OLED_DC_Pin,GPIO_PIN_SET)
#define OLED_CS_Clr() HAL_GPIO_WritePin(OLED_CS_GPIO_Port,OLED_CS_Pin,GPIO_PIN_RESET)//CS
#define OLED_CS_Set() HAL_GPIO_WritePin(OLED_CS_GPIO_Port,OLED_CS_Pin,GPIO_PIN_SET)
#define SSD1309_COMMAND 0x00
#define SSD1309_DATA 0x01
uint8_t screenBuffer[128][8] ;
static void SSD1309_Reset(void)
{
OLED_RES_Set();
rt_hw_us_delay(100);
OLED_RES_Clr();
rt_hw_us_delay(100);
OLED_RES_Set();
rt_hw_us_delay(100);
}
void SSD1309_SendByte(uint8_t byte, uint8_t dc)
{
OLED_CS_Clr();
if (dc == SSD1309_COMMAND)
{
OLED_DC_Clr();
}
else
{
OLED_DC_Set();
}
//HAL_SPI_Transmit(&hspi2, &byte, 1, HAL_MAX_DELAY);
HAL_SPI_Transmit_IT(&hspi2,&byte, 1);
// for(uint8_t i=0;i<8;i++)
// {
// HAL_GPIO_WritePin(OLED_SCL_GPIO_Port, OLED_SCL_Pin, GPIO_PIN_RESET);
//
// /*先传高位*/
// if (byte & 0x80)
// {
// HAL_GPIO_WritePin(OLED_SDA_GPIO_Port, OLED_SDA_Pin, GPIO_PIN_SET);
// }
// else
// {
// HAL_GPIO_WritePin(OLED_SDA_GPIO_Port, OLED_SDA_Pin, GPIO_PIN_RESET);
// }
//
// HAL_GPIO_WritePin(OLED_SCL_GPIO_Port, OLED_SCL_Pin, GPIO_PIN_SET);
// byte <<= 1;
// }
OLED_CS_Set();
}
//更新显存到OLED
void OLED_Update(void)
{
uint8_t i,n;
for(i=0;i<8;i++)
{
SSD1309_SendByte(0xb0+i,SSD1309_COMMAND); //设置行起始地址
SSD1309_SendByte(0x00,SSD1309_COMMAND); //设置低列起始地址
SSD1309_SendByte(0x10,SSD1309_COMMAND); //设置高列起始地址
for(n=0;n<128;n++)
{
SSD1309_SendByte(screenBuffer[n][i],SSD1309_DATA);
}
}
}
//清屏函数
void OLED_ClearScreen(void)
{
uint8_t i,n;
for(i=0;i<8;i++)
{
for(n=0;n<128;n++)
{
screenBuffer[n][i]=0x00;
}
}
OLED_Update();//更新显示
}
//画点
//x:0~127
//y:0~63
//t:1 填充 0,清空
void OLED_DrawPixel(int x, int y, unsigned int t)
{
uint8_t i,m,n;
i=y/8;
m=y%8;
n=(uint8_t)1<<m;
if(t)
{
screenBuffer[x][i]|=n;
}
else
{
screenBuffer[x][i]=~screenBuffer[x][i];
screenBuffer[x][i]|=n;
screenBuffer[x][i]=~screenBuffer[x][i];
// screenBuffer[x][i] &= ~n;
}
}
int OLED_ReadPixel(int x, int y)
{
uint8_t i,m,n;
i=x/8;
m=x%8;
n=(uint8_t)1<<m;
if(screenBuffer[y][i]&&n)
return 1;
else
return 0;
}
void SSD1309_SetBrightness(uint8_t brightness)
{
SSD1309_SendByte(0x81,SSD1309_COMMAND);//命令字节:0x81
SSD1309_SendByte(brightness,SSD1309_COMMAND);//数据字节:0x7F (对比度值,可以根据需要进行调整)
}
//OLED的初始化
void OLED_Init(void)
{
SSD1309_Reset();
//设置解除lock状态
SSD1309_SendByte(0xFD,SSD1309_COMMAND);//命令字节:0xFD
SSD1309_SendByte(0x12,SSD1309_COMMAND);//数据字节1:0x12
//关闭显示:
SSD1309_SendByte(0xAE,SSD1309_COMMAND);//命令字节:0xAE
//设置列地址范围(Column Address Range):
SSD1309_SendByte(0x21,SSD1309_COMMAND);//命令字节:0x21
SSD1309_SendByte(0x00,SSD1309_COMMAND);//(起始列地址)
SSD1309_SendByte(0x7F,SSD1309_COMMAND);//数据字节2:0x7F (结束列地址,对应127列)
//设置页地址范围(Page Address Range):
SSD1309_SendByte(0x22,SSD1309_COMMAND);//命令字节:0x22
SSD1309_SendByte(0x00,SSD1309_COMMAND);//数据字节1:0x00 (起始页地址)
SSD1309_SendByte(0x07,SSD1309_COMMAND);//数据字节2:0x07 (结束页地址,对应7页)
//设置显示模式:
SSD1309_SendByte(0xA0,SSD1309_COMMAND);//命令字节:0xA0 (设置段重定向模式,正常模式)
SSD1309_SendByte(0xC0,SSD1309_COMMAND);//命令字节:0xC0 (设置COM扫描方向,从COM0到COM[N-1])
//设置对比度控制:
SSD1309_SendByte(0x81,SSD1309_COMMAND);//命令字节:0x81
SSD1309_SendByte(0x7F,SSD1309_COMMAND);//数据字节:0x7F (对比度值,可以根据需要进行调整)
//设置内存地址模式:
SSD1309_SendByte(0x20,SSD1309_COMMAND);//命令字节:0x20
SSD1309_SendByte(0x02,SSD1309_COMMAND);//数据字节:0x02 (设置为页寻址模式);00,列地址模式;01,行地址模式;10,页地址模式;默认10;
//设置显示偏移量(Display Offset):
SSD1309_SendByte(0xD3,SSD1309_COMMAND);//命令字节:0xD3
SSD1309_SendByte(0x00,SSD1309_COMMAND);//数据字节:0x00 (偏移量为0)
//设置SEG/Column 的Mapping
SSD1309_SendByte(0xA1,SSD1309_COMMAND);// 0xa0左右反置 0xa1正常
//设置COM/Row的显示方向
SSD1309_SendByte(0xC8,SSD1309_COMMAND);//0xc0上下反置 0xc8正常
//设置显示时钟分频器(Display Clock Divider):
SSD1309_SendByte(0xD5,SSD1309_COMMAND);//命令字节:0xD5
SSD1309_SendByte(0xA0,SSD1309_COMMAND);//数据字节:0xF0 (默认分频器值)
//设置多路复用比率
SSD1309_SendByte(0xA8,SSD1309_COMMAND); //Set Multiplex Ratio
SSD1309_SendByte(0x3F,SSD1309_COMMAND); //
//设置预充电周期(Pre-charge Period):
SSD1309_SendByte(0xD9,SSD1309_COMMAND);//命令字节:0xD9
SSD1309_SendByte(0x22,SSD1309_COMMAND);//数据字节:0x22 (默认预充电周期值)
//设置COM引脚配置:
SSD1309_SendByte(0xDA,SSD1309_COMMAND);//命令字节:0xDA
SSD1309_SendByte(0x12,SSD1309_COMMAND);//数据字节:0x12 (默认COM引脚配置值)
//设置VCOMH电压倍数:
SSD1309_SendByte(0xDB,SSD1309_COMMAND);//命令字节:0xDB
SSD1309_SendByte(0x20,SSD1309_COMMAND);//数据字节:0x20 (默认VCOMH电压倍数值)
//设置电源控制:
SSD1309_SendByte(0x8D,SSD1309_COMMAND);//命令字节:0x8D
SSD1309_SendByte(0x14,SSD1309_COMMAND);//数据字节:0x14 (开启电源)
//清屏
OLED_ClearScreen();
//开启显示:
SSD1309_SendByte(0xAF,SSD1309_COMMAND);//命令字节:0xAF
}
#ifndef __OLED_H
#define __OLED_H
#include "main.h"
#include "stdlib.h"
void OLED_Update(void);
void OLED_ClearScreen(void);
void OLED_DrawPixel(int x, int y, unsigned int color);
int OLED_ReadPixel(int x, int y);
//void SSD1309_SetBrightness(uint8_t brightness);
void OLED_Init(void);
#endif