OLED的简单使用
将江科大的标准库开发OLED的代码进行移植,修改的部分代码如下:
/*引脚配置*/
//#define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x))
//#define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))
void OLED_W_SCL(uint16_t num)//SCL连接这PB8引脚
{
if(num == 0)//记住这里只能用0来进行判断
{
GPIOB->ODR &= ~GPIO_ODR_ODR8;
}
if(num != 0)
{
GPIOB->ODR |= GPIO_ODR_ODR8;
}
}
void OLED_W_SDA(uint16_t num)//SCL连接这PB9引脚
{
if(num == 0)
{
GPIOB->ODR &= ~GPIO_ODR_ODR9;
}
if(num != 0)
{
GPIOB->ODR |= GPIO_ODR_ODR9;
}
}
/*引脚初始化*/
void OLED_I2C_Init(void)
{
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/*1.开启时钟 */
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//开启时钟
// GPIO_InitTypeDef GPIO_InitStructure;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
/*2. 配置引脚PB8和PB9:通用开漏输出模式*/
/*2.1 PB8:MODE8 = 11,CNF8 = 01*/
GPIOB->CRH |= GPIO_CRH_MODE8;
GPIOB->CRH |= GPIO_CRH_CNF8_0;
GPIOB->CRH &= ~GPIO_CRH_CNF8_1;
/*2.2 PB9:MODE9 = 11,CNF8 = 01*/
GPIOB->CRH |= GPIO_CRH_MODE9;
GPIOB->CRH |= GPIO_CRH_CNF9_0;
GPIOB->CRH &= ~GPIO_CRH_CNF9_1;
OLED_W_SCL(1);
OLED_W_SDA(1);
}
综上:只是将软件模拟I2C的引脚由标准库配置模式改为寄存器配置模式,其他的代码不变。
测试代码如下:
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
int main(void)
{
OLED_Init();
OLED_Clear();
OLED_ShowString(1,1,"nihao");
OLED_ShowNum(2,1,50,2);
OLED_ShowChar(3,1,'B');
while(1)
{
}
}