单片机
返回首页

STM32CUBEMX开发GD32F303(14)----IIC之配置OLED

2024-09-13 来源:elecfans

概述

本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。 使用IIC进行驱动SSD1306的12864OLED。 最近在弄ST和GD的课程,需要GD样片的可以加群申请:615061293 。

视频教学

https://www.bilibili.com/video/BV1Q8411t7sK/

csdn课程

课程更加详细。 https://download.csdn.net/course/detail/37152

样品申请

https://www.wjx.top/vm/mB2IKus.aspx

生成例程

这里准备了自己绘制的开发板进行验证。在这里插入图片描述查看原理图,PB8和PB9设置为开发板的IIC。在这里插入图片描述

配置时钟树

配置时钟为64M。在这里插入图片描述

IIC配置

本次实验使用的IIC与显示屏通信,配置如下。在这里插入图片描述

OLED

查看文档可以知道地址为b0111100或者b0111101,当R/W位置写0的时候,才能进行写的操作,那么地址默认为0x78(b01111000)或者0x7A(b01111010)

在这里插入图片描述

参考程序

这里使用0.96OLED显示屏_STM32F103C8_IIC_V1.0来进行移植在这里插入图片描述在这里插入图片描述查看工程可以知道主要是有3个文件来进行OLED的驱动,移入OLE.h .c 、oledfont.h 、 bmp.h 移入文件之后要注意导入C文件。在这里插入图片描述

删除没有用的头文件 删除sys.h文件在这里插入图片描述

删除delay.h文件在这里插入图片描述

可以查看stdint.h在这里插入图片描述

在oled.h中添加u8 u32定义 也可以直接修改

typedef unsigned          char u8;

typedef unsigned           int u32;


在这里插入图片描述先把oled.h添加主程序中。在这里插入图片描述

查看oled.h,可以看到IIC定义,同时也是模拟IIC,可以注释掉在这里插入图片描述

查看oled.c,可以看到是模拟iic,这些都可以注释不要,我们使用的是iIC,不是模拟。

在这里插入图片描述

HAL_I2C_Mem_Write()

IIC写固定的设备写入数据。 记得导入#include 'i2c.h'在这里插入图片描述

将HAL_I2C_Mem_Write函数放入oled.c中。 例如将Write_IIC_Command函数修改为HAL_I2C_Mem_Write发送方式。在这里插入图片描述

向0x78设备写命令0x00的IIC_Command指令。

/**********************************************

// IIC Write Command

**********************************************/

void Write_IIC_Command(unsigned char IIC_Command)

{

//   IIC_Start();

//   Write_IIC_Byte(0x78);            //Slave address,SA0=0

//    IIC_Wait_Ack();    

//   Write_IIC_Byte(0x00);            //write command

//    IIC_Wait_Ack();    

//   Write_IIC_Byte(IIC_Command); 

//    IIC_Wait_Ack();    

//   IIC_Stop();



     HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&IIC_Command,1,0x100);


}

IIC写数据 向0x78设备写数据0x40的IIC_Data指令。


/**********************************************

// IIC Write Data

**********************************************/

void Write_IIC_Data(unsigned char IIC_Data)

{

//   IIC_Start();

//   Write_IIC_Byte(0x78);            //D/C#=0; R/W#=0

//    IIC_Wait_Ack();    

//   Write_IIC_Byte(0x40);            //write data

//    IIC_Wait_Ack();    

//   Write_IIC_Byte(IIC_Data);

//    IIC_Wait_Ack();    

//   IIC_Stop();

     HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&IIC_Data,1,0x100);



}


在oled.c中,OLED_Init初始化可以注释掉gpio初始化在这里插入图片描述

在oled.c中,OLED_Init初始化中有个延时800ms。 导入

#include 'stm32f1xx_hal.h' 可以使用HAL_Delay(800);

在这里插入图片描述

取模

在这里插入图片描述

在这里插入图片描述

在oledfont.h中放入字库在这里插入图片描述

char Hzk[][32]={


// 记(0) 帖(1) 年(2) 月(3) 日(4)


{0x40,0x40,0x42,0xCC,0x00,0x00,0x00,0x84,0x84,0x84,0x84,0x84,0xFC,0x00,0x00,0x00},

{0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x3F,0x40,0x40,0x40,0x40,0x41,0x40,0x70,0x00},/*'记',0*/

/* (16 X 16 , 宋体 )*/


{0x00,0xF8,0x08,0xFF,0x08,0xF8,0x00,0x00,0x00,0x00,0xFF,0x10,0x10,0x10,0x10,0x00},

{0x00,0x0F,0x00,0xFF,0x08,0x0F,0x00,0xFF,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00},/*'帖',1*/

/* (16 X 16 , 宋体 )*/


{0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00},

{0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00},/*'年',2*/

/* (16 X 16 , 宋体 )*/


{0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00},

{0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00},/*'月',3*/

/* (16 X 16 , 宋体 )*/


{0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00},

{0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00},/*'日',4*/

/* (16 X 16 , 宋体 )*/





};


在main.c中添加显示


OLED_Init();            //初始化OLED  

        OLED_Clear()      ; 

        OLED_ShowCHinese(0,0,0);//记

        OLED_ShowCHinese(16,0,1);//帖



        OLED_ShowNum(0,2,2022,4,16);//显示ASCII字符的码值             

        OLED_ShowCHinese(32,2,2);//年    

        OLED_ShowNum(48,2,9,1,16);//显示ASCII字符的码值         

        OLED_ShowCHinese(64,2,3);//月

        OLED_ShowNum(80,2,10,2,16);//显示ASCII字符的码值                 

        OLED_ShowCHinese(96,2,4);//日


字体大小只有2个在这里插入图片描述显示字符

OLED_ShowString(40,2,'ZXY',8);

在这里插入图片描述

图片放在bmp.h中。


#ifndef __BMP_H

#define __BMP_H        


unsigned char BMP1[]={

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x1F,0x1F,0x7F,0xFF,0xFF,

0xFF,0xFF,0xFF,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x0F,0x0F,

0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,

0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC7,0xC7,0xC7,0xC4,0x04,0x04,0x04,0x07,0xFF,

0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x8F,0x80,0x80,

0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3,0xE3,0xE3,0xE3,0xE3,0xE3,

0xE3,0xE3,0xE3,0xE3,0xE3,0xE3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x1F,

0x1F,0x1F,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0x8F,0x8F,

0x8F,0x8F,0x8F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,

0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x06,0x06,0x07,0x0F,

0xFF,0xFF,0xFF,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x00,0x00,

0x00,0x00,0xF8,0xF8,0xF8,0xF8,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,

0x00,0xC7,0xC7,0xC7,0xC7,0xC7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,

0xFF,0x00,0x00,0x00,0xFF,0xFF,0x0F,0x0F,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,

0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x03,0x03,0x03,0xE3,0xE0,0xE0,0xE0,

0xE0,0xE3,0xE3,0x03,0x03,0x03,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xF0,0xF0,0xF0,

0xFF,0xF0,0xF0,0xF0,0xFF,0xFF,0xF0,0xF0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xF0,

0xF0,0xF0,0xF0,0xF8,0xF8,0xF8,0xFF,0xFF,0xF0,0xF0,0xF0,0xF0,0xF1,0xF1,0xF1,0xF1,

0xF1,0xF1,0xF1,0xF0,0xF0,0xF0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*'D:GD32F303GD32F30x_Firmware_Library_V2.1.4_iic_oled记帖.bmp',0*/

/* (64 X 64 )*/


};



#endif


显示图片

delay_1ms(2000);

        OLED_Clear();      

        OLED_DrawBMP(0,0,64,8,BMP1);  //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)


在这里插入图片描述


OLED.C

//////////////////////////////////////////////////////////////////////////////////     

//  功能描述   : 0.69寸OLED 接口演示例程(STM32F103ZE系列IIC)

//              说明: 

//              ----------------------------------------------------------------

//              GND   电源地

//              VCC   接5V或3.3v电源

//              SCL   接PA5(SCL)

//              SDA   接PA7(SDA)            

//              ----------------------------------------------------------------

//All rights reserved

//////////////////////////////////////////////////////////////////////////////////

#include 'oled.h'

#include 'stdlib.h'

#include 'oledfont.h'       

//#include 'delay.h'

#include 'stm32f1xx_hal.h'

#include 'i2c.h'


//OLED的显存

//存放格式如下.

//[0]0 1 2 3 ... 127    

//[1]0 1 2 3 ... 127    

//[2]0 1 2 3 ... 127    

//[3]0 1 2 3 ... 127    

//[4]0 1 2 3 ... 127    

//[5]0 1 2 3 ... 127    

//[6]0 1 2 3 ... 127    

//[7]0 1 2 3 ... 127                

/**********************************************

//IIC Start

**********************************************/

/**********************************************

//IIC Start

**********************************************/

//void IIC_Start()

//{


//    OLED_SCLK_Set() ;

//    OLED_SDIN_Set();

//    OLED_SDIN_Clr();

//    OLED_SCLK_Clr();

//}


///**********************************************

////IIC Stop

//**********************************************/

//void IIC_Stop()

//{

//OLED_SCLK_Set() ;

////    OLED_SCLK_Clr();

//    OLED_SDIN_Clr();

//    OLED_SDIN_Set();

//    

//}


//void IIC_Wait_Ack()

//{


//    //GPIOB- >CRH &= 0XFFF0FFFF;    //设置PB12为上拉输入模式

//    //GPIOB- >CRH |= 0x00080000;

////    OLED_SDA = 1;

////    delay_us(1);

//    //OLED_SCL = 1;

//    //delay_us(50000);

///*    while(1)

//    {

//        if(!OLED_SDA)                //判断是否接收到OLED 应答信号

//        {

//            //GPIOB- >CRH &= 0XFFF0FFFF;    //设置PB12为通用推免输出模式

//            //GPIOB- >CRH |= 0x00030000;

//            return;

//        }

//    }

//*/

//    OLED_SCLK_Set() ;

//    OLED_SCLK_Clr();

//}

///**********************************************

//// IIC Write byte

//**********************************************/


//void Write_IIC_Byte(unsigned char IIC_Byte)

//{

//    unsigned char i;

//    unsigned char m,da;

//    da=IIC_Byte;

//    OLED_SCLK_Clr();

//    for(i=0;i< 8;i++)        

//    {

//            m=da;

//        //    OLED_SCLK_Clr();

//        m=m&0x80;

//        if(m==0x80)

//        {OLED_SDIN_Set();}

//        else OLED_SDIN_Clr();

//            da=da< < 1;

//        OLED_SCLK_Set();

//        OLED_SCLK_Clr();

//        }



//}

/**********************************************

// IIC Write Command

**********************************************/

void Write_IIC_Command(unsigned char IIC_Command)

{

//   IIC_Start();

//   Write_IIC_Byte(0x78);            //Slave address,SA0=0

//    IIC_Wait_Ack();    

//   Write_IIC_Byte(0x00);            //write command

//    IIC_Wait_Ack();    

//   Write_IIC_Byte(IIC_Command); 

//    IIC_Wait_Ack();    

//   IIC_Stop();



     HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&IIC_Command,1,0x100);


}

/**********************************************

// IIC Write Data

**********************************************/

void Write_IIC_Data(unsigned char IIC_Data)

{

//   IIC_Start();

//   Write_IIC_Byte(0x78);            //D/C#=0; R/W#=0

//    IIC_Wait_Ack();    

//   Write_IIC_Byte(0x40);            //write data

//    IIC_Wait_Ack();    

//   Write_IIC_Byte(IIC_Data);

//    IIC_Wait_Ack();    

//   IIC_Stop();

     HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&IIC_Data,1,0x100);



}

void OLED_WR_Byte(unsigned dat,unsigned cmd)

{

    if(cmd)

            {


   Write_IIC_Data(dat);


        }

    else {

   Write_IIC_Command(dat);


    }



}



/********************************************

// fill_Picture

********************************************/

void fill_picture(unsigned char fill_Data)

{

    unsigned char m,n;

    for(m=0;m< 8;m++)

    {

        OLED_WR_Byte(0xb0+m,0);        //page0-page1

        OLED_WR_Byte(0x00,0);        //low column start address

        OLED_WR_Byte(0x10,0);        //high column start address

        for(n=0;n< 128;n++)

            {

                OLED_WR_Byte(fill_Data,1);

            }

    }

}



/***********************Delay****************************************/

void Delay_50ms(unsigned int Del_50ms)

{

    unsigned int m;

    for(;Del_50ms >0;Del_50ms--)

        for(m=6245;m >0;m--);

}


void Delay_1ms(unsigned int Del_1ms)

{

    unsigned char j;

    while(Del_1ms--)

    {    

        for(j=0;j< 123;j++);

    }

}


//坐标设置


    void OLED_Set_Pos(unsigned char x, unsigned char y) 

{     OLED_WR_Byte(0xb0+y,OLED_CMD);

    OLED_WR_Byte(((x&0xf0) >>4)|0x10,OLED_CMD);

    OLED_WR_Byte((x&0x0f),OLED_CMD); 

}         

//开启OLED显示    

void OLED_Display_On(void)

{

    OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令

    OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON

    OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON

}

//关闭OLED显示     

void OLED_Display_Off(void)

{

    OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令

    OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF

    OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF

}                        

//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!      

void OLED_Clear(void)  

{  

    u8 i,n;            

    for(i=0;i< 8;i++)  

    {  

        OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)

        OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址

        OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   

        for(n=0;n< 128;n++)OLED_WR_Byte(0,OLED_DATA); 

    } //更新显示

}

void OLED_On(void)  

{  

    u8 i,n;            

    for(i=0;i< 8;i++)  

    {  

        OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)

        OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址

        OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   

        for(n=0;n< 128;n++)OLED_WR_Byte(1,OLED_DATA); 

    } //更新显示

}

//在指定位置显示一个字符,包括部分字符

//x:0~127

//y:0~63

//mode:0,反白显示;1,正常显示                 

//size:选择字体 16/12 

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)

{          

    unsigned char c=0,i=0;    

        c=chr-' ';//得到偏移后的值            

        if(x >Max_Column-1){x=0;y=y+2;}

        if(Char_Size ==16)

            {

            OLED_Set_Pos(x,y);    

            for(i=0;i< 8;i++)

            OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);

            OLED_Set_Pos(x,y+1);

            for(i=0;i< 8;i++)

            OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);

            }

            else {    

                OLED_Set_Pos(x,y);

                for(i=0;i< 6;i++)

                OLED_WR_Byte(F6x8[c][i],OLED_DATA);


            }

}

//m^n函数

u32 oled_pow(u8 m,u8 n)

{

    u32 result=1;     

    while(n--)result*=m;    

    return result;

}                  

//显示2个数字

//x,y :起点坐标     

//len :数字的位数

//size:字体大小

//mode:模式    0,填充模式;1,叠加模式

//num:数值(0~4294967295);               

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)

{             

    u8 t,temp;

    u8 enshow=0;                           

    for(t=0;t< len;t++)

    {

        temp=(num/oled_pow(10,len-t-1))%10;

        if(enshow==0&&t< (len-1))

        {

            if(temp==0)

            {

                OLED_ShowChar(x+(size2/2)*t,y,' ',size2);

                continue;

            }else enshow=1; 


        }

         OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 

    }

//显示一个字符号串

void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)

{

    unsigned char j=0;

    while (chr[j]!='�')

    {        OLED_ShowChar(x,y,chr[j],Char_Size);

            x+=8;

        if(x >120){x=0;y+=2;}

            j++;

    }

}

//显示汉字

void OLED_ShowCHinese(u8 x,u8 y,u8 no)

{                      

    u8 t,adder=0;

    OLED_Set_Pos(x,y);    

    for(t=0;t< 16;t++)

        {

                OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);

                adder+=1;

     }    

        OLED_Set_Pos(x,y+1);    

    for(t=0;t< 16;t++)

            {    

                OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);

                adder+=1;

      }                    

}

/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/

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_Set_Pos(x0,y);

    for(x=x0;x< x1;x++)

        {      

            OLED_WR_Byte(BMP[j++],OLED_DATA);            

        }

    }


//初始化SSD1306                        

void OLED_Init(void)

{     





//     GPIO_InitTypeDef  GPIO_InitStructure;

//     


//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     //使能A端口时钟

//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;     

//     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出

//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz

//     GPIO_Init(GPIOA, &GPIO_InitStructure);      //初始化GPIOD3,6

//     GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7);    



//delay_ms(800);


    HAL_Delay(800);



OLED_WR_Byte(0xAE,OLED_CMD);//--display off

    OLED_WR_Byte(0x00,OLED_CMD);//---set low column address

    OLED_WR_Byte(0x10,OLED_CMD);//---set high column address

    OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  

    OLED_WR_Byte(0xB0,OLED_CMD);//--set page address

    OLED_WR_Byte(0x81,OLED_CMD); // contract control

    OLED_WR_Byte(0xFF,OLED_CMD);//--128   

    OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap 

    OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse

    OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)

    OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty

    OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction

    OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset

    OLED_WR_Byte(0x00,OLED_CMD);//


    OLED_WR_Byte(0xD5,OLED_CMD);//set osc division

    OLED_WR_Byte(0x80,OLED_CMD);//


    OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off

    OLED_WR_Byte(0x05,OLED_CMD);//


    OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period

    OLED_WR_Byte(0xF1,OLED_CMD);//


    OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion

    OLED_WR_Byte(0x12,OLED_CMD);//


    OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh

    OLED_WR_Byte(0x30,OLED_CMD);//


    OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable

    OLED_WR_Byte(0x14,OLED_CMD);//


    OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel

}

OLED.h

//////////////////////////////////////////////////////////////////////////////////     

//本程序只供学习使用,未经作者许可,不得用于其它任何用途


//

//  文 件 名   : main.c

//  版 本 号   : v2.0

//  作    者   : Evk123

//  生成日期   : 2014-0101

//  最近修改   : 

//  功能描述   : 0.69寸OLED 接口演示例程(STM32F103ZE系列IIC)

//              说明: 

//              ----------------------------------------------------------------

//              GND   电源地

//              VCC   接5V或3.3v电源

//              SCL   接PA5(SCL)

//              SDA   接PA7(SDA)            

//              ----------------------------------------------------------------

//记帖Q群:615061293

//B站视频:https://space.bilibili.com/26152390

//CSDN:https://blog.csdn.net/qq_24312945/

//All rights reserved

//////////////////////////////////////////////////////////////////////////////////


#ifndef __OLED_H

#define __OLED_H                   


#include 'stdlib.h'            

#define OLED_MODE 0

#define SIZE 8

#define XLevelL        0x00

#define XLevelH        0x10

#define Max_Column    128

#define Max_Row        64

#define    Brightness    0xFF 

#define X_WIDTH     128

#define Y_WIDTH     64                                  

//-----------------OLED IIC端口定义----------------                         


//#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_5)//SCL

//#define OLED_SCLK_Set() GPIO_SetBits(GPIOA,GPIO_Pin_5)


//#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_7)//SDA

//#define OLED_SDIN_Set() GPIO_SetBits(GPIOA,GPIO_Pin_7)



#define OLED_CMD  0    //写命令

#define OLED_DATA 1    //写数据




typedef unsigned          char u8;

typedef unsigned           int u32;



//OLED控制用函数

void OLED_WR_Byte(unsigned dat,unsigned cmd);  

void OLED_Display_On(void);

void OLED_Display_Off(void);                                                  

void OLED_Init(void);

void OLED_Clear(void);

void OLED_DrawPoint(u8 x,u8 y,u8 t);

void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size);

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);

void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size);     

void OLED_Set_Pos(unsigned char x, unsigned char y);

void OLED_ShowCHinese(u8 x,u8 y,u8 no);

void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);

void Delay_50ms(unsigned int Del_50ms);

void Delay_1ms(unsigned int Del_1ms);

void fill_picture(unsigned char fill_Data);

void Picture();

void IIC_Start();

void IIC_Stop();

void Write_IIC_Command(unsigned char IIC_Command);

void Write_IIC_Data(unsigned char IIC_Data);

void Write_IIC_Byte(unsigned char IIC_Byte);


void IIC_Wait_Ack();

#endif

OLEDFONT.H

复制

#ifndef __OLEDFONT_H

#define __OLEDFONT_H        

//常用ASCII表

//偏移量32

//ASCII字符集

//偏移量32

//大小:12*6

/************************************6*8的点阵************************************/

const unsigned char F6x8[][6] =        

{

0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp

0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !

0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// '

0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #

0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $

0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %

0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &

0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '

0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (

0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )

0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *

0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +

0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,

0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -

0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .

0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /

0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0

0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1

0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2

0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3

0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4

0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5

0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6

0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7

0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8

0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9

0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :

0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;

0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// < 

0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =

0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >

0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?

0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @

0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A

0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B

0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C

0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D

0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E

0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F

0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G

0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H

0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I

0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J

0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K

0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L

0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M

0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N

0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O

0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P

0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q

0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R

0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S

0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T

0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U

0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V

0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W

0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X

0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y

0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z

0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [

0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55

0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]

0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^

0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _

0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '

0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a

0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b

0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c

0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d

0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e

0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f

0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g

0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h

0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i

0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j

0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k

0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l

0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m

0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n

0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o

0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p

0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q

0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r

0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s

0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t

0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u

0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v

0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w

0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x

0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y

0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z

0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines

};

/****************************************8*16的点阵************************************/

const unsigned char F8X16[]=      

#ifndef __OLEDFONT_H

#define __OLEDFONT_H        

//常用ASCII表

//偏移量32

//ASCII字符集

//偏移量32

//大小:12*6

/************************************6*8的点阵************************************/

const unsigned char F6x8[][6] =        

{

0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp

0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !

0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// '

0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #

0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $

0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %

0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &

0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '

0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (

0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )

0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *

0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +

0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,

0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -

0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .

0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /

0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0

0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1

0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2

0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3

0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4

0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5

0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6

0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7

0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8

0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9

0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :

0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;

0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// < 

0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =

0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >

0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?

0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @

0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A

0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B

0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C

0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D

0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E

0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F

0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G

0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H

0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I

0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J

0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K

0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L

0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M

0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N

0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O

0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P

0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q

0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R

0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S

0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T

0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U

0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V

0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W

0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X

0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y

0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z

0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [

0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55

0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]

0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^

0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _

0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '

0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a

0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b

0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c

0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d

0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e

0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f

0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g

0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h

0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i

0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j

0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k

0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l

0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m

0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n

0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o

0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p

0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q

0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r

0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s

0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t

0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u

0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v

0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w

0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x

0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y

0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z

0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines

};

/****************************************8*16的点阵************************************/

const unsigned char F8X16[]=


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何构建一个触摸传感器电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章