当前位置: 首页 > news >正文

OLED显示屏应用(STM32)

一、接线

OLED的四针脚对应接法如下图

GND——GND

3.3V——3.3V

SCL——PB8

SDA——PB9

二、OLED.c代码介绍

#include "stm32f10x.h"
#include "OLED_Font.h"/*引脚配置*/
//OLED时钟线
//GPIOB8接时钟线接口
//定义一个函数,函数的参数为x,当调用宏时,会执行GPIO_WriteBit()函数,将GPIOB8设置为X
#define OLED_W_SCL(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x))
//OLED数据线
//GPIOB9接数据线结构
#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);//初始化GPIOB8GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB9//设置为高电平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);//时钟口为1OLED_W_SDA(1);//数据口为1
}/*** @brief  I2C发送一个字节* @param  Byte 要发送的一个字节* @retval 无*/
void OLED_I2C_SendByte(uint8_t Byte)
{//一个字节是8位,逐位发送,从高位到低位uint8_t i;for (i = 0; i < 8; i++){//将Byte与一个右移了i位的掩码,即第i位为1,其他位为0的,进行按位与操作//位与,全1为1,有0为0//0x80的二进制码是1000 0000//0x80>>i,表示的是第8-i位为1//Byte&(0x80>>i)用于判断第8-i为是否为1,即输出该位的电平//只有两种可能,要不就是全为0,要不就是有值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();//启动I2C通信OLED_I2C_SendByte(0x78);		//写入从机地址,表示OLED显示屏的I2C地址OLED_I2C_SendByte(0x00);		//写入命令,0x00表示写命令OLED_I2C_SendByte(Command); //command表示实际的命令参数OLED_I2C_Stop();//关闭I2通信
}/*** @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 & 0xF0) >> 4));	//设置X位置高4位OLED_WriteCommand(0x00 | (X & 0x0F));			//设置X位置低4位
}/*** @brief  OLED清屏* @param  无* @retval 无*/
void OLED_Clear(void)
{  uint8_t i, j;//遍历写入0x00,清楚数据for (j = 0; j < 8; j++){OLED_SetCursor(j, 0);//设置光标位置为第0行,第0列for(i = 0; i < 128; i++){OLED_WriteData(0x00);//写入0x00表示不显示,清除该处的数据}}
}/*** @brief  OLED显示一个字符* @param  Line 行位置,范围:1~4* @param  Column 列位置,范围:1~16* @param  Char 要显示的一个字符,范围:ASCII可见字符* @retval 无*/
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{      	uint8_t i;//每个屏幕坐标点像素为2*8,共计16个像素//先定位光标,在设置光标的上半部分的内容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]);		//显示下半部分内容}
}/*** @brief  OLED显示字符串* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串,范围:ASCII可见字符* @retval 无*/
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{uint8_t i;//'\0'是字符串的结束符for (i = 0; String[i] != '\0'; i++){//Line表示写在第几行,Column为起始列,i表示字符串的第几个字符OLED_ShowChar(Line, Column + i, String[i]);}
}/*** @brief  OLED次方函数* @retval 返回值等于X的Y次方*/
uint32_t OLED_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;//计算x的y次方,再返回结果while (Y--){Result *= X;}return Result;
}/*** @brief  OLED显示数字(十进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~4294967295* @param  Length 要显示数字的长度,范围:1~10* @retval 无*/
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');//逐位显示数字}
}/*** @brief  OLED显示数字(十进制,带符号数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-2147483648~2147483647* @param  Length 要显示数字的长度,范围:1~10* @retval 无*/
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{uint8_t i;uint32_t Number1;//获取Number的符号,并显示if (Number >= 0){OLED_ShowChar(Line, Column, '+');Number1 = Number;}else{OLED_ShowChar(Line, Column, '-');Number1 = -Number;}//逐位显示数字,其中Number1为Number的绝对值for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}/*** @brief  OLED显示数字(十六进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFFFFFF* @param  Length 要显示数字的长度,范围:1~8* @retval 无*/
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i, SingleNumber;//逐位显示,以16进制的方式for (i = 0; i < Length; i++)							{SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;//如果小于10,则显示数字if (SingleNumber < 10){OLED_ShowChar(Line, Column + i, SingleNumber + '0');}//如果大于十,则从A开始到Felse{OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');}}
}/*** @brief  OLED显示数字(二进制,正数)* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');}
}/*** @brief  OLED初始化* @param  无* @retval 无*/
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清屏
}

三、main.c函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "LED.h"int main(void)
{//初始化LED灯LED_Init();//点亮LED灯LED0_ON();LED1_ON();/*模块初始化*/OLED_Init();		//OLED初始化/*OLED显示*/OLED_ShowChar(1, 1, 'T');				//1行1列显示字符TOLED_ShowString(1, 3, "Hello!");	//1行3列显示字符串Hello!OLED_ShowNum(2, 1, 23456, 5);			//2行1列显示十进制数字23456,长度为5OLED_ShowSignedNum(2, 7, -66, 2);		//2行7列显示有符号十进制数字-66,长度为2OLED_ShowHexNum(3, 1, 0xAA55, 4);		//3行1列显示十六进制数字0xA5A5,长度为4OLED_ShowBinNum(4, 1, 0xAA55, 16);		//4行1列显示二进制数字0xA5A5,长度为16//C语言无法直接写出二进制数字,故需要用十六进制表示while (1){}
}

四、结果展示与资源下载

【免费】OLED显示屏的STM32控制代码(带详细注释)资源-CSDN文库


http://www.mrgr.cn/news/25645.html

相关文章:

  • 从0到1!本地部署一个大语言模型!完整方法!
  • 英飞凌motor电机方案
  • velero v1.14.1迁移kubernetes集群
  • B2064 斐波那契数列
  • 【oj刷题】滑动窗口篇:滑动窗口的应用场景和注意事项
  • 【ShuQiHere】深入浅出栈(Stack)数据结构:从基本操作到实现
  • b√最大矩阵和
  • 【python】OpenCV—Augmented Reality Using Aruco Markers
  • 生信操作文件类型
  • 【python实现一个更复杂的计算器】
  • 【H2O2|全栈】关于CSS(3)CSS基础(三)
  • Java 图片处理简易指南
  • Python习题 180:使用 sqlite3 模块实现数据库操作
  • 力扣题解2576
  • 计算各种图形的周长(多态)
  • MBD_入门篇_24_SimulinkSources
  • [001-02-001]. 第07-03节:理解线程的安全问题
  • 【AI绘画】Midjourney进阶:景别详解
  • 6.3排序——冒泡排序+快速排序
  • 2024第三届大学生算法大赛 真题训练2 解题报告 | 珂学家 | FFT/NTT板子