stm32f103i2c驱动oled
时间: 2023-04-25 07:04:26 浏览: 139
STM32F103是一款常用的微控制器,可以通过I2C总线驱动OLED显示屏。具体的驱动方法需要根据OLED显示屏的型号和接口来确定,一般需要编写相应的驱动程序和初始化代码。在编写驱动程序时,需要注意I2C总线的时序和数据传输方式,以及OLED显示屏的控制命令和数据格式。同时,还需要根据具体的应用场景来选择合适的显示方式和显示内容,以实现所需的功能。
相关问题
0.96寸OLED STM32F103 I2C程序
以下是使用STM32F103单片机和0.96寸OLED屏幕的I2C程序。
首先,需要确保你已经连接好了OLED屏幕和STM32F103单片机,然后将以下代码复制到你的STM32F103开发板的IAR或Keil等开发环境中进行编译:
```c
#include "stm32f10x.h"
#include "stm32f10x_i2c.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#define OLED_I2C_ADDR 0x78
void OLED_I2C_Init(void);
void OLED_I2C_WriteCmd(uint8_t I2C_Command);
void OLED_I2C_WriteData(uint8_t I2C_Data);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size);
void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no);
void OLED_Set_Pos(uint8_t x, uint8_t y);
void Delay(__IO uint32_t nCount);
int main(void)
{
OLED_I2C_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,2,"Hello,World!",16);
OLED_ShowString(0,4,"这是一行中文测试",16);
while(1);
}
void OLED_I2C_Init(void)
{
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB,&GPIO_InitStructure);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000;
I2C_Init(I2C1,&I2C_InitStructure);
I2C_Cmd(I2C1,ENABLE);
}
void OLED_I2C_WriteCmd(uint8_t I2C_Command)
{
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,OLED_I2C_ADDR,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1,0x00);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1,I2C_Command);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1,ENABLE);
Delay(200);
}
void OLED_I2C_WriteData(uint8_t I2C_Data)
{
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,OLED_I2C_ADDR,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1,0x40);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1,I2C_Data);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1,ENABLE);
Delay(200);
}
void OLED_Init(void)
{
Delay(200);
OLED_I2C_WriteCmd(0xAE);
OLED_I2C_WriteCmd(0x00);
OLED_I2C_WriteCmd(0x10);
OLED_I2C_WriteCmd(0x40);
OLED_I2C_WriteCmd(0x81);
OLED_I2C_WriteCmd(0xCF);
OLED_I2C_WriteCmd(0xA1);
OLED_I2C_WriteCmd(0xC8);
OLED_I2C_WriteCmd(0xA6);
OLED_I2C_WriteCmd(0xA8);
OLED_I2C_WriteCmd(0x3F);
OLED_I2C_WriteCmd(0xD3);
OLED_I2C_WriteCmd(0x00);
OLED_I2C_WriteCmd(0xD5);
OLED_I2C_WriteCmd(0x80);
OLED_I2C_WriteCmd(0xD9);
OLED_I2C_WriteCmd(0xF1);
OLED_I2C_WriteCmd(0xDA);
OLED_I2C_WriteCmd(0x12);
OLED_I2C_WriteCmd(0xDB);
OLED_I2C_WriteCmd(0x40);
OLED_I2C_WriteCmd(0x20);
OLED_I2C_WriteCmd(0x02);
OLED_I2C_WriteCmd(0x8D);
OLED_I2C_WriteCmd(0x14);
OLED_I2C_WriteCmd(0xA4);
OLED_I2C_WriteCmd(0xA6);
OLED_I2C_WriteCmd(0xAF);
OLED_Clear();
}
void OLED_Clear(void)
{
uint8_t i,j;
for(i=0;i<8;i++)
{
OLED_I2C_WriteCmd(0xb0+i);
OLED_I2C_WriteCmd(0x00);
OLED_I2C_WriteCmd(0x10);
for(j=0;j<128;j++)
{
OLED_I2C_WriteData(0);
}
}
}
void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
uint8_t c = 0,i = 0,j = 0;
while (chr[j]!='\0')
{
c = chr[j] - 32;
if(x > 120)
{
x = 0;
y++;
}
OLED_Set_Pos(x,y);
for(i=0;i<Char_Size;i++)
{
OLED_I2C_WriteData(F8X16[c*16+i]);
}
OLED_Set_Pos(x,y+1);
for(i=0;i<Char_Size;i++)
{
OLED_I2C_WriteData(F8X16[c*16+i+8]);
}
x += Char_Size;
j++;
}
}
void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no)
{
uint8_t t,adder = 0;
OLED_Set_Pos(x , y);
for(t=0;t<16;t++)
{
OLED_I2C_WriteData(CHS[2*no][t]);
adder += 1;
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_I2C_WriteData(CHS[2*no+1][t]);
adder += 1;
}
}
void OLED_Set_Pos(uint8_t x, uint8_t y)
{
OLED_I2C_WriteCmd(0xb0+y);
OLED_I2C_WriteCmd(((x&0xf0)>>4)|0x10);
OLED_I2C_WriteCmd((x&0x0f)|0x01);
}
void Delay(__IO uint32_t nCount)
{
for(;nCount!=0;nCount--);
}
```
在上面的代码中,我们首先定义了OLED屏幕的I2C地址,然后实现了一些函数来初始化OLED屏幕、清屏、显示字符串、显示汉字等。在主函数中,我们初始化OLED屏幕并显示一些测试信息。
请注意,这只是一个示例程序,你需要根据你的具体需求进行修改。
stm32f103c8t6驱动OLED屏
您好!对于驱动OLED屏幕,您可以使用STM32F103C8T6微控制器,并通过相应的引脚连接实现驱动。以下是一个简单的步骤,以帮助您开始:
1. 准备硬件:
- STM32F103C8T6微控制器开发板
- SSD1306 OLED屏幕(或其他兼容的OLED屏幕)
- 连接线
- 杜邦线
2. 寻找适当的库文件:
- 在CSDN等网站上搜索“STM32 OLED驱动库”,可以找到一些针对SSD1306的库文件,例如u8glib等。这些库文件通常提供了方便的函数和示例代码,用于初始化和控制OLED屏幕。
3. 连接STM32与OLED屏幕:
- 将OLED的VCC引脚连接到STM32的3.3V电源引脚
- 将OLED的GND引脚连接到STM32的地引脚
- 将OLED的SCL引脚连接到STM32的I2C时钟引脚(例如PB6)
- 将OLED的SDA引脚连接到STM32的I2C数据引脚(例如PB7)
4. 初始化I2C:
- 在您的代码中,使用STM32的I2C库初始化PB6和PB7引脚为I2C功能,并配置适当的时钟和速率。
5. 初始化OLED屏幕:
- 使用您找到的库文件提供的初始化函数,初始化OLED屏幕。这通常涉及设置屏幕的分辨率、显示模式等。
6. 显示内容:
- 使用库文件提供的函数,您可以在OLED屏幕上显示文本、图形等。
请注意,具体的代码实现可能会因您使用的库文件而有所不同。您可以查找适合您的库文件的示例代码和文档,以更详细地了解如何使用它们驱动OLED屏幕。希望这些步骤对您有所帮助!如有任何问题,请随时提问。