STM32--SPI&IIC使用OLED

一、0.96寸 OLED 模块简介

0.96寸 OLED(128×64分辨率)模块,128×64分辨率即 OLED 显示横坐标有 128 个像素格,纵

坐标有 64 个像素格,但是由于 OLED 不能一次控制一个点阵,只能控制 8 个点阵,而且是垂直方

向扫描控制,因此垂直方向坐标可选为 0~7 页(一页 8 个像素格),水平方向可选坐标 0~128。

一般一个中文字体占 16×16 个像素格,字母以及符号占 8×16 个像素格。

二、0.96 寸 OLED 模块接口定义:

SPI接口模块:(更快)

SPI接口一般使用四条信号线通信:

SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)

1、GND                电源地

2、VCC                电源正(3~5.5V)

3、D0                   OLED 的 D0 脚,在 SPI通信中为时钟管脚

4、D1                   OLED 的 D1 脚,在 SPI通信中为数据管脚

5、CS                   OLED 的 CS 管脚,片选管脚

6、DC                   OLED 的 D/C 管脚,数据和命令控制管脚

7、RES                 OLED 的 RES 管脚,用于复位(低电平)

IIC接口模块:

IIC接口一般使用两条信号线通信:SCL(时钟线),SDA(数据线)

1、GND                电源地

2、VCC                电源正(3~5.5V)

3、SDA        ​        OLED 的 D1 脚,在IIC 通信中为数据管脚​​​​​​

4、SCL                OLED 的 D0 脚,在IIC 通信中为时钟管脚

三、OLED显示汉字

void OLED_ShowChinese(u8_t x, u8_t y, u8_t no);

使用取字模软件显示汉字:PCtoLCD2002

教你如何用PCtoLCD2002生成字模以及软件的下载_pctolcd2002生成字模下载-CSDN博客

四、SPI&IIC代码修改

1、OLED 驱动库中常用的函数

void OLED_Init(void);			// OLED 初始化函数
void OLED_Clear(void);			// OLED 清屏函数
void OLED_ShowString(u8_t x, u8_t y, u8_t *char);		 // 显示英文字符串函数
void OLED_ShowChinese(u8_t x, u8_t y, u8_t no);			// 显示中文字符串函数
void OLED_DrawBMP(u8_t x0, u8_t y0, u8_t x1, u8_t y1, u8_t BMP[]);		// 显示图片函数

2、main.c中修改使用

//OLED初始化
OLED_Init();
OLED_display_info();

extern unsigned char BMP1[];

//OLED显示函数
void OLED_display_info()
{
	OLED_Clear();        //清屏
	OLED_ShowString(0, 0, (uint8_t *)"CSDNds");    //显示字符串
	OLED_ShowCHinese(40, 0, 0);        //显示汉字
	OLED_ShowCHinese(80, 0, 1);        
	OLED_DrawBMP(70, 1, 120, 6, BMP0);    //显示图片
}

五、OLED可移植.c

OLED.c

#include "OLED_Font.h"
#include "gpio.h"

/*引脚配置*/
//#define OLED_W_SCL(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x))//Change
//#define OLED_W_SDA(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))//Change
void OLED_W_SCL(GPIO_PinState x){
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,x);
}
void OLED_W_SDA(GPIO_PinState x){
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,x);
}
/*引脚初始化*/
void OLED_I2C_Init(void)
{
    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//Change
	
	//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);
	
	MX_GPIO_Init();  
	
	OLED_W_SCL(1);
	OLED_W_SDA(1);
}

/**
  * @brief  //I2C开始
  * @param  //无
  * @retval //无
  */
void OLED_I2C_Start(void)
{
	OLED_W_SDA(1);
	OLED_W_SCL(1);
	OLED_W_SDA(0);
	OLED_W_SCL(0);
}

/**
  * @brief  //I2C停止
  * @param  //无
  * @retval// 无
  */
void OLED_I2C_Stop(void)
{
	OLED_W_SDA(0);
	OLED_W_SCL(1);
	OLED_W_SDA(1);
}

/**
  * @brief  I2C发送一个字节
  * @param  Byte 要发送的一个字节
  * @retval 无
  */
void OLED_I2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	for (i = 0; i < 8; i++)
	{
		OLED_W_SDA(Byte & (0x80 >> i));
		OLED_W_SCL(1);
		OLED_W_SCL(0);
	}
	OLED_W_SCL(1);	//额外的一个时钟,不处理应答信号
	OLED_W_SCL(0);
}

/**
  * @brief  OLED写命令
  * @param  Command 要写入的命令
  * @retval 无
  */
void OLED_WriteCommand(uint8_t Command)
{
	OLED_I2C_Start();
	OLED_I2C_SendByte(0x78);		//从机地址
	OLED_I2C_SendByte(0x00);		//写命令
	OLED_I2C_SendByte(Command); 
	OLED_I2C_Stop();
}

/**
  * @brief  OLED写数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void OLED_WriteData(uint8_t Data)
{
	OLED_I2C_Start();
	OLED_I2C_SendByte(0x78);		//从机地址
	OLED_I2C_SendByte(0x40);		//写数据
	OLED_I2C_SendByte(Data);
	OLED_I2C_Stop();
}

/**
  * @brief  OLED设置光标位置
  * @param  Y 以左上角为原点,向下方向的坐标,范围:0~7
  * @param  X 以左上角为原点,向右方向的坐标,范围:0~127
  * @retval 无
  */
void OLED_SetCursor(uint8_t Y, uint8_t X)
{
	OLED_WriteCommand(0xB0 | Y);					//设置Y位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值