STM32F10X OLED屏幕点亮
本节实现点亮OLED屏
首先去原理图中查找对应引脚
配置上述的IO口
查看对应的原理图
OLED_CS 和 OLED_RES(PB6,PB7)
就是配置为推挽输出
OLED_SCLK 和 OLED_SDIN (PB13 PB15)
OLED_D/C (PE12) 推挽输出
就是配置为复用推挽输出
代码展示
OLED.h
#ifndef _OLED_H_
#define _OLED_H_
#include "stm32f10x.h"
#define OLED_RES_H GPIO_SetBits (GPIOB, GPIO_Pin_6)
#define OLED_RES_L GPIO_ResetBits (GPIOB, GPIO_Pin_6)
#define OLED_CS_H GPIO_SetBits (GPIOB, GPIO_Pin_7)
#define OLED_CS_L GPIO_ResetBits (GPIOB, GPIO_Pin_7)
#define OLED_DC_H GPIO_SetBits (GPIOB, GPIO_Pin_12)
#define OLED_DC_L GPIO_ResetBits (GPIOB, GPIO_Pin_12)
void OLED_Init(void);
#endif
OLED.c
#include "oled.h"
#include "delay.h"
函数功能:OLED_SPI管脚初始化
OLED_SCK --- PB13 – 复用推挽输出输出
OLED_MOSI – PB15 – 复用推挽输出输出
OLED_CS -- PB7 - 推挽输出
void OLED_SPI_PinInit(void)
{
//打开GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//初始化GPIO口为推挽输出
GPIO_InitTypeDef GPIO_InitStruct;//结构体变量,会申请空间
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init (GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_Init (GPIOB, &GPIO_InitStruct);
//打开SPI2时钟
RCC_APB1PeriphClockCmd (RCC_APB1Periph_SPI2, ENABLE);
//初始化SPI2
SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双向单向 - 全双工
SPI_InitStruct.SPI_Mode = SPI_Mode_Master; //主机模式
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; //数据宽度 8bit
SPI_InitStruct.SPI_CPOL = SPI_CPOL_High; //空闲高电平
SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; //后沿采集 -- MODE3
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; //使能软件从器件
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//18MHz
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
SPI_InitStruct.SPI_CRCPolynomial = 7; //默认值
SPI_Init (SPI2, &SPI_InitStruct);
//使能SPI2
SPI_Cmd (SPI2, ENABLE);
}
函数功能:OLED_SPI传输字节函数
函数形参:待传输的字节
void OLED_SPI_TransferByte(u8 sByte)
{
//等待发送缓冲区为空
while(SPI_I2S_GetFlagStatus (SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI2->DR = sByte;
//等待接收缓冲区不为空 == 不能省略
while(SPI_I2S_GetFlagStatus (SPI2, SPI_I2S_FLAG_RXNE) == RESET);
}
函数功能:OLED管脚初始化
OLED_SCK --- PB13 – 复用推挽输出输出
OLED_MOSI – PB15 – 复用推挽输出输出
OLED_CS -- PB7 - 推挽输出
OLED_DC -- PB12 – 推挽输出
OLED_RES –- PB6 – 推挽输出
void OLED_PinInit(void)
{
OLED_SPI_PinInit( ); //直接调用上面SPI管脚初始化
//打开GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//初始化GPIO口为推挽输出
GPIO_InitTypeDef GPIO_InitStruct;//结构体变量,会申请空间
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_12;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init (GPIOB, &GPIO_InitStruct);
OLED_RES_H;//不复位
OLED_CS_H;//不选中从机
}
函数功能:OLED发送命令函数
函数形参:待发送的命令
void OLED_SendCommand(u8 cmd)
{
OLED_CS_L;//拉低片选
OLED_DC_L;//拉低 - 命令
OLED_SPI_TransferByte(cmd);
OLED_CS_H;//拉高片选
}
函数功能:OLED发送数据函数
函数形参:待发送的数据
void OLED_SendData(u8 data)
{
OLED_CS_L;//拉低片选
OLED_DC_H;//拉高 - 数据
OLED_SPI_TransferByte(data);
OLED_CS_H;//拉高片选
}
函数功能:OLED清屏
void OLED_Clear(void)
{
u8 i, j;
for(i = 0; i < 8; i++)//控制页地址
{
//设置起始位置 第i页第0列
OLED_SendCommand(0xB0 | i);//设置起始页地址
OLED_SendCommand(0x00);//设置列地址低四位
OLED_SendCommand(0x10);//设置列地址高四位
for(j = 0; j < 128; j++)//控制列数
{
//发送数据
OLED_SendData(0x0F);
}
}
}
函数功能:OLED初始化
函数形参:None
函数返回值:None
备注:厂家提供的初始化序列
void OLED_Init(void)
{
OLED_PinInit( );//管脚初始化
OLED_RES_H;
delay_ms(100);
OLED_RES_L;
delay_ms(100);
OLED_RES_H;
delay_ms(100);
OLED_SendCommand(0xAE); //关闭显示
OLED_SendCommand(0xD5); //设置时钟分频因子,震荡频率
OLED_SendCommand(80); //[3:0],分频因子;[7:4],震荡频率
OLED_SendCommand(0xA8); //设置驱动路数
OLED_SendCommand(0X3F); //默认0X3F(1/64)
OLED_SendCommand(0xD3); //设置显示偏移
OLED_SendCommand(0X00); //默认为0
OLED_SendCommand(0x40); //设置显示开始行 [5:0],行数.
OLED_SendCommand(0x8D); //电荷泵设置
OLED_SendCommand(0x14); //bit2,开启/关闭
OLED_SendCommand(0x20); //设置内存地址模式
OLED_SendCommand(0x02); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
OLED_SendCommand(0xA1); //段重定义设置,bit0:0,0->0;1,0->127;
OLED_SendCommand(0xC8); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
OLED_SendCommand(0xDA); //设置COM硬件引脚配置
OLED_SendCommand(0x12); //[5:4]配置
OLED_SendCommand(0x81); //对比度设置
OLED_SendCommand(0xEF); //1~255;默认0X7F (亮度设置,越大越亮)
OLED_SendCommand(0xD9); //设置预充电周期
OLED_SendCommand(0xf1); //[3:0],PHASE 1;[7:4],PHASE 2;
OLED_SendCommand(0xDB); //设置VCOMH 电压倍率
OLED_SendCommand(0x30); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
OLED_SendCommand(0xA4); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
OLED_SendCommand(0xA6); //设置显示方式;bit0:1,反相显示;0,正常显示
OLED_SendCommand(0xAF); //开启显示
//清屏
OLED_Clear( );
}