555|2

582

帖子

0

资源

一粒金砂(高级)

【MM32 eMiniBoard测评】+OLED屏的驱动显示 [复制链接]

本帖最后由 jinglixixi 于 2020-11-1 00:14 编辑

1.使用GPIO口模拟I2C接口

在例程中提供了一个LED灯闪烁程序,通过它我们可以掌握控制GPIO口定义输出口及输出高低电平信号的方法,据此可用GPIO口来模拟I2C接口以控制该接口形式的OLED显示屏它该OLED显示屏具有占用引脚少,显示信息量较多的特点。

在引脚的分配上,用PB6来连接OLED屏的SCK引脚,用PB7来连接OLED屏的SDA引脚,为此其输出高低的定义为:

#define OLED_SCLK_Clr()  GPIO_ResetBits(GPIOB,GPIO_Pin_13)

#define OLED_SCLK_Set()  GPIO_SetBits(GPIOB,GPIO_Pin_13)

 

#define OLED_SDIN_Clr()  GPIO_ResetBits(GPIOB,GPIO_Pin_14)

#define OLED_SDIN_Set()  GPIO_SetBits(GPIOB,GPIO_Pin_14)

 

引脚输出功能的配置函数为:

void APP_OLED_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13 | GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

相应的OLED显示屏的初始化函数为:

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

2. OLED屏显示驱动

在完成功能引脚定义及初始化的基础下,要实现具体的字符及数值的显示,需相关函数的配合,关键的函数为:

void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t 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],OLED_DATA);
              }
}


uint32_t oled_pow(uint8_t m,uint8_t n)
{
        uint32_t result=1;
        while(n--)result*=m;
        return result;
}


void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
{
         uint8_t t,temp;
         uint8_t 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(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
         unsigned char j=0;
         while (chr[j]!='\0')
         {              OLED_ShowChar(x,y,chr[j],Char_Size);
                        x+=8;
                        if(x>120){x=0;y+=2;}
                        j++;
         }
}

3.显示功能的测试

为了测试OLED屏的显示功能,其主函数如下:

s32 main(void)
{
              APP_OLED_Init();
              OLED_Init();
              OLED_Clear(); 
              OLED_ShowString(0,0,"MM32F0133 TEST",16);
              OLED_ShowString(0,2,"OLED Display",16);
              while(1);
}

相应的显示效果如图所示,后面就可以为其添加具体的应用功能了。

image-20201101000440-1.png

 显示效果图


回复

401

帖子

0

资源

版主

刚好有类似的LED灯,到时候也驱动一下看看。

点评

这款OLED屏是最适合Arduino接口的  详情 回复 发表于 2020-11-1 17:54

回复

582

帖子

0

资源

一粒金砂(高级)

w494143467 发表于 2020-11-1 10:38 刚好有类似的LED灯,到时候也驱动一下看看。

这款OLED屏是最适合Arduino接口的


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

最新文章 更多>>
    关闭
    站长推荐上一条 1/5 下一条

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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