1.3寸 SH1106 OLED 屏幕驱动 基于stm32

1.前言

最近公司使用了一块用SH1106驱动的OLED 屏幕,但是发现网上的OLED大部分都是基于ssd1306驱动芯片的,关于SH1106的资料比较少,因此将自己使用过程中遇到的问题写下来。

2.电路及连接

屏幕使用的是IIC接口,按照正常的iiC连接即可

3.驱动屏幕

到这一步,就开始点亮屏幕吧。SH1106在使用中基本和ssd1306是一样的,只是在初始化的地方存在不一样。

	Write_Command(0xAE);//set display display ON/OFF,AFH/AEH
	Write_Command(0x02);
	Write_Command(0x10);
	Write_Command(0x40);//set display start line:COM0
	Write_Command(0xB0);
	Write_Command(0x81);//set contrast control
	Write_Command(0xCF);


	Write_Command(0xA1);//entire display on: A4H:OFF/A5H:ON
	Write_Command(0xC8); //该指令控制显示方向显示方向0xc8或者0xc0
	//Write_Command(0xC0);

	Write_Command(0xAF);
	Write_Command(0xA7);//set normal/inverse display: A6H:normal/A7H:inverse

	Write_Command(0xA8);//set multiplex ratio
	Write_Command(0x3F);//1/64duty
	Write_Command(0xD3);//set display offset
	Write_Command(0x00);//
	Write_Command(0xD5);//set display clock divide ratio/oscillator frequency
	Write_Command(0x80);//105Hz
	Write_Command(0xD9);//Dis-charge /Pre-charge Period Mode Set
	Write_Command(0xF1);//
	Write_Command(0xDA);//Common Pads Hardware Configuration Mode Set
	Write_Command(0x12);//
	Write_Command(0xDB);//set vcomh deselect level
	Write_Command(0x40);//VCOM = β X VREF = (0.430 + A[7:0] X 0.006415) X VREF
	Write_Command(0xA4);
	Write_Command(0xA6);
	Write_Command(0xAF);//set display display ON/OFF,AEH/AFH

	//这两条指令是设置反显,取消注释即为打开反显,
	//Write_Command(0xAF);
	//Write_Command(0xA7);//set normal/inverse display: A6H:normal/A7H:inverse

SH1106初始化过程。

初始化的时候,就按照上面的部分进行初始化就可以了。


//数字0到9 ,字体格式 16*16,横坐标只占了8个像素点,纵坐标占了16个像素点
const uint8_t number_array[]=
 {


 	0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/

 	0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",0*/

 	0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",0*/


 	0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,/*"3",0*/


 	0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,/*"4",0*/

 	0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,    //        5


 	0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00  , //       6

 	0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,/*"7",0*/

 	0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",0*/

 	0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,/*"9",0*/

 };
/**
  * @brief  Write_Command,写命令
  * @param  参考芯片手册
  *
	*
  * @retval 无
  */
  #define  OLED_ADDRESS  0x78
static void Write_Command(unsigned char I2C_Command)//???
{

    uint8_t *pData;
    pData = &I2C_Command;
	HAL_I2C_Mem_Write(&hi2c1,OLED_ADDRESS,0x00,I2C_MEMADD_SIZE_8BIT,pData,1,10);
}


/**
  * @brief  WriteDat,写数据命令全屏填充
  * @param  无参考芯片手册
  *
	*
  * @retval 无
  */
static void WriteDat(unsigned char I2C_Data)//???
{

    uint8_t *pData;
    pData = &I2C_Data;
	HAL_I2C_Mem_Write(&hi2c1,OLED_ADDRESS,0x40,I2C_MEMADD_SIZE_8BIT,pData,1,100);
}
/**
  * @brief  OLED_Fill,全屏填充
  * @param  0xff,全屏点亮
  *         0x00,全屏变黑
	*
  * @retval 无
  */
void OLED_Fill(unsigned char fill_Data)
{
	unsigned char m,n;
	for(m=0;m<8;m++)
	{
		Write_Command(0xb0+m);
		Write_Command(0x01);
		Write_Command(0x10);
		for(n=0;n<129;n++)
		{
			WriteDat(fill_Data);
		}
	}
}

/**
  * @brief  OLED_SetPos,设置光标
  * @param  x,光标x位置 范围 0-128
	*		y,光标y位置 范围 0-7
  * @retval 无
  */
void OLED_SetPos(unsigned char x, unsigned char y) //设置起始点坐标
{
	Write_Command(0xb0+y);

	Write_Command(((x&0xf0)>>4)|0x10);  //设置列的显示位置 的高低字节
	Write_Command((x&0x0f)|0x01);
}
/**
  * @brief  OLED_Show_Number_16,显示数字,数字大小16*16
  * @param  x,光标x位置 范围 0-128
	*		y,光标y位置 范围 0-7
	*		number 需要显示的数字,范围0-9,
  * @retval 无
  */
void  OLED_Show_Number_16(u8 x,u8  y,u8  number )
{
	uint32_t i=0,j=0;
	OLED_SetPos(x,y);
	//显示数字的上半部分
	for(i=0;i<8;i++)
	{
		WriteDat(number_array[number*16+i]);
	}
	//显示数字的下半部分
	OLED_SetPos(x,y+1);
	for(i=8;i<16;i++)
	{
		WriteDat(number_array[number*16+i]);
	}
}

驱动代码如上所示,先设置坐标,在显示字符,。

4.总结

综上所述,可以看到SH1106使用起来和SSD1306基本是一样的,除了初始化不同。因此在使用的时候,只要注意一下初始化就可了。

在这里插入图片描述

  • 9
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值