【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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章