【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示

文章介绍了如何使用CH32F203微控制器基于内部RTC和I2C接口的SSD1306OLED显示屏构建时钟和温度显示项目。代码从STM32工程修改而来,适配CH32F203,添加了DS18B20温度传感器显示功能。注意内部RTC精度问题,长时间运行可能需要校准。提供了RTC初始化和主程序代码示例。
摘要由CSDN通过智能技术生成

【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示

  • ✨主要是在其基础 上增加温度显示,温度数据来源于DS18B20,更换了OLED驱动显示字体相关内容。
  • 🔰仅作为功能演示,内部RTC精度不高,长时间运行需要依赖第三方数据校准才行。
  • 🔖代码是从STM32工程基础上修改来的,修改相关内容后完全可以适配CH32F203上运行。

⛳相关驱动注意事项

  1. 软件I2C驱动SSD1306需要注意,驱动引脚需要配置为推挽输出模式,而不是像硬件I2C那样引脚配置使用开漏输出。
  2. 采用内部RTC时钟源,其时钟频率为40KHz,作为时钟源分频系数:39999

📑引脚定义说明

  • 🎉引脚可以根据个人使用需求切换到任意其他可用引脚上。
CH32F203 ------  I2C SSD1306 OLED
  PA5	-------  SCL
  PA7   -------   SDA
  
CH32F203 ------  DS18B20
  PA15   ------  DATA

📓驱动代码部分

  • 🌿内部RTC初始化代码
u8 RTC_Init(void)
{
    u8 temp = 0;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//使能PWR和BKP外设时钟
    PWR_BackupAccessCmd(ENABLE);	//使能后备寄存器访问
//	if (BKP_ReadBackupRegister(BKP_DR1) != 0XA1A1)		//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
//	{

    BKP_DeInit();	//复位备份区域
    RCC_LSICmd(ENABLE);
//		RCC_LSEConfig(RCC_LSE_ON);	//设置外部低速晶振(LSE),使用外设低速晶振
//		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)	//检查指定的RCC标志位设置与否,等待低速晶振就绪
//		while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
    while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET && temp < 250)
    {
        temp++;
        delay_ms(10);
    }
    if(temp >= 250)return 1; //初始化时钟失败,晶振有问题
//		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		//设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
    RCC_RTCCLKCmd(ENABLE);	//使能RTC时钟
    RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
    RTC_WaitForSynchro();		//等待RTC寄存器同步
    //		RTC_ITConfig(RTC_IT_ALR, ENABLE);
    RTC_ITConfig(RTC_IT_SEC, ENABLE);		//使能RTC秒中断
    RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
    RTC_EnterConfigMode();/// 允许配置
    RTC_SetPrescaler(40000-1);
//		RTC_SetPrescaler(32767); //设置RTC预分频的值
    RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
    RTC_Set(2023, 4, 25, 18, 0, 35); //设置时间
    RTC_ExitConfigMode(); //退出配置模式
    BKP_WriteBackupRegister(BKP_DR1, 0XA1A1);	//向指定的后备寄存器中写入用户程序数据
    RTC_NVIC_Config();//RCT中断分组设置
    RTC_Get();//更新时间
    return 0; //ok

}
  • 🌿main主程序代码
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "rtc.h"
#include "ds18b20.h"

u8 year_buf[4];
u8 month_buf[2];
u8 day_buf[2];
u8 temp_buf[4];

int main(void)
{
    u16 temp;
    delay_init();	     //延时初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    
    OLED_Init();
    RTC_Init();	  			//RTC初始化
    DS18B20_Init();

    delay_ms(200);
    OLED_CLS();
    OLED_P16x16Ch(40, 0, 36); //第一行第三列显示年
    OLED_P16x16Ch(72, 0, 37);      //显示月
    OLED_P16x16Ch(106, 0, 38);      //显示日
    OLED_P16x16Ch(0, 6, 39); //星
    OLED_P16x16Ch(16, 6, 41); //期
    OLED_P16x16Ch(32, 2, 34);
    OLED_P16x16Ch(32, 4, 35); //:
    OLED_P16x16Ch(80, 2, 34);
    OLED_P16x16Ch(80, 4, 35); //:
    while(1)
    {
        sprintf((char*)year_buf, "%04d", calendar.w_year);
        OLED_P8x16Str(8, 0, year_buf);
        sprintf((char*)month_buf, "%02d", calendar.w_month);
        OLED_P8x16Str(58, 0, month_buf);
        sprintf((char*)day_buf, "%02d", calendar.w_date);
        OLED_P8x16Str(90, 0, day_buf);

        OLED_P16x16Ch(0, 2, calendar.hour / 10 * 2);
        OLED_P16x16Ch(0, 4, calendar.hour / 10 * 2 + 1); //
        OLED_P16x16Ch(16, 2, calendar.hour % 10 * 2);
        OLED_P16x16Ch(16, 4, calendar.hour % 10 * 2 + 1); //

        OLED_P16x16Ch(48, 2, calendar.min / 10 * 2);
        OLED_P16x16Ch(48, 4, calendar.min / 10 * 2 + 1); //
        OLED_P16x16Ch(64, 2, calendar.min % 10 * 2);
        OLED_P16x16Ch(64, 4, calendar.min % 10 * 2 + 1); //

        OLED_P16x16Ch(95, 2, calendar.sec / 10 * 2);
        OLED_P16x16Ch(95, 4, calendar.sec / 10 * 2 + 1); //
        OLED_P16x16Ch(111, 2, calendar.sec % 10 * 2);
        OLED_P16x16Ch(111, 4, calendar.sec % 10 * 2 + 1); //

        OLED_P16x16Ch(32, 6, calendar.week + 20); //

        temp = DS18B20_Get_Temp();
        OLED_P16x16str(64, 6, 11);
        OLED_P16x16str(80, 6, 12);
        OLED_P16x16str(96, 6, temp % 1000 / 100);
        OLED_P16x16str(112, 6, temp % 100 / 10);

    }
}

📚工程源码

  • ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取。
  • 🍁对于文中所提供的相关资源链接将作不定期更换。
链接: https://pan.baidu.com/s/1Xxkau67AxeHwqFFvrP095Q
提取码: 1adv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值