基于Proteus无实物零基础STM32入门自学教程(十一)--0.96“OLED屏显示I2C接口

本节课我们继续来点亮高端一点的显示器件--OLED显示屏,本来以笔者的经验这种屏比较小很少用在产品上,但是近年来随着校园的学科竞赛的蓬勃发展,这种体积小,超薄形状,显示效果佳的OLED屏越来越受使用者的追捧。最明显的就是基于显示原理的不同,OLED自发光的特性导致其体积小,并且超薄。这也是大部分手机采用OLED屏的原因之一。

一、Protues仿真图

本次选择的是4线制的0.96“OLED,这样只需要2个IO即可完成0.96“OLED显示功能,是最省IO的方案。特别适合大家新手初期的使用。如图所示,PB10连接到I2C的SCL端口,PB11连接到I2C的SDA端口。至此,OLED屏连接完毕,从硬件电路上它比LCD1602更加简单。

OLED屏的工作原理:

i2c的工作原理大家可以自行搜索一下。设计思路是,先驱动IIC的启动和停止,然后即可像驱动LCD一样,完成写命令和写数据的函数,再加上定位函数后,就可以编写最终的显示字符或者数字的单独函数。

二、MDK代码

同学们如果看不懂也没关系,程序已经经过调试,大家可以直接使用。就好像STM32已经由厂家编好了库一样,我们不需纠结底层怎么编成功的,只需要关心怎么调用,如何更改成自己的代码就可以了。

OLED的IIC的驱动代码如下:

/****  I2C启动函数  ****/
void OLED_I2C_Start(void)
{
		OLED_W_SDA(1);
		OLED_W_SCL(1);
		OLED_W_SDA(0);
		OLED_W_SCL(0);
}

/****  I2C停止函数  ****/
void OLED_I2C_Stop(void)
{
		OLED_W_SDA(0);
		OLED_W_SCL(1);
		OLED_W_SDA(1);
}

/****  I2C发送字节函数  ****/
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);
}

OLED的核心代码如下:


/****  OLED写命令函数,cmd为写入的命令 ****/
void OLED_WriteCommand(uint8_t Command)
{
		OLED_I2C_Start();
		OLED_I2C_SendByte(0x78);		//从机地址
		OLED_I2C_SendByte(0x00);		//写命令
		OLED_I2C_SendByte(Command); 
		OLED_I2C_Stop();
}

/****  OLED写数据函数,dat为写入的数据  ****/
void OLED_WriteData(uint8_t Data)
{
		OLED_I2C_Start();
		OLED_I2C_SendByte(0x78);		//从机地址
		OLED_I2C_SendByte(0x40);		//写数据
		OLED_I2C_SendByte(Data);
		OLED_I2C_Stop();
}

/****  根据OLED的起始地址,定位(x,y)-对应屏幕上的字符坐标,x为0-127,y为0-7  ****/
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清屏函数  ****/
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);
			}
		}
}

/****  OLED更新显存函数  ****/
void OLED_Refresh_Gram(void)
{
		uint8_t i, j;
		for (j = 0; j < 8; j++)
		{
			OLED_SetCursor(j, 0);
			for(i = 0; i < 128; i++)
			{
				OLED_WriteData(OLED_GRAM[i][j]);
			}
		}
}
 

OLED的初始化函数:

/****  OLED初始化函数  ****/
void OLED_Init(void)
{

		OLED_I2C_Init();			    //端口初始化
		
		OLED_WriteCommand(0xAE);	//关闭显示
		OLED_WriteCommand(0xD5);	//设置显示时钟分频值/震荡频率
		OLED_WriteCommand(0x80);  //设置分频比,将时钟设置为100帧/秒
		OLED_WriteCommand(0xA8);	//设置多路复用率
		OLED_WriteCommand(0x3F);  //默认0X3F(1/64) 
		OLED_WriteCommand(0xD3);	//设置显示偏移
		OLED_WriteCommand(0x00);  //默认为0 [5:0],行数.
		
		OLED_WriteCommand(0x40);	//设置显示开始行	
		
		OLED_WriteCommand(0x8D);	//设置充电泵设置
		OLED_WriteCommand(0x14);  //bit2,开启/关闭	
		OLED_WriteCommand(0x20);  //设置内存地址模式
		OLED_WriteCommand(0x02);  //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
		OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常 0xA0左右反置
		OLED_WriteCommand(0xC0);	//设置上下方向,0xC8正常 0xC0上下反置
		OLED_WriteCommand(0xDA);	//设置COM引脚硬件配置
		OLED_WriteCommand(0x12);  //[5:4]配置
		
		OLED_WriteCommand(0x81);	//设置对比度控制
		OLED_WriteCommand(0xCF);  //1~255;默认0X7F (亮度设置,越大越亮)
		OLED_WriteCommand(0xD9);  //设置预充电周期
		OLED_WriteCommand(0xF1);  //[3:0],PHASE 1;[7:4],PHASE 2;
		OLED_WriteCommand(0xDB);  //设置VCOMH 电压倍率
		OLED_WriteCommand(0x30);  //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;

		OLED_WriteCommand(0xA4);  //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
		OLED_WriteCommand(0xA6);  //设置显示方式;bit0:1,反相显示;0,正常显示
		OLED_WriteCommand(0xAF);	//开启显示
			
		OLED_Clear();			       	//OLED清屏
}

OLED的显示函数代码:

/****  OLED画点函数,x,y为起点坐标x:0-127,y:0-63,t为0清空,为1填充  ****/
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
		u8 pos,bx,temp=0;
		if(x>127||y>63)return;//超出范围了.
		pos=7-y/8;
		bx=y%8;
		temp=1<<(7-bx);
		if(t)OLED_GRAM[x][pos]|=temp;
		else OLED_GRAM[x][pos]&=~temp;	    
}

/****  OLED字符显示函数,x,y为起点坐标,char为显示字符,size为字体大小12/16/24,mode为0反白显示,1为正常显示  ****/
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{      			    
		u8 temp,t,t1;
		
		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字符串显示函数,x,y为起点坐标,*p为显示字符串,size为字体大小,mode为0反白显示,1为正常显示  ****/
void OLED_ShowString(u8 x,u8 y, u8 *p,u8 size,u8 mode)
{	
    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,mode);	 
						x+=size/2;
						p++;
				}  
}


	
/****  OLED数字显示函数,x,y为起点坐标,num为显示数值,len为数字的位数,size为字体大小  ****/
void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size)
{         	
		u8 t,temp;
		u8 enshow=0;						   
		for(t=0;t<len;t++)
				{
					temp=(num/OLED_Pow(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); 
				}
}

 三、仿真效果和源代码资源

基于Proteus无实物零基础STM32入门自学教程(十一)--0.96“OLED屏显示I2C接口-单片机文档类资源-CSDN下载

### 回答1: 基于Proteus仿真软件进行STM32动态数码管编程学习,首先我们需要了解动态数码管的工作原理。动态数码管是由多个七段数码管组成,通过不断刷新每个数码管的显示内容,以达到显示更多位数的数字或字符的目的。 在Proteus,我们可以选择适合的STM32芯片模型,并添加相应的动态数码管模块。接下来,我们需要编写程序来实现动态数码管的显示。 首先,我们需要定义动态数码管的引脚连接。在STM32芯片上,动态数码管的引脚连接方式可以根据具体的硬件设计进行调整。在程序,我们需要定义动态数码管的引脚连接方式,并通过GPIO口控制引脚的电平状态。 接下来,我们需要编写一个循环程序来实现动态数码管的显示。在循环,我们可以通过控制不同的引脚电平状态,来依次显示不同的数字或字符。可以通过定义数组,将每个数码管需要显示的数字或字符存储起来,并在循环不断刷新数码管的显示内容。 同时,我们还可以通过延时函数来控制数码管的刷新速度,以实现不同的效果。通过调整延时时间,可以使得数码管的刷新速度更快或更慢。 最后,我们需要在Proteus进行仿真,来验证我们编写的动态数码管程序是否符合预期。通过观察仿真结果,我们可以判断程序的正确性,并对程序进行调试和优化。 总结来说,基于Proteus实物STM32入门自学教程的第四部分动态数码管编程,我们需要了解动态数码管的工作原理,并通过编写程序来实现动态数码管的显示。在仿真,我们可以验证程序的正确性,并进行调试和优化。这样,我们就可以通过自学来掌握STM32动态数码管的编程知识。 ### 回答2: 基于Proteus仿真软件,STM32入门自学教程的第四部分介绍了如何使用动态数码管。动态数码管是一种常用的数字显示器,它可以显示数字0-9以及一些字母和符号。通过控制数码管的引脚状态,我们可以实现不同的数字显示效果。 首先,我们需要添加动态数码管的模型到Proteus。在Components库找到7-Segment Display元件,并将其拖放到工作区。 接下来,我们需要配置STM32的引脚以控制动态数码管的显示。打开STM32的配置文件,在引脚配置下拉菜单选择对应的引脚,并将其配置为GPIO输出模式。 然后,编写代码来控制动态数码管。首先,需要包含相应的头文件,例如"stm32f10x.h"。然后定义需要使用的引脚和数码管的显示内容。在主函数,设置引脚状态以显示相应的数字。通过改变引脚状态的顺序和频率,可以实现不同的数字显示效果。 最后,编译代码并下载到STM32开发板上进行测试。在Proteus仿真验证代码功能是否正确。 通过这个实例,我们可以学到如何使用ProteusSTM32开发板来模拟动态数码管的显示效果。这对于学习嵌入式系统和数字电路设计非常有帮助。希望这个教程对你入门STM32有所帮助。 ### 回答3: 基于Proteus实物STM32入门自学教程(四)-动态数码管 动态数码管是一种常见的数字显示器件,通过控制不同的LED段的亮灭状态来显示数字或字符。在这个教程,我们将学习如何在Proteus使用动态数码管。 1. 首先,打开Proteus软件,在工具栏选择“元件模式”按钮,并在搜索栏输入“7段数码管”。 2. 在搜索结果,选择一个你喜欢的7段数码管组件并将其拖拽到工作区。 3. 然后,我们需要一个STM32微控制器来控制数码管显示。同样,在元件模式搜索“STM32”,选择一个合适的型号,并将其拖拽到工作区。 4. 连接数码管和STM32微控制器。首先,将STM32的GND引脚连接到数码管的GND引脚。然后,将STM32的PA0引脚连接到数码管的A引脚,PB0引脚连接到数码管的B引脚,依此类推,将其他引脚连接到相应的数码管引脚。 5. 设置STM32的引脚为输出模式。点击STM32元件,选择“属性”窗口,在引脚设置,将所有需要控制数码管的引脚设置为“输出”。 6. 编写STM32的控制程序。点击STM32元件,选择“编辑C代码”按钮,在打开的编辑器编写程序。通过驱动不同的引脚输出高低电平来控制数码管显示不同的数字或字符。 7. 仿真运行程序。点击Proteus工具栏的“运行仿真”按钮,然后观察数码管的显示是否与程序设定的一致。 这就是利用Proteus实现动态数码管的入门教程。通过这个教程,你将学会如何在Proteus使用动态数码管,并通过使用STM32微控制器来控制数码管的显示
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

永远都是新手

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

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

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

打赏作者

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

抵扣说明:

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

余额充值