【STM32F723 Discovery Kit】I2C驱动OLED屏
本帖最后由 TL-LED 于 2023-11-3 08:15 编辑<p><span style="font-size:16px;">这篇来学习下使用STM32F723 Discovery Kit开发板驱动OLED显示屏。</span></p>
<p> </p>
<p><span style="font-size:16px;"><strong>一、硬件</strong></span></p>
<p> </p>
<p><span style="font-size:16px;">开发板的Arduino 接口使用了I2C2的PH4和PH5引脚,下面测试使用这个端口。</span></p>
<p><span style="font-size:16px;"></span></p>
<p> </p>
<p><span style="font-size:16px;"><strong>二、创建工程</strong></span></p>
<p> </p>
<p><span style="font-size:16px;">使用STM32CubMX创建项目工程。</span></p>
<p> </p>
<p><span style="font-size:16px;">2.1、新建项目</span></p>
<p><span style="font-size:16px;">使用的是官网的开发板,选择相应的开发板型号</span></p>
<p><span style="font-size:16px;"></span></p>
<p><span style="font-size:16px;">点击开始项目</span></p>
<p> </p>
<p><span style="font-size:16px;">2.2、外设配置</span></p>
<p><span style="font-size:16px;">根据项目需要可以修改时钟和外设端口,要使用I2C,开发板默认已经配置好,这里选择默认。</span></p>
<p><span style="font-size:16px;"></span></p>
<p> </p>
<p><span style="font-size:16px;">2.3、生成项目</span></p>
<p><span style="font-size:16px;">选择项目存储的路径、名称和编译工具的类型,生成代码。</span></p>
<p><span style="font-size:16px;"></span></p>
<p> </p>
<p><span style="font-size:16px;">2.4、生成的代码</span></p>
<p><span style="font-size:16px;"></span></p>
<p> </p>
<p><span style="font-size:16px;"><strong>三、代码</strong></span></p>
<p> </p>
<p><span style="font-size:16px;">在生成的工程中,添加测试代码</span></p>
<p> </p>
<p><span style="font-size:16px;">3.1、oled.c</span></p>
<pre>
<code>#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;
temp = dat;
temp = 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 != '\0')
{
c = ch - 32;
if(x > 126)
{
x = 0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<6;i++)
WriteDat(F6x8);
x += 6;
j++;
}
}break;
case 2:
{
while(ch != '\0')
{
c = ch - 32;
if(x > 120)
{
x = 0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<8;i++)
WriteDat(F8X16);
OLED_SetPos(x,y+1);
for(i=0;i<8;i++)
WriteDat(F8X16);
x += 8;
j++;
}
}break;
}
}
void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
{
unsigned char wm=0;
unsigned intadder=32*N;
OLED_SetPos(x , y);
for(wm = 0;wm < 16;wm++)
{
WriteDat(F16x16);
adder += 1;
}
OLED_SetPos(x,y + 1);
for(wm = 0;wm < 16;wm++)
{
WriteDat(F16x16);
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);
}
}
}
</code></pre>
<p> </p>
<p><span style="font-size:16px;">主要代码是I2C接口的函数</span></p>
<p><span style="font-size:16px;">HAL_I2C_Mem_Write(&hi2c2,OLED_ADDRESS,addr,I2C_MEMADD_SIZE_8BIT,temp,1,10);</span></p>
<p> </p>
<p><span style="font-size:16px;">3.2、main.c</span></p>
<p><span style="font-size:16px;">在main.c中添加OLED函数</span></p>
<pre>
<code> 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 */
}</code></pre>
<p> </p>
<p><span style="font-size:16px;"><strong>四、运行结果</strong></span></p>
<p> </p>
<p><span style="font-size:16px;">显示屏显示内容</span></p>
<p><span style="font-size:16px;"></span></p>
<div style="text-align: center;"> </div>
<div style="text-align: center;"> </div>
<p> </p>
<p> </p>
<p>楼主您这还给开发板整了一块副屏</p>
<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/lol.gif" width="48" /></p>
lemonboard 发表于 2023-11-3 09:46
楼主您这还给开发板整了一块副屏
<p>学习I2C通信用<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/lol.gif" width="48" /></p>
学习了使用STM32CubMX创建项目工程 电路也很详细多谢楼主 <p>来个副屏显示开发板的状态,主屏开展主要业务,那不是爽!</p>
页:
[1]