972|4

410

帖子

3

TA的资源

纯净的硅(高级)

楼主
 

【STM32F723 Discovery Kit】I2C驱动OLED屏 [复制链接]

本帖最后由 TL-LED 于 2023-11-3 08:15 编辑

这篇来学习下使用STM32F723 Discovery Kit开发板驱动OLED显示屏。

 

一、硬件

 

开发板的Arduino 接口使用了I2C2的PH4和PH5引脚,下面测试使用这个端口。

 

二、创建工程

 

使用STM32CubMX创建项目工程。

 

2.1、新建项目

使用的是官网的开发板,选择相应的开发板型号

点击开始项目

 

2.2、外设配置

根据项目需要可以修改时钟和外设端口,要使用I2C,开发板默认已经配置好,这里选择默认。

 

2.3、生成项目

选择项目存储的路径、名称和编译工具的类型,生成代码。

 

2.4、生成的代码

 

三、代码

 

在生成的工程中,添加测试代码

 

3.1、oled.c

#include "main.h"
#include "oled/oled.h"
#include "oled/codetab.h"

extern I2C_HandleTypeDef hi2c2;

void I2C_WriteByte(uint8_t addr, uint8_t dat)
{
  uint8_t temp[2];
  temp[0] = dat;
  temp[1] = dat;
	HAL_I2C_Mem_Write(&hi2c2,OLED_ADDRESS,addr,I2C_MEMADD_SIZE_8BIT,temp,1,10);
}


void WriteCmd(unsigned char I2C_Command)
{
    I2C_WriteByte(0x00, I2C_Command);
}

void WriteDat(unsigned char I2C_Data) 
{
    I2C_WriteByte(0x40, I2C_Data);
}

void OLED_WrCmd(unsigned char IIC_Command)
{
	WriteCmd(IIC_Command);
}

void OLED_Init(void)
{
	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(0x40); //0x20,0.77xVcc
	WriteCmd(0x8d); //--set DC-DC enable
	WriteCmd(0x14); //
	WriteCmd(0xaf); //--turn on oled panel
}

void OLED_SetPos(unsigned char x, unsigned char y) 
{ 
	WriteCmd(0xb0+y);
	WriteCmd(((x&0xf0)>>4)|0x10);
	WriteCmd((x&0x0f)|0x01);
}

void OLED_Fill(unsigned char fill_Data)//È«ÆÁÌî³ä
{
	unsigned char m,n;
	for(m=0;m<8;m++)
	{
		WriteCmd(0xb0+m);		//page0-page1
		WriteCmd(0x00);		//low column start address
		WriteCmd(0x10);		//high column start address
		for(n=0;n<128;n++)
			{
				WriteDat(fill_Data);
			}
	}
}

void OLED_CLS(void)//ÇåÆÁ
{
	OLED_Fill(0xff);
}

void OLED_ON(void)
{
	WriteCmd(0X8D);  //ÉèÖõçºÉ±Ã
	WriteCmd(0X14);  //¿ªÆôµçºÉ±Ã
	WriteCmd(0XAF);  //OLED»½ÐÑ
}

void OLED_OFF(void)
{
	WriteCmd(0X8D);  //ÉèÖõçºÉ±Ã
	WriteCmd(0X10);  //¹Ø±ÕµçºÉ±Ã
	WriteCmd(0XAE);  //OLEDÐÝÃß
}

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++)
					WriteDat(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++)
					WriteDat(F8X16[c*16+i]);
				OLED_SetPos(x,y+1);
				for(i=0;i<8;i++)
					WriteDat(F8X16[c*16+i+8]);
				x += 8;
				j++;
			}
		}break;
	}
}

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++)
	{
		WriteDat(F16x16[adder]);
		adder += 1;
	}
	OLED_SetPos(x,y + 1);
	for(wm = 0;wm < 16;wm++)
	{
		WriteDat(F16x16[adder]);
		adder += 1;
	}
}

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++)
		{
			WriteDat(BMP[j++]);
		}
	}
}

 

主要代码是I2C接口的函数

HAL_I2C_Mem_Write(&hi2c2,OLED_ADDRESS,addr,I2C_MEMADD_SIZE_8BIT,temp,1,10);

 

3.2、main.c

在main.c中添加OLED函数

	OLED_Init();
	OLED_Fill(0x00);
	OLED_ShowStr(0,0,"STM32F723",2);
	OLED_ShowStr(0,2,"I2C OLED TEST",2);

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    MX_USB_HOST_Process();

    /* USER CODE BEGIN 3 */
  }

 

四、运行结果

 

显示屏显示内容

 
 

 

 

此帖出自stm32/stm8论坛

最新回复

来个副屏显示开发板的状态,主屏开展主要业务,那不是爽!   详情 回复 发表于 2023-11-3 16:42
点赞 关注
 

回复
举报

110

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

楼主您这还给开发板整了一块副屏

此帖出自stm32/stm8论坛

点评

学习I2C通信用  详情 回复 发表于 2023-11-3 10:21
 
 

回复

410

帖子

3

TA的资源

纯净的硅(高级)

板凳
 
lemonboard 发表于 2023-11-3 09:46 楼主您这还给开发板整了一块副屏

学习I2C通信用

此帖出自stm32/stm8论坛
 
 

回复

33

帖子

4

TA的资源

一粒金砂(中级)

4
 
学习了使用STM32CubMX创建项目工程 电路也很详细多谢楼主
此帖出自stm32/stm8论坛
 
 
 

回复

6841

帖子

11

TA的资源

版主

5
 

来个副屏显示开发板的状态,主屏开展主要业务,那不是爽!

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表