478|0

1286

帖子

0

资源

纯净的硅(高级)

【国民技术N32G457评测】OLED屏显示驱动 与RTC电子时钟 [复制链接]

本帖最后由 jinglixixi 于 2022-2-10 09:57 编辑

OLED屏有多种类型,按接口方式可分I2C接口和SPI接口方式,按色彩可分为单色、双色及彩色方式。此外,按几何尺寸分又有0.91寸、0.96寸等规格。

这里介绍的是驱动I2C接口的0.96寸双色显示屏,由于在实现方式上又分为硬件和软件2种方式,这里仅以软件的方式来实现。

该显示屏与开发板的连接关系为:

CLK---PE2

DIN ---PE4

为实现高低电平的输出所定义语句为:

#define OLED_SCLK_Clr()  GPIOE->PBC = GPIO_PIN_2

#define OLED_SCLK_Set()  GPIOE->PBSC = GPIO_PIN_2

#define OLED_SDIN_Clr()  GPIOE->PBC = GPIO_PIN_4

#define OLED_SDIN_Set()  GPIOE->PBSC = GPIO_PIN_4

设置相关引脚为输出功能的函数为:

void OLEDInit(void)
{
    GPIO_InitType GPIO_InitStructure;
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOE, ENABLE);
    GPIO_InitStructure.Pin = GPIO_PIN_2|GPIO_PIN_4;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitPeripheral(GPIOE, &GPIO_InitStructure);
}

实现I2C启停的函数为:

void IIC_Start()
{
      OLED_SCLK_Set();
      Delayus(2);
      OLED_SDIN_Set();
      Delayus(2);
      OLED_SDIN_Clr();
      Delayus(2);
      OLED_SCLK_Clr();
      Delayus(2);
}

void IIC_Stop()
{
      OLED_SCLK_Set();
      Delayus(2);
      OLED_SDIN_Clr();
      Delayus(2);
      OLED_SDIN_Set();
      Delayus(2);
}

该显示屏的初始化函数为:

void OLED_Init(void)
{
    OLED_SCLK_Set();
    OLED_SDIN_Set();
    Delayms(800);
    OLED_WR_Byte(0xAE,OLED_CMD);
    OLED_WR_Byte(0x02,OLED_CMD);
    OLED_WR_Byte(0x10,OLED_CMD);
    OLED_WR_Byte(0x40,OLED_CMD);
    OLED_WR_Byte(0x81,OLED_CMD);
    OLED_WR_Byte(0xff,OLED_CMD);
    OLED_WR_Byte(0xA1,OLED_CMD);
    OLED_WR_Byte(0xC8,OLED_CMD);
    OLED_WR_Byte(0xA6,OLED_CMD);
    OLED_WR_Byte(0xA8,OLED_CMD);
    OLED_WR_Byte(0x3f,OLED_CMD);
    OLED_WR_Byte(0xD3,OLED_CMD);
    OLED_WR_Byte(0x00,OLED_CMD);
    OLED_WR_Byte(0xd5,OLED_CMD);
    OLED_WR_Byte(0x80,OLED_CMD);
    OLED_WR_Byte(0xD9,OLED_CMD);
    OLED_WR_Byte(0xF1,OLED_CMD);
    OLED_WR_Byte(0xDA,OLED_CMD);
    OLED_WR_Byte(0x12,OLED_CMD);
    OLED_WR_Byte(0xDB,OLED_CMD);
    OLED_WR_Byte(0x40,OLED_CMD);
    OLED_WR_Byte(0x20,OLED_CMD);
    OLED_WR_Byte(0x02,OLED_CMD);
    OLED_WR_Byte(0x8D,OLED_CMD);
    OLED_WR_Byte(0x14,OLED_CMD);
    OLED_WR_Byte(0xA4,OLED_CMD)
    OLED_WR_Byte(0xA6,OLED_CMD);
    OLED_WR_Byte(0xAF,OLED_CMD);
    OLED_WR_Byte(0xAF,OLED_CMD);
}

实现字符串显示的函数为:

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++;
    }
}

实现图示效果的主程序为:

int main(void)
{
    LedInit(PORT_GROUP2, LED3_PIN);
    OLEDInit();
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(20,0,"N32G457 ",16);
    OLED_ShowString(20,2,"OLED TEST",16);
    while (1)
    {       

        LedBlink(PORT_GROUP2, LED3_PIN);
        Delay(0x28FFFF);
    }
}

经编译下载,其显示效果如图1所示。

image-20220210094812-1.png 图1  OLED屏显示效果

以该显示功能为基础,结合RTC计时器即可实现电子时钟功能。

实现日期显示的函数为:

void RTC_DateShowP(void)
{
      RTC_DateType  RTC_DateStructure;
      RTC_GetDate(RTC_FORMAT_BIN, &RTC_DateStructure);
      OLED_ShowNum(36,4,RTC_DateStructure.Year,2,16);
      OLED_ShowNum(60,4,RTC_DateStructure.Month,2,16);
      OLED_ShowNum(84,4,RTC_DateStructure.Date,2,16);
}

实现设计显示的函数为:

void RTC_TimeShowP(void)
{
    RTC_TimeType  RTC_TimeStructure;
    RTC_GetTime(RTC_FORMAT_BIN, &RTC_TimeStructure);
    OLED_ShowNum(20,6,RTC_TimeStructure.Hours,2,16);
    OLED_ShowNum(44,6,RTC_TimeStructure.Minutes,2,16);
    OLED_ShowNum(68,6,RTC_TimeStructure.Seconds,2,16);
   (void)RTC->DATE;
}

实现RTC电子时钟的主程序为:

int main(void)
{
    LEDInit(LED1_PORT,LED1_PIN);
    LEDOff(LED1_PORT,LED1_PIN);
    OLEDInit();
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(20,0,"N32G457 ",16);
    OLED_ShowString(20,2,"OLED & RTC",16);
    OLED_ShowString(20,4,"20  -  -",16);
    OLED_ShowString(20,6,"  :  :",16);
    RTC_DateAndTimeDefaultVale();
    RTC_CLKSourceConfig(RTC_CLK_SRC_TYPE_LSE, true, true);
    RTC_PrescalerConfig();
    RTC_DateRegulate();
    RTC_TimeRegulate();
    RTC_ConfigCalibOutput(RTC_CALIB_OUTPUT_1HZ);
    RTC_ConfigOutputType(RTC_OUTPUT_PUSHPULL);
    RTC_EnableCalibOutput(ENABLE);
    EXTI_PB8_TimeStamp_Configuration();
    EXTI20_TimeStampIRQn_Configuration(EXTI_Trigger_Falling);
    RTC_ClrFlag(RTC_FLAG_TISF);
    RTC_ClrFlag(RTC_FLAG_TISOVF);
    RTC_EnableTimeStamp(RTC_TIMESTAMP_EDGE_FALLING, ENABLE);
    while (1)
    {
       if (RTC_GetFlagStatus(RTC_FLAG_TISF) != RESET)
       {
          RTC_DateShowP();
          RTC_TimeShowP();
          RTC_ClrFlag(RTC_FLAG_TISF);
          RTC_ClrFlag(RTC_FLAG_TISOVF);
        }
        LEDBlink(LED1_PORT,LED1_PIN);
        SysTick_Delay_Ms(1000);
    }
}

经编译下载,在连接PC13与PB8的情况下,RTC电子时钟的显示效果如图2和图3所示。

image-20220210094812-2.png 图2  电子时钟计时效果1

image-20220210094812-3.png 图3  电子时钟计时效果2


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

查找数据手册?

EEWorld Datasheet 技术支持

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

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

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

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

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