STM32入门学习之OLED屏幕显示

STM32入门学习之OLED屏幕显示(快速上手操作)

前言

0.96寸 4针脚I2C接口(本节以这个为例)
1.3寸 7针脚SPI接口
128*64像素
请添加图片描述

接线图如下
在这里插入图片描述

  • 数据存储格式:

  • 纵向8点,高位在下,先从左到右,再从上到下

  • 每一个Bit对应一个像素点(0:熄灭 1:点亮)
    在这里插入图片描述

  • 坐标轴定义:

  • 左上角为(0, 0)点

  • 横向向右为X轴,取值范围:0~127

  • 纵向向下为Y轴,取值范围:0~63
    在这里插入图片描述

一、基本数字/字符串等的显示

1.1OLED初始化及基本显示函数定义(OLED.c)
#include "stm32f10x.h"
#include "OLED_Font.h"

/*引脚配置*/
#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_I2C_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	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);
	
	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位置
	OLED_WriteCommand(0x10 | ((X &
<think>好的,用户想查找关于STM32OLED相关的开发资料或示例代码。我需要结合用户提供的引用内容来给出合适的回答。首先,用户提到的三个引用都涉及STM32驱动OLED的代码和步骤,比如I2C协议、GRAM刷新、汉字显示等。 我应该先整理这些引用中的关键点,比如I2C初始化和数据传输流程,OLED的初始化步骤,以及如何刷新GRAM来显示内容。用户可能需要具体的代码示例和步骤说明,所以需要把引用中的代码片段整合成连贯的教程。 另外,用户可能需要了解如何显示汉字或图形,这部分在引用3中提到用字库软件和分页写入的方法。需要详细说明如何设置坐标和写入数据。同时,示例代码的GitHub链接可能对用户有帮助,应该包含进去。 还要考虑用户可能遇到的问题,比如硬件连接、地址设置错误等,需要给出常见问题的解答。最后,生成相关问题可以帮助用户深入理解,比如优化显示效果或多语言支持的问题。 需要确保回答结构清晰,分步骤讲解,并引用提供的参考资料。同时检查代码格式是否正确,使用中文回答,数学表达式和独立公式符合要求。最后验证所有引用链接和代码示例是否准确相关。</think>### STM32 OLED驱动编程教程 #### 一、硬件连接与I2C协议 OLED显示屏通过I2C总线与STM32连接,标准接线方式为: - SCL接PB6 - SDA接PB7 - VCC接3.3V - GND接地 I2C协议实现要点: 1. **起始信号**:SCL高电平期间SDA产生下降沿 2. **停止信号**:SCL高电平期间SDA产生上升沿 3. **应答检测**:发送字节后需检测ACK信号[^1] ```c // I2C起始信号 void IIC_Start(void) { SDA_OUT(); IIC_SDA_HIGH(); IIC_SCL_HIGH(); delay_us(5); IIC_SDA_LOW(); delay_us(5); IIC_SCL_LOW(); } ``` #### 二、OLED初始化流程 1. GPIO初始化:配置I2C引脚为推挽输出模式 2. 发送初始化命令序列: ```c const uint8_t init_cmd[] = { 0xAE, // 关闭显示 0xD5, 0x80, // 设置时钟分频 0xA8, 0x3F, // 设置复用率 0xD3, 0x00, // 设置显示偏移 0x40, // 设置起始行 0x8D, 0x14, // 电荷泵设置 0x20, 0x00, // 内存地址模式 0xA1, // 段重定向 0xC8, // 扫描方向 0xDA, 0x12, // COM引脚配置 0x81, 0xCF, // 对比度设置 0xD9, 0xF1, // 预充电周期 0xDB, 0x30, // VCOMH设置 0xA4, // 显示内容 0xA6, // 正常显示 0xAF // 开启显示 }; ``` #### 三、GRAM刷新机制 OLED采用128x64分辨率,内部GRAM结构为8页x128列: ```c uint8_t OLED_GRAM[128][8]; // 显存缓冲区 void OLED_Refresh(void) { for(uint8_t page=0; page<8; page++){ OLED_WriteCmd(0xB0 + page); // 设置页地址 OLED_WriteCmd(0x00); // 列地址低4位 OLED_WriteCmd(0x10); // 列地址高4位 for(uint8_t col=0; col<128; col++){ OLED_WriteData(OLED_GRAM[col][page]); } } } ``` #### 四、汉字显示实现 使用16x16点阵字库,字库数据存储在`F16X16[]`数组中: ```c void OLED_ShowCN(uint8_t x, uint8_t y, uint8_t char_idx) { uint16_t addr = 32 * char_idx; // 每个汉字占32字节 OLED_SetPos(x, y); for(uint8_t i=0; i<16; i++){ // 上半部分 OLED_WriteData(F16X16[addr++]); } OLED_SetPos(x, y+1); for(uint8_t i=0; i<16; i++){ // 下半部分 OLED_WriteData(F16X16[addr++]); } } ``` #### 五、完整开发资源 1. GitHub示例代码库:[STM32-IIC-OLED](https://github.com/writemanybug/-STM32-IIC-OLED-) 2. 字库生成工具推荐:PCtoLCD2002 3. 硬件调试技巧:使用逻辑分析仪抓取I2C波形验证时序 #### 常见问题解决 - **无显示**:检查I2C地址是否匹配(通常0x78或0x7A) - **花屏**:确认GRAM刷新频率不低于30Hz - **显示偏移**:调整`0xD3`命令参数校准显示位置[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值