STM32F103控制0.96寸OLED显示

        OLED支持IIC通信,IIC通信的详细知识在(http://t.csdnimg.cn/VALuO)中可以查看,STM32通过IIC将要显示的数据传输到OLED屏幕上。

        除了需要显示的信息需要传输外,还有显示的坐标也需要传输。那么具体的操作如下所示:

1.首先配置IIC通信的时钟线与数据线
#define OLED_W_SCL(x)	GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(x))//时钟线
#define OLED_W_SDA(x)	GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))//数据线

X为0则是低电平,1为高电平,GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))函数为标准库自带函数,作用是向指定的GPIO输入电平。

2.初始化指定的引脚

参考http://t.csdnimg.cn/CuGyz,并将时钟线与数据线拉高

void OLED_I2C_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	

 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
 	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);
}
3.写入数据包
void OLED_I2C_Start(void)
{
	OLED_W_SDA(1);
	OLED_W_SCL(1);//先拉高电平
	OLED_W_SDA(0);
	OLED_W_SCL(0);//拉低电平,表示开始通信
}
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);
}
void OLED_I2C_Stop(void)
{
	OLED_W_SDA(0);//结束标志位
	OLED_W_SCL(1);
	OLED_W_SDA(1);//重新拉高电平
}


void OLED_WriteCommand(uint8_t Command)
{
	OLED_I2C_Start();
	OLED_I2C_SendByte(0x78);		//从机地址
	OLED_I2C_SendByte(0x00);		//写命令
	OLED_I2C_SendByte(Command); 
	OLED_I2C_Stop();
}
4.初始化OLED

写入OLED初始化命令,这些命令为OLED厂家规定,不作具体分析:

void OLED_SetCursor(uint8_t Y, uint8_t X)
{
	OLED_WriteCommand(0xB0 | Y);					//设置Y位置
	OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	//设置X位置高4位
	OLED_WriteCommand(0x00 | (X & 0x0F));			//设置X位置低4位
}

void OLED_Clear(void)
{  
	uint8_t i, j;
	for (j = 0; j < 8; j++)
	{
		OLED_SetCursor(j, 0);
		for(i = 0; i < 128; i++)
		{
			OLED_WriteData(0x00);
		}
	}
}
void OLED_Init(void)
{
	uint32_t i, j;
	
	for (i = 0; i < 1000; i++)			//上电延时
	{
		for (j = 0; j < 1000; j++);
	}
	
	OLED_I2C_Init();			//端口初始化
	
	OLED_WriteCommand(0xAE);	//关闭显示
	
	OLED_WriteCommand(0xD5);	//设置显示时钟分频比/振荡器频率
	OLED_WriteCommand(0x80);
	
	OLED_WriteCommand(0xA8);	//设置多路复用率
	OLED_WriteCommand(0x3F);
	
	OLED_WriteCommand(0xD3);	//设置显示偏移
	OLED_WriteCommand(0x00);
	
	OLED_WriteCommand(0x40);	//设置显示开始行
	
	OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常 0xA0左右反置
	
	OLED_WriteCommand(0xC8);	//设置上下方向,0xC8正常 0xC0上下反置

	OLED_WriteCommand(0xDA);	//设置COM引脚硬件配置
	OLED_WriteCommand(0x12);
	
	OLED_WriteCommand(0x81);	//设置对比度控制
	OLED_WriteCommand(0xCF);

	OLED_WriteCommand(0xD9);	//设置预充电周期
	OLED_WriteCommand(0xF1);

	OLED_WriteCommand(0xDB);	//设置VCOMH取消选择级别
	OLED_WriteCommand(0x30);

	OLED_WriteCommand(0xA4);	//设置整个显示打开/关闭

	OLED_WriteCommand(0xA6);	//设置正常/倒转显示

	OLED_WriteCommand(0x8D);	//设置充电泵
	OLED_WriteCommand(0x14);

	OLED_WriteCommand(0xAF);	//开启显示
		
	OLED_Clear();				//OLED清屏
}

初始化好后,就可以显示相关的字符了:

5.显示字符

字符的本质为一个个像素点构成,所以显示一个字符,首先要确定像素起始的位置,其代码为:

void OLED_SetCursor(uint8_t Y, uint8_t X)
{
	OLED_WriteCommand(0xB0 | Y);					//设置Y位置
	OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	//设置X位置高4位
	OLED_WriteCommand(0x00 | (X & 0x0F));			//设置X位置低4位
}

同理,该代码中的OLED_WriteCommand函数为厂家提供,因此也不做具体含义的分析。

,像素通过IIC的数据线发送,发送1就是点亮该像素点,则显示一个字节代码为:

void OLED_I2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	for (i = 0; i < 8; i++)
	{
		OLED_W_SDA(Byte & (0x80 >> i));//一个字有16个像素,一次显示8个,分两次显示
		OLED_W_SCL(1);
		OLED_W_SCL(0);
	}
	OLED_W_SCL(1);	//额外的一个时钟,不处理应答信号
	OLED_W_SCL(0);
}

显示一个完整的字母:

void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{      	
	uint8_t i;
	OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);		//设置光标位置在上半部分
	for (i = 0; i < 8; i++)
	{
		OLED_WriteData(OLED_F8x16[Char - ' '][i]);			//显示上半部分内容
	}
	OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//设置光标位置在下半部分
	for (i = 0; i < 8; i++)
	{
		OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);		//显示下半部分内容
	}
}

能显示字符,字符串就简单了:

void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i++)
	{
		OLED_ShowChar(Line, Column + i, String[i]);
	}
}

当然,显示字符要知道字符中各个像素的排布,其在上述代码中的表现就是二维数组OLED_F8x16[][];里面存着各个字符的像素排布,也就是字库,其可以通过字模软件制作,也可自行网上下载,形式如下:

const uint8_t OLED_F8x16[][16]=
{
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//  0
	
	0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
	
	0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
	
	0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,
	0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
}//只有0123的字模,其余不作赘述
6.图片显示

图片也需制模,通过制模软件将图片转化为数组后,通过显示字符的原理也能将其显示,不过要注意图片不能超过OLED屏幕的大小。

7.总结

显示hello world如下:

int main(void)
{	
	  OLED_Init();
        while(1)
        {
            OLED_ShowString(1,1,"hello world");
        }
}

相关推荐

  1. STM32F103控制0.96OLED显示

    2024-07-14 16:52:01       16 阅读
  2. <span style='color:red;'>STM</span><span style='color:red;'>32</span><span style='color:red;'>F</span><span style='color:red;'>103</span>

    STM32F103

    2024-07-14 16:52:01      67 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 16:52:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 16:52:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 16:52:01       58 阅读
  4. Python语言-面向对象

    2024-07-14 16:52:01       69 阅读

热门阅读

  1. GESP C++ 三级真题(2023年9月)T1 ⼩ 杨储蓄

    2024-07-14 16:52:01       14 阅读
  2. 2024年交安安全员考试题库及答案

    2024-07-14 16:52:01       19 阅读
  3. 2024年高校辅导员考试题库及答案

    2024-07-14 16:52:01       25 阅读
  4. VMM、VMI、VIM的简介

    2024-07-14 16:52:01       16 阅读
  5. Python 面试热门问题五

    2024-07-14 16:52:01       22 阅读
  6. TCP流量控制是怎么实现的?

    2024-07-14 16:52:01       24 阅读
  7. C#开发翻译较好的API

    2024-07-14 16:52:01       19 阅读
  8. C语言西蒙说游戏

    2024-07-14 16:52:01       25 阅读
  9. 大厂急招C++,有一个HC

    2024-07-14 16:52:01       19 阅读