【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;t120)
        {
        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

 

 

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 */
}

效果如下:

【STM32学习】(25)STM32完成配置IIC实现OLED显示_第1张图片

 

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

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

 

你可能感兴趣的:(单片机c语言)