TL-LED 发表于 2023-11-3 08:15

【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>&nbsp;</p>

<p><span style="font-size:16px;"><strong>一、硬件</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">开发板的Arduino 接口使用了I2C2的PH4和PH5引脚,下面测试使用这个端口。</span></p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>二、创建工程</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">使用STM32CubMX创建项目工程。</span></p>

<p>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</p>

<p><span style="font-size:16px;">2.4、生成的代码</span></p>

<p><span style="font-size:16px;"></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;"><strong>三、代码</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">在生成的工程中,添加测试代码</span></p>

<p>&nbsp;</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(&amp;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&amp;0xf0)&gt;&gt;4)|0x10);
        WriteCmd((x&amp;0x0f)|0x01);
}

void OLED_Fill(unsigned char fill_Data)//È«ÆÁÌî³ä
{
        unsigned char m,n;
        for(m=0;m&lt;8;m++)
        {
                WriteCmd(0xb0+m);                //page0-page1
                WriteCmd(0x00);                //low column start address
                WriteCmd(0x10);                //high column start address
                for(n=0;n&lt;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 &gt; 126)
                                {
                                        x = 0;
                                        y++;
                                }
                                OLED_SetPos(x,y);
                                for(i=0;i&lt;6;i++)
                                        WriteDat(F6x8);
                                x += 6;
                                j++;
                        }
                }break;
                case 2:
                {
                        while(ch != '\0')
                        {
                                c = ch - 32;
                                if(x &gt; 120)
                                {
                                        x = 0;
                                        y++;
                                }
                                OLED_SetPos(x,y);
                                for(i=0;i&lt;8;i++)
                                        WriteDat(F8X16);
                                OLED_SetPos(x,y+1);
                                for(i=0;i&lt;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 &lt; 16;wm++)
        {
                WriteDat(F16x16);
                adder += 1;
        }
        OLED_SetPos(x,y + 1);
        for(wm = 0;wm &lt; 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&lt;y1;y++)
        {
                OLED_SetPos(x0,y);
    for(x=x0;x&lt;x1;x++)
                {
                        WriteDat(BMP);
                }
        }
}
</code></pre>

<p>&nbsp;</p>

<p><span style="font-size:16px;">主要代码是I2C接口的函数</span></p>

<p><span style="font-size:16px;">HAL_I2C_Mem_Write(&amp;hi2c2,OLED_ADDRESS,addr,I2C_MEMADD_SIZE_8BIT,temp,1,10);</span></p>

<p>&nbsp;</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>&nbsp;</p>

<p><span style="font-size:16px;"><strong>四、运行结果</strong></span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">显示屏显示内容</span></p>

<p><span style="font-size:16px;"></span></p>

<div style="text-align: center;">&nbsp;</div>

<div style="text-align: center;">&nbsp;</div>

<p>&nbsp;</p>

<p>&nbsp;</p>

lemonboard 发表于 2023-11-3 09:46

<p>楼主您这还给开发板整了一块副屏</p>

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/lol.gif" width="48" /></p>

TL-LED 发表于 2023-11-3 10:21

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>

redguo 发表于 2023-11-3 10:54

学习了使用STM32CubMX创建项目工程 电路也很详细多谢楼主

lugl4313820 发表于 2023-11-3 16:42

<p>来个副屏显示开发板的状态,主屏开展主要业务,那不是爽!</p>
页: [1]
查看完整版本: 【STM32F723 Discovery Kit】I2C驱动OLED屏