STM32CubeMx使用:使用HAL库显示OLED屏

一.前提

        1.使用IIC(I2C)通信

        2.0.96寸OLED屏(SSD1306驱动)

可以参考STM32入门HAL库-硬件I2C与0.96寸OLED

关于0.96OLED(SSD1306)指令可以参考SSD1306(OLED驱动芯片)指令详解

OLED屏幕指令使用方法参考0.96寸_OLED_屏幕_SSD1306_IIC通信_入门教程_指令详解_驱动介绍

PCtolCD2022完美版----中国移动云盘链接:https://caiyun.139.com/m/i?095CtZC6JMpnN
提取码:Hgdx
 

二.创建项目

        1.使用STM32CubeMX创建相关项目

                1).选择相应芯片

                        我使用的是嘉立创天空星-青春版STM32VET6

                2).配置调试方式及时钟配置--请你按照自已的设备设置

                3).初始化相关 I2C GPIO口

        

        4.修改项目属性 -- 生成

        三.配置相关代码

         1.关于HAL发送I2C数据

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)
/*
    hi2c 对应I2C初始化对象
    DevAddress 从设备地址
    MemAddress 从设备要读写的地址
    pData 发送的数据
    Size 发送的字节大小‘
    Timeout 超时时间
*/

         2.发送命令代码---当前OLED默认从设备地址是0x78

        0x78 从机设备地址

        0x00 从机设备存储地址

void WriteCmd(uint8_t cmd)
{
	HAL_I2C_Mem_Write(&hi2c2,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&cmd,1,1000);
}

        3.发送数据代码

void WriteDat(uint8_t data)
{
	HAL_I2C_Mem_Write(&hi2c2,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&data,1,1000);
}

        4.打开关闭OLED屏幕指令

/**
 *@brief		打开OLED
 *@param		
 *@retval
 */
void OLED_ON(void)   //打开OLED
{
	WriteCmd(0X8D);   //设置电荷泵
	WriteCmd(0X14);   //开启电荷泵
	WriteCmd(0XAF);   //OLED唤醒
}
 /**
  *@brief	关闭OLED
  *@param
  *@retval
  */
void OLED_OFF(void)  //关闭OLED
{
	WriteCmd(0X8D);   //设置电荷泵
	WriteCmd(0X10);   //关闭电荷泵
	WriteCmd(0XAE);   //关闭OLED
}

        5.设置屏幕起始点

void SetPos(unsigned char x,unsigned char y)  //设置起点坐标
{
	WriteCmd(0xb0+y);
	WriteCmd((x&0xf0)>>4|0x10); //取高位
	WriteCmd((x&0x0f)|0x01);    //取低位
}

        6.屏幕初始化 -- 此代码厂商提供

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

        7.全屏填充函数

void OLED_Fill(unsigned char Fill_Data)  //全屏填充
{
	unsigned char m,n;
	
	for(m=0;m<8;m++){
		WriteCmd(0xb0+m);
		WriteCmd(0x00);
		WriteCmd(0x10);
	
	  for(n=0;n<128;n++){
		WriteDat(Fill_Data);
		}
	}
}

        8.显示字符串代码

void OLED_ShowStr(unsigned char x,unsigned char y,unsigned char ch[])
{
    unsigned char c = 0,i = 0,j = 0;
			
	   while(ch[j] !='\0')
		{
             // 字符取模从’!‘开始
             // '!'-33 是0
			 c= ch[j] -33;
			 if(x >120)
			 {
					 x = 0;
					 y+=2 ;
			 }
			 SetPos(x,y);
			 for(i = 0;i<8;i++)
			 WriteDat( letter[c*16+i] );
			 SetPos(x,y+1);
			 for(i = 0;i<8;i++)
			 WriteDat( letter[c*16+i+8] );
			 x+=8;
			 j++;
	 }	 
}	

四.显示字符串

        需要显示字符在OLED屏幕上就需要对字符进行取模

        1.字符取模

        根据ascii码排序的字符和符号

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

        打开取模软件---修改取模设置---请你按照图片上进行取模

       

       

复制取模完成的到代码 -- 注意删除括号(可以在取模软件中取消自定义生成中的数据前后缀)

 

        2.主函数使用

至此使用STM32CubeMX生成代码显示OLED到此结束---感谢你的阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值