【STM32学习】(25)STM32完成配置IIC实现OLED显示

这个和博文《【STM32学习】(24)STM32完成模拟IIC实现OLED显示》有不一样的地方,这里是通过STM32 内置IIC配置实现OLED显示,这个效果要比模拟的IIC好。流程简单不繁琐,

写命令和写数据可以通过以下函数完成,简单快捷。

/**************************************************/
/*             IIC Write byte  Command                   */
/**************************************************/
void Write_IIC_Byte_Command(uint8_t IIC_Byte)
{

	HAL_I2C_Mem_Write( &hi2c1,0X78,0x00,I2C_MEMADD_SIZE_8BIT,  &IIC_Byte, 1,100);  // 0X78 OLED的I2C地址(禁止修改)	//0x00 OLED 命令(禁止修改)
}

/**************************************************/
/*             IIC Write byte  Data                   */
/**************************************************/
void Write_IIC_Byte_Data(uint8_t IIC_Byte)
{

	HAL_I2C_Mem_Write( &hi2c1,0X78,0x40,I2C_MEMADD_SIZE_8BIT,  &IIC_Byte, 1,100);   // 0X78 OLED的I2C地址(禁止修改)  //0x40 OLED 数据(禁止修改)
}

OLED相关驱动代码,如下:

#ifndef __OLED_H_
#define __OLED_H_

#include "stm32l0xx_hal.h"
#include "ZIKU.H"
#include "main.h"

/**************************************************/
/*                宏定义                          */
/**************************************************/
#define OLED_CMD  0	//写命令
#define OLED_DATA 1	//写数据
#define OLED_MODE 0
#define OLED_SDA  0
#define OLED_CLK  1

//OLED模式设置
//0:4线串行模式
//1:并行8080模式

#define SIZE 16
#define XLevelL		0x02
#define XLevelH		0x10
#define Max_Column	128
#define Max_Row		64
#define	Brightness	0xFF 
#define X_WIDTH 	128
#define Y_WIDTH 	64	    						  









/**************************************************/
/*             IIC Write byte  Command                   */
/**************************************************/
void Write_IIC_Byte_Command(uint8_t IIC_Byte)
{

	HAL_I2C_Mem_Write( &hi2c1,0X78,0x00,I2C_MEMADD_SIZE_8BIT,  &IIC_Byte, 1,100);  // 0X78 OLED的I2C地址(禁止修改)	//0x00 OLED 命令(禁止修改)
}

/**************************************************/
/*             IIC Write byte  Data               */
/**************************************************/
void Write_IIC_Byte_Data(uint8_t IIC_Byte)
{

	HAL_I2C_Mem_Write( &hi2c1,0X78,0x40,I2C_MEMADD_SIZE_8BIT,  &IIC_Byte, 1,100);   // 0X78 OLED的I2C地址(禁止修改)  //0x40 OLED 数据(禁止修改)
}




void OLED_WR_Byte(uint8_t dat,uint8_t cmd) 
{
	if(cmd)
	{
		Write_IIC_Byte_Data(dat);
	}
	else 
	{
		Write_IIC_Byte_Command(dat);
	}
}
/**************************************************/
/*              坐标设置                          */
/**************************************************/

void OLED_Set_Pos(uint8_t x, uint8_t y) 
{ 	
	OLED_WR_Byte(0xb0+y,OLED_CMD);
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
	OLED_WR_Byte((x&0x0f),OLED_CMD); 
}   	  

/**************************************************/
/*              开启OLED显示                      */
/**************************************************/

void OLED_Display_On(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
	OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
	OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}

/**************************************************/
/*              关闭OLED显示                      */
/**************************************************/
     
//void OLED_Display_Off(void)
//{
//	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
//	OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
//	OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
//}		   			 

/**************************************************/
/*               OLED清屏                         */
/**************************************************/

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	  
void OLED_Clear(void)  
{  
	uint8_t i,n;		    
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
		for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 
	} //更新显示
}

/**************************************************/
/*               OLED开显示                       */
/**************************************************/

//void OLED_On(void)  
//{  
//	ur i,n;		    
//	for(i=0;i<8;i++)  
//	{  
//		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
//		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
//		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
//		for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA); 
//	} //更新显示
//}

/**************************************************/
/*           OLED写一个字符                       */     
/*           在指定位置显示一个字符,包括部分字符  */
/*           x:0~127                              */
/*           y:0~63                               */
/*           mode:0,反白显示;1,正常显示           */				 
/*           size:选择字体 16/12                  */
/**************************************************/
void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
{      	
	uint8_t c=0,i=0;	
	c=chr-' ';                    //得到偏移后的值			
	if(x>Max_Column-1)
	{
		x=0;y=y+2;
	}
	if(Char_Size ==16)
	{
		OLED_Set_Pos(x,y);	
		for(i=0;i<8;i++)
		OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
		OLED_Set_Pos(x,y+1);
		for(i=0;i<8;i++)
		OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
	}
	else 
	{	
		OLED_Set_Pos(x,y);
		for(i=0;i<6;i++)
		OLED_WR_Byte(F6x8[c][i],OLED_DATA);

	}
}

/**************************************************/
/*        函数名:m^n函数                         */
/**************************************************/
uint16_t oled_pow(uint8_t m,uint8_t n)
{
	uint16_t result=1;	 
	while(n--)
    {
      result*=m; 
    }        
	return result;
} 

/**************************************************/
/*         显示2个数字                            */
/*         x,y :起点坐标                          */ 
/*         len :数字的位数                        */
/*         size:字体大小                          */
/*         mode:模式	0,填充模式;1,叠加模式     */
/*         num:数值(0~4294967295);                */	 		 
/**************************************************/
void OLED_ShowNum(uint8_t x,uint8_t y,uint16_t num,uint8_t wei,uint8_t size2)
{         	
	uint8_t t,temp;
	uint8_t enshow=0;						   
	for(t=0;t<wei;t++)
	{
		temp=(num/oled_pow(10,wei-t-1))%10;
		if(enshow==0&&t<(wei-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
				continue;
			}
         	else
            enshow=1; 
		} 
	 	OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 
	}
}
 
/**************************************************/
/*        函数名:显示一个字符号串                */
/**************************************************/
void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
	uint8_t j=0;
	while (chr[j]!='\0')
	{      
        OLED_ShowChar(x,y,chr[j],Char_Size);
		x+=8;
		if(x>120)
        {
        x=0;y+=2;
           }
        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_WR_Byte(Hzk[2*no][t],OLED_DATA);
		 adder+=1;
 	}	
	OLED_Set_Pos(x,y+1);   //坐标	
    for(t=0;t<16;t++)
	{	
		OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
		adder+=1;
    }					
}
/***********显示图片*****************/
void OLED_DrawBMP(uint8_t x0, uint8_t y0,uint8_t x1, uint8_t y1,uint8_t BMP[])
{ 	
	unsigned int j=0;
	uint8_t x,y;

	if(y1%8==0) y=y1/8;      
	else y=y1/8+1;
	for(y=y0;y<y1;y++)
	{
		OLED_Set_Pos(x0,y);
		for(x=x0;x<x1;x++)
		{      
			OLED_WR_Byte(BMP[j++],OLED_DATA);	    	
		}
	}
} 
/**************************************************/
/*           函数名:初始化OLED                   */
/**************************************************/
void OLED_Init(void)          
{ 	
    OLED_WR_Byte(0xAE,OLED_CMD);//关显示
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
	OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
	OLED_WR_Byte(0x81,OLED_CMD); // contract control
	OLED_WR_Byte(0xFF,OLED_CMD);//--128   
	OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap 
	OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
	OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
	OLED_WR_Byte(0x00,OLED_CMD);//
	OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
	OLED_WR_Byte(0x80,OLED_CMD);//
    
	OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
	OLED_WR_Byte(0x05,OLED_CMD);//
	
	OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
	OLED_WR_Byte(0xF1,OLED_CMD);//
	
	OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
	OLED_WR_Byte(0x12,OLED_CMD);//
	
	OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
	OLED_WR_Byte(0x30,OLED_CMD);//
	
	OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
	OLED_WR_Byte(0x14,OLED_CMD);//
	
	OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
	
	OLED_Display_On();
	OLED_Clear();
} 



#endif


 

 

main函数实现:

int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
	OLED_Init();		//OLED初始化
	OLED_DrawBMP(0, 0,128, 8, BMP);	//显示图片
	HAL_Delay(2000);   //显示延时
	OLED_Clear();	    //清除
	OLED_ShowCHinese(16*1,0,0);	//世界技能大赛
	OLED_ShowCHinese(16*2,0,1);
	OLED_ShowCHinese(16*3,0,2);
	OLED_ShowCHinese(16*4,0,3);
	OLED_ShowCHinese(16*5,0,4);
	OLED_ShowCHinese(16*6,0,5);

	OLED_ShowNum(0,2,1234,4,16);	//纯数值显示
	
	OLED_ShowString(3,4,"wantin",16);		//送显示
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

效果如下:

 

完整代码可以查看链接:Tast16_IIC_OLED_Config.rar   https://download.csdn.net/download/XiaoCaiDaYong/12443607

积分不够,可以留言,QQ发送,O(∩_∩)O

 

STM32是一种微控制器系列,其具有高性能、低功耗和多种接口等特点。其主要用途是在嵌入式系统中进行控制和通信等任务。 OLED(Organic Light Emitting Diode),有机发光二极管显示技术,是一种新型的显示技术。与传统的LCD相比,OLED显示屏具有更高的对比度、更快的响应速度、更广的视角以及更低的功耗。 IIC(Inter-Integrated Circuit)是一种串行通信协议,被广泛应用于各种设备之间的通信。它具有简洁的线路结构、多设备连接、抗干扰能力强等优点。 当将STM32OLED结合使用时,可以通过IIC接口连接,实现显示功能。首先,需要在STM32配置IIC接口,并将其与OLED连接。接下来,借助STM32的固件库或者驱动软件,可以通过IIC总线发送数据到OLED显示屏上。在STM32中,可以通过编写程序或使用相应的库函数,控制OLED显示内容、亮度、对比度等参数。 使用STM32OLED IIC显示有以下几个优点: 1. STM32具有强大的处理能力,能够处理更复杂的显示任务。 2. OLED显示屏具有高对比度和广视角,适用于各种环境。 3. IIC通信协议简单易用,可以有效减少线路复杂性。 4. STM32OLED显示屏的组合,可应用于各种嵌入式系统,如智能家居、移动设备等。 总结来说,STM32OLED IIC显示的组合能够提供一种高性能、低功耗、高质量的显示解决方案,适用于各种嵌入式系统应用。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小材大用

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

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

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

打赏作者

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

抵扣说明:

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

余额充值