【学习记录】0.96寸oled驱动移植ssd1306(iic)

文章提供了基于STM32HAL库的IIC通信接口函数以及OLED显示屏的初始化和控制函数,包括显示字符、填充屏幕、开关等操作。此外,还展示了不同点阵尺寸的字符字库。

首先需要三个文件
在这里插入图片描述code.h存放字库
剩下俩就是驱动相关。
这里使用stm32 hal库提供的iic函数作为接口

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

做好的接口如下:

//Cmd_Data:表示数据的类型,数据或者命令
//data: 数据本身
/*注:以下写在.h之中
#define IIC_Cmd   0x00
#define IIC_Data  0x40
这俩是作为函数第一个的参数被调用的
*/
void IIC_write(uint8_t Cmd_Data,uint8_t data){
   
   

 HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS, Cmd_Data, I2C_MEMADD_SIZE_8BIT, &data, 1, 0xff);

}

接下来就是把驱动中的函数换成自己的IIC_write就行。
OLED初始化函数

void OLED_Init(void){
   
   
  HAL_Delay(500);
  IIC_write(IIC_Cmd,0xAE); //display off
	IIC_write(IIC_Cmd,0x20);	//Set Memory Addressing Mode	
	IIC_write(IIC_Cmd,0x10);	//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
	IIC_write(IIC_Cmd,0xb0);	//Set Page Start Address for Page Addressing Mode,0-7
	IIC_write(IIC_Cmd,0xc8);	//Set COM Output Scan Direction
	IIC_write(IIC_Cmd,0x00); //---set low column address
	IIC_write(IIC_Cmd,0x10); //---set high column address
	IIC_write(IIC_Cmd,0x40); //--set start line address
	IIC_write(IIC_Cmd,0x81); //--set contrast control register
	IIC_write(IIC_Cmd,0xff); //亮度调节 0x00~0xff
	IIC_write(IIC_Cmd,0xa1); //--set segment re-map 0 to 127
	IIC_write(IIC_Cmd,0xa6); //--set normal display
	IIC_write(IIC_Cmd,0xa8); //--set multiplex ratio(1 to 64)
	IIC_write(IIC_Cmd,0x3F); //
	IIC_write(IIC_Cmd,0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
	IIC_write(IIC_Cmd,0xd3); //-set display offset
	IIC_write(IIC_Cmd,0x00); //-not offset
	IIC_write(IIC_Cmd,0xd5); //--set display clock divide ratio/oscillator frequency
	IIC_write(IIC_Cmd,0xf0); //--set divide ratio
	IIC_write(IIC_Cmd,0xd9); //--set pre-charge period
	IIC_write(IIC_Cmd,0x22); //
	IIC_write(IIC_Cmd,0xda); //--set com pins hardware configuration
	IIC_write(IIC_Cmd,0x12);
	IIC_write(IIC_Cmd,0xdb); //--set vcomh
	IIC_write(IIC_Cmd,0x20); //0x20,0.77xVcc
	IIC_write(IIC_Cmd,0x8d); //--set DC-DC enable
	IIC_write(IIC_Cmd,0x14); //
	IIC_write(IIC_Cmd,0xaf); //--turn on oled panel
}

然后是各种功能函数把里面的写数据写命令换成自己的即可,不在赘述。

/**
  * @brief  OLED_SetPos,设置光标
  * @param  x,光标x位置
	*					y,光标y位置
  * @retval 无
  */
void OLED_SetPos(unsigned char x, unsigned char y) //设置起始点坐标
{
   
    
	IIC_write(IIC_Cmd,0xb0+y);
	IIC_write(IIC_Cmd,((x&0xf0)>>4)|0x10);
	IIC_write(IIC_Cmd,(x&0x0f)|0x01);
}

 /**
  * @brief  OLED_Fill,填充整个屏幕
  * @param  fill_Data:要填充的数据
	* @retval 无
  */
void OLED_Fill(unsigned char fill_Data)//全屏填充
{
   
   
	unsigned char m,n;
	for(m=0;m<8;m++)
	{
   
   
		IIC_write(IIC_Cmd,0xb0+m);		//page0-page1
		IIC_write(IIC_Cmd,0x00);		//low column start address
		IIC_write(IIC_Cmd,0x10);		//high column start address
		for(n=0;n<128;n++)
			{
   
   
				IIC_write(IIC_Data,fill_Data);
			}
	}
}
void OLED_CLS(void)//清屏
{
   
   
	OLED_Fill(0x00);
}
 /**
  * @brief  OLED_ON,将OLED从休眠中唤醒
  * @param  无
	* @retval 无
  */
void OLED_ON(void)
{
   
   
		IIC_write(IIC_Cmd,0X8D);  //设置电荷泵
		IIC_write(IIC_Cmd,0X14);  //开启电荷泵
		IIC_write(IIC_Cmd,0XAF);  //OLED唤醒
}
 /**
  * @brief  OLED_OFF,让OLED休眠 -- 休眠模式下,OLED功耗不到10uA
  * @param  无
	* @retval 无
  */
void OLED_OFF(void)
{
   
   
	IIC_write(IIC_Cmd,0X8D);  //设置电荷泵
	IIC_write(IIC_Cmd,0X10);  //关闭电荷泵
	IIC_write(IIC_Cmd,0XAE);  //OLED休眠
}
/**
  * @brief  OLED_ShowStr,显示codetab.h中的ASCII字符,有6*8和8*16可选择
  * @param  x,y : 起始点坐标(x:0~127, y:0~7);
	*					ch[] :- 要显示的字符串; 
	*					TextSize : 字符大小(1:6*8 ; 2:8*16)
	* @retval 无
  */
void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
{
   
   
	unsigned char c = 0,i = 0,j = 0;
	switch(TextSize)
	{
   
   
		case 1:
		{
   
   
			while(ch[j] != '\0')
			{
   
   
				c = ch[j] - 32;
				if(x > 126)
				{
   
   
					x = 0;
					y++;
				}
				OLED_SetPos(x,y);
				for(i=0;i<6;i++)
					IIC_write(IIC_Data,F6x8[c][i]);
				x += 6;
				j++;
			}
		}break;
		case 2:
		{
   
   
			while(ch[j] != '\0')
			{
   
   
				c = ch[j] - 32;
				if(x > 120)
				{
   
   
					x = 0;
					y++;
				}
				OLED_SetPos(x,y);
				for(i=0;i<8;i++)
					IIC_write(IIC_Data,F8X16[c*16+i]);
				OLED_SetPos(x,y+1);
				for(i=0;i<8;i++)
					IIC_write(IIC_Data,F8X16[c*16+i+8]);
				x += 8;
				j++;
			}
		}break;
	}
}
 /**
  * @brief  OLED_ShowCN,显示codetab.h中的汉字,16*16点阵
  * @param  x,y: 起始点坐标(x:0~127, y:0~7); 
	*					N:汉字在codetab.h中的索引
	* @retval 无
  */
void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
{
   
   
	unsigned char wm=0;
	unsigned int  adder=32*N;
	OLED_SetPos(x , y);
	for(wm = 0;wm < 16;wm++)
	{
   
   
		IIC_write(IIC_Data,F16x16[adder]);

		adder += 1;
	}

	OLED_SetPos(x,y + 1);
	for(wm = 0;wm < 16;wm++)
	{
   
   
		IIC_write(IIC_Data,F16x16[adder]);

		adder += 1;
	}
}
 /**
  * @brief  OLED_DrawBMP,显示BMP位图
  * @param  x0,y0 :起始点坐标(x0:0~127, y0:0~7);
	*					x1,y1 : 起点对角线(结束点)的坐标(x1:1~128,y1:1~8)
	* @retval 无
  */
void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
{
   
   
	unsigned int j=0;
	unsigned char x,y;

  if(y1%8==0)
		y = y1/8;
  else
		y = y1/8 + 1;
	for(y=y0;y<y1;y++)
	{
   
   
		OLED_SetPos(x0,y);
    for(x=x0;x<x1;x++)
		{
   
   
			IIC_write(IIC_Data,BMP[j++]);
		}
	}
}

最后是制作相关的字库,这里给出本例程中使用的(字库的头文件在.c中包含)

#ifndef __CODE_H
#define	__CODE_H
//字库文件
/***************************16*16的点阵字体取模方式:共阴——列行式——逆向输出*********/
unsigned char F16x16[] =
{
   
   		

0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00,
0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//年0

0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,//月1

0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,//日2

0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00,//时3

0x80,0x40,0x20,0x90,0x88,0x86,0x80,0x80,0x80,0x83,0x8C,0x10,0x20,0x40,0x80,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,//分4

0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0xC0,0x38,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x08,0x06,0x01,0xFF,0x01,0x06,0x81,0x80,0x40,0x40,0x27,0x10,0x0C,0x03,0x00,0x00,//秒5

0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,//开6

0x00,0x00,0x00,0xFC,0x44,0x44,0x44,0x45,0x46,0x44,0x44,0x44,0x44,0x7C,0x00,0x00,
0x40,0x20,0x18,0x07,0x00,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFC,0x00,0x00,//启7

0x00,0x00,0x10,0x11,0x16,0x10,0x10,0xF0,0x10,0x10,0x14,0x13,0x10,0x00,0x00,0x00,
0x81,0x81,0x41,0x41,0x21,0x11,0x0D,0x03,0x0D,0x11,0x21,0x41,0x41,0x81,0x81,0x00,//关8

0x00,0xF8,0x01,0x22,0x20,0x22,0x22,0xA2,0xFA,0x22,0x22,0x22,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x08,0x04,0x02,0x11,0x20,0x1F,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,//闭9

0x08,0x04,0x23,0x22,0x26,0x2A,0x22,0xFA,0x24,0x23,0x22,0x26,0x2A,0x02,0x02,0x00,
0x01,0x09,0x09,0x09,0x19,0x69,0x09,0x09,0x49,0x89,0x7D,0x09,0x09,0x09,0x01,0x00,//等10

0x00,0x10,0x88,0xC4,0x33,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,
0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,//待11

0x40,0x44,0xC4,0x4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值