STM32--7针0.96寸OLED屏幕显示(4线SPI)

本文介绍基于STM32F103C8T6+0.96寸OLED(7针)的显示(完整程序代码见文末链接)

一、简介

OLED,即有机发光二极管( Organic Light Emitting Diode)。 OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
在这里插入图片描述
关于OLED基础知识介绍可参考我的另外一篇博客,建议阅读本文前先了解下,链接如下:https://blog.youkuaiyun.com/u011816009/article/details/130119426

本文是基于7pin 0.96寸OLED 屏幕4线SPI通信实现的和STM32通信,该7针屏幕模组还支持IIC以及3线SPI通信,在此不做赘述,可查看相关博文

二、接线图

STM32F103C8T6+0.96寸OLED(7针4线SPI)接线图,其中单片机的IO口资源可以在代码中修改,结合实际情况选用

STM32F103C8T60.96寸OLED(7针4线SPI)
3.3VVCC
GNDGND
PA5SCL/D0
PA6SDA/D1
PA3RST
PA4DC
PA2CS

三、代码函数(完整工程文件见文末连接)

显示主函数如下所示,其中:

OLED_ShowString:字符串显示函数
OLED_ShowChar:单个字符显示函数
OLED_ShowNum:变量/数值显示函数

int main(void)
	{ 

		delay_init();	//延时函数初始化	  
		OLED_Init();    //OLED初始化函数
		
		u32 t=10;
		
		while(1)
		{		
			OLED_ShowString(0,0,"Hello world",16); //显示字符串		
			OLED_ShowNum(10,30,t,2,16);            //显示具体变量t数值
			OLED_ShowChar(60,30,'A',16,1);         //显示单个字符
			
			OLED_Refresh_Gram(); //更新显示到OLED屏幕
		  //OLED_Fill(0,60,127,63,1);//填充OLED
			
		 }
     }

OLED_ShowString:字符串显示函数

//显示字符串
//x,y:起点坐标  
//size:字体大小 
//*p:字符串起始地址 
void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size)
{	
    while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
    {       
        if(x>(128-(size/2))){x=0;y+=size;}
        if(y>(64-size)){y=x=0;OLED_Clear();}
        OLED_ShowChar(x,y,*p,size,1);	 
        x+=size/2;
        p++;
    }  
	
}	

OLED_ShowChar:单个字符显示函数

//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示				 
//size:选择字体 16/12 
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{      			    
	u8 temp,t,t1;
	u8 y0=y;
	u8 csize=(size/8+((size%8)?1:0))*(size/2);		//得到字体一个字符对应点阵集所占的字节数
	chr=chr-' ';//得到偏移后的值		 
    for(t=0;t<csize;t++)
    {   
		if(size==12)temp=asc2_1206[chr][t]; 	 	//调用1206字体
		else if(size==16)temp=asc2_1608[chr][t];	//调用1608字体
		else if(size==24)temp=asc2_2412[chr][t];	//调用2412字体
		else return;								//没有的字库
        for(t1=0;t1<8;t1++)
		{
			if(temp&0x80)OLED_DrawPoint(x,y,mode);
			else OLED_DrawPoint(x,y,!mode);
			temp<<=1;
			y++;
			if((y-y0)==size)
			{
				y=y0;
				x++;
				break;
			}
		}  	 
    }          
}

OLED_ShowNum:变量/数值显示函数

//显示2个数字
//x,y :起点坐标	 
//len :数字的位数
//size:字体大小
//mode:模式	0,填充模式;1,叠加模式
//num:数值(0~4294967295);	 		  
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
{         	
	u8 t,temp;
	u8 enshow=0;						   
	for(t=0;t<len;t++)
	{
		temp=(num/mypow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(size/2)*t,y,' ',size,1);
				continue;
			}else enshow=1; 
		 	 
		}
	 	OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1); 
	}
} 

四、实际显示效果

在这里插入图片描述

STM32--7针0.96寸OLED屏幕显示(4线SPI)

附完整代码程序资料

链接:https://pan.baidu.com/s/1nH14xjhXIhVPtjbK8joR9w?pwd=kxhl
提取码:kxhl

### 0.96OLED显示屏7IIC接口程序示例 对于采用7配置并通过IIC接口连接的0.96OLED显示屏,通常会涉及到初始化设置、数据传输模式的选择以及具体的命令发送逻辑。下面提供一段基于IIC协议操作该类屏幕的基础代码片段,适用于大多数微控制器平台。 #### 初始化函数 为了确保显示器正常工作,在启动阶段需执行一系列预设指令来完成硬件层面的准备动作: ```c void Oled_Init(void){ // 启动IIC总线 IIC_Start(); // 发送设备地址并确认应答信号 IIC_Write_Byte(0x3C); // 设备地址可能因具体型号而异,请参照实际产品手册 IIC_Ack(); // 进入命令模式 IIC_Write_Byte(0x00); IIC_Ack(); // 设置显示关闭状态 IIC_Write_Byte(0xAE); IIC_Ack(); // 设置显示偏移量为零 IIC_Write_Byte(0xD3); IIC_Ack(); IIC_Write_Byte(0x00); IIC_Ack(); // 设置多路复用比率至64 IIC_Write_Byte(0xA8); IIC_Ack(); IIC_Write_Byte(0x3F); IIC_Ack(); // 开启显示增强特性... } ``` 上述代码展示了部分典型的初始化过程[^1]。值得注意的是,这里使用的设备地址`0x3C`并非固定不变;不同的制造商可能会分配不一样的默认地址给同样的物理器件,因此建议查阅所购产品的官方文档获取确切数值。 #### 命令写入函数 当需要向OLED发出特定控制指令时,则调用如下形式的方法实现: ```c void Oled_Write_Cmd(uint8_t cmdWrite){ IIC_Start(); IIC_Write_Byte(0x3C); // 使用与初始化相同的设备地址 IIC_Ack(); IIC_Write_Byte(0x00); // 切换到命令通道 IIC_Ack(); IIC_Write_Byte(cmdWrite); // 实际要发送的命令字节 IIC_Ack(); IIC_Stop(); } ``` 此段落描述了如何构建一个用于发送单一命令给OLED屏的功能单元[^3]。它遵循标准IIC通信流程——先发起起始条件,接着指定目标节点的身份标识符(即设备地址),再切换至命令输入路径,最后传送真正的指令内容之前还要再次获得接收方的认可反馈。 #### 数据写入函数 除了下发管理性质的操作外,还有必要定义专门负责推送图像或字符信息的数据流处理机制: ```c void Oled_Write_Data(uint8_t dataWrite){ IIC_Start(); IIC_Write_Byte(0x3C); // 继续沿用前述一致的设备地址 IIC_Ack(); IIC_Write_Byte(0x40); // 跳转到数据缓冲区入口 IIC_Ack(); IIC_Write_Byte(dataWrite); // 待展示的具体像素值或其他编码后的资料 IIC_Ack(); IIC_Stop(); } ``` 这段说明解释了一个典型的数据提交过程,其中涉及到了从命令空间转换成数据域的关键步骤,这一步骤通过改变第二个字节的内容由`0x00`变为`0x40`得以体现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

541板哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值