复旦微MCU爱好者天地
直播中

jinglixixi

8年用户 1591经验值
擅长:嵌入式技术 光电显示 接口/总线/驱动 控制/MCU
私信 关注
[经验]

【复旦微电子FM33LG0xx开发板免费试用】+OLED屏的显示驱动及其电子时钟

FM33LGxx开发板在引脚资源的使用上是很有特点的,它既不是按走线的方便来提供引脚资源,也不是以Arduino接口的方式来提供引脚资源,而是按接口的类型,这就为使用通过了极大的方便。

由于该开发板在外设的配置上比较简单,因此有必要为它配上一个显示屏来观察输出信息。这里为它配置的是一款0.96寸的双色显示屏,它使用的是板上的I2C接口。
image.png

图1 显示效果
image.png

图2 I2C接口

该接口所使用的引脚为:

SCL---PA11

SDA---PA12

为便于以GPIO口来模拟I2C驱动,相关引脚输出高低电平的定义为:

#define
SCL_high FL_GPIO_SetOutputPin(GPIOA,
FL_GPIO_PIN_11)

#define
SCL_low FL_GPIO_ResetOutputPin(GPIOA,
FL_GPIO_PIN_11)

#define
SDA_high FL_GPIO_SetOutputPin(GPIOA, FL_GPIO_PIN_12)

#define
SDA_low FL_GPIO_ResetOutputPin(GPIOA,
FL_GPIO_PIN_12)

由于在驱动过程中,只使用到输出工作模式,故其引脚功能的配置函数为:

void
oled_app(void)
{
FL_GPIO_InitTypeDef GPIO_InitStruct = {0};      FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_11|FL_GPIO_PIN_12);
GPIO_InitStruct.pin =FL_GPIO_PIN_11|FL_GPIO_PIN_12;    GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT;    GPIO_InitStruct.outputType =FL_GPIO_OUTPUT_PUSHPULL;    GPIO_InitStruct.pull = FL_DISABLE;
FL_GPIO_Init(GPIOA,&GPIO_InitStruct);}

以模拟方式发送字节数据的函数为:

void Write_IIC_Byte(unsigned char IIC_Byte)
{
    unsigned char i;
    unsigned char m,da;
    da=IIC_Byte;
    SCL_low;
    for(i=0;i<8;i++)
    {
        m=da;
        m=m&0x80;
        if(m==0x80)
        {
            SDA_high;
        }
        else   
        SDA_low;
        da=da<<1;
        SCL_high;
        SCL_low;
     }
}

实现清屏功能的显示函数为:

void OLED_Clear(void)
{
    uint8_t i,n;
    for(i=0;i<8;i++)
    {
        OLED_WR_Byte (0xb0+i,OLED_CMD);
        OLED_WR_Byte (0x00,OLED_CMD);
        OLED_WR_Byte (0x10,OLED_CMD);  
        for(n=0;n<128;n++)
             OLED_WR_Byte(0,OLED_DATA);
    }
}

为实现图1的显示效果,其主程序为:

int main(void)
{
    MF_Clock_Init();
    MF_SystemClock_Config();
    FL_Init();
    MF_Config_Init();
    UserInit();
    key_int();
    led_int();
    oled_app();
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(20,0,"FM33LG0XX",16);
    OLED_ShowCHinese(20,2,0);
    OLED_ShowCHinese(36,2,1);
    OLED_ShowCHinese(52,2,2);
    OLED_ShowCHinese(68,2,3);
    OLED_ShowCHinese(84,2,4);
    OLED_ShowCHinese(100,2,5);
    OLED_ShowString(20,6,"jinglixixi",16);
    while(1);
}

有了OLED屏的显示功能,后面再遇到显示问题时就方便许多。

在FM33LGxx开发板的内部,配有一个低功耗实时时钟日历(RTCC),并带有数字调教功能,其调校精度为+/-0.476ppm,将它与OLED屏的显示功能相结合,即可轻松地实现RTC电子时钟的功能。

image.png

图3 计时效果
image.png
图4 RTC后备电源

由于在例程中提供了标准的RTC读取函数,故稍加修改即可完成RTC的读取及显示功能,修改后的读取函数为:

uint8_t RTC_GetRTCA(FL_RTCA_InitTypeDef *InitStructer)
{
    uint8_t n, i;
    uint8_t Result = 1;
    uint32_t u,ut;
    FL_RTCA_InitTypeDef TempTime1;
    FL_RTCA_GetTime(RTCA, &TempTime1);
    u=((uint32_t *)(&TempTime1))[4];
    OLED_ShowNumH(20,5,u,2,16);
    u=((uint32_t *)(&TempTime1))[5];
    OLED_ShowNumH(44,5,u,2,16);
    u=((uint32_t *)(&TempTime1))[6];
    OLED_ShowNumH(68,5,u,2,16);
    return Result;
}

实现RTC计时功能的测试函数如下,它含有RTC的初始值设置及循环读取功能:

void Test_RTCA(void)
{
    FL_RTCA_InitTypeDef      InitTime;
    FL_RTCA_InitTypeDef      GetTime;
    RTCA_Init();
    InitTime.year   = 0x22;
    InitTime.month  = 0x12;
    InitTime.day    = 0x12;
    InitTime.week   = 0x01;
    InitTime.hour   = 0x08;
    InitTime.minute = 0x30;
    InitTime.second = 0x00;
    RTC_SetRTCA(&InitTime);
    FL_DelayMs(1000);
    while(1)
    {
         RTC_GetRTCA(&GetTime);
         FL_DelayMs(1000);
    }
}

实现图3计时显示效果的主程序为:

int main(void)
{
    MF_Clock_Init();
    MF_SystemClock_Config();
    FL_Init();
    MF_Config_Init();
    UserInit();
    CDIF->CR= 0x02; 
    oled_app();
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(20,0,"FM33LG0XX",16);
    OLED_ShowCHinese(20,2,0);
    OLED_ShowCHinese(36,2,1);
    OLED_ShowCHinese(52,2,2);
    OLED_ShowCHinese(68,2,3);
    OLED_ShowCHinese(84,2,4);
    OLED_ShowCHinese(100,2,5);
    OLED_ShowString(20,6,"jinglixixi",16);
    FL_DelayMs(1000);
    OLED_ShowString(20,6,"      ",16);
    OLED_ShowString(20,5,"  :   :  ",16);
    Test_RTCA();
    while(1)
    {
        LED0_TOG();
        FL_DelayMs(1000);
    }
}

视频演示:

VID_20221211_204303

更多回帖

发帖
×
20
完善资料,
赚取积分