本帖最后由 hulai123456 于 2023-8-30 18:52 编辑
#申请原创# #技术资源# 【HC32L196PCTA测评】+RTC时钟LCD显示
RTC时钟介绍
HC32L96给我们提供了实时时钟/日历提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过 AM/PM 寄存器位,决定采用24或12小时格式。下图所示是其参考手册上所述基本特性和基本框图。具有最小周期为0.5S的周期中断,如果需要更短的中断周期可以使用LPTIM产生中断
我们要用到其RTC就先需要对其初始化: - void Rtc_InitConfig(void)
- {
- stc_rtc_initstruct_t stcRtcInitcfg;
- DDL_ZERO_STRUCT(stcRtcInitcfg);
- Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc, TRUE);//开启RTC外设时钟
- Sysctrl_ClkSourceEnable(SysctrlClkXTL, TRUE);//使能外部低速时钟XTL
-
- stcRtcInitcfg.rtcAmpm = RtcPm;//24小时制
- stcRtcInitcfg.rtcClksrc = RtcClkXtl;//外部时钟XTL
- stcRtcInitcfg.rtcPrdsel.rtcPrdsel = RtcPrds;//定周期中断PRDS模式
- stcRtcInitcfg.rtcPrdsel.rtcPrds = Rtc1Min;//中断时间间隔,1分钟一次
- stcRtcInitcfg.rtcCompen = RtcCompenDisable;
- stcRtcInitcfg.rtcTime.u8Year = 0x23;
- stcRtcInitcfg.rtcTime.u8Month = 0x08;
- stcRtcInitcfg.rtcTime.u8Day = 0x07;
- stcRtcInitcfg.rtcTime.u8DayOfWeek = 0x05;
- stcRtcInitcfg.rtcTime.u8Hour = 0x01;
- stcRtcInitcfg.rtcTime.u8Minute = 0x09;
- stcRtcInitcfg.rtcTime.u8Second = 0x30;
- Rtc_Init(&stcRtcInitcfg);
- Rtc_AlmIeCmd(TRUE);
- EnableNvic(RTC_IRQn, IrqLevel3, TRUE);
- Rtc_Cmd(TRUE);
- delay1ms(10);//保险加个延时
- Sysctrl_SetFunc(SysctrlClkFuncRTCLpmEn, TRUE);//RTC进入低功耗模块
- }
LCD简介
LCD控制器是一款适用于单色无源液晶显示器(LCD)的数字控制器/驱动器,最多具有8 个公用端子(COM)和 48 个区段端子(SEG),用以驱动208 (4x52)或384 (8x48)个LCD图像元素。端子的确切数量取决于数据手册中所述的器件引脚。
我在这里对其手册上的端子进行了整理,形成类似液晶屏的字库,以便于我们对其进行操作
同样,要使用其功能,则必须对其进行初始化
- //LCD段码屏GPIO初始化
- void LCD_GPIOInit(void)
- {
- Gpio_SetAnalogMode(GpioPortA, GpioPin9); //COM0
- Gpio_SetAnalogMode(GpioPortA, GpioPin10); //COM1
- Gpio_SetAnalogMode(GpioPortA, GpioPin11); //COM2
- Gpio_SetAnalogMode(GpioPortA, GpioPin12); //COM3
- Gpio_SetAnalogMode(GpioPortA, GpioPin8); //SEG0
- Gpio_SetAnalogMode(GpioPortC, GpioPin9); //SEG1
- Gpio_SetAnalogMode(GpioPortC, GpioPin8); //SEG2
- Gpio_SetAnalogMode(GpioPortC, GpioPin7); //SEG3
- Gpio_SetAnalogMode(GpioPortC, GpioPin6); //SEG4
- Gpio_SetAnalogMode(GpioPortB, GpioPin15); //SEG5
- Gpio_SetAnalogMode(GpioPortB, GpioPin14); //SEG6
- Gpio_SetAnalogMode(GpioPortB, GpioPin13); //SEG7
- }
- //LCD模块配置初始化
- void Lcd_InitConfig(void)
- {
- // stc_lcd_cfg_t LcdInitStruct;
- stc_lcd_segcom_t LcdSegCom;
- LcdSegCom.u32Seg0_31 = 0xffffff00; ///< 配置LCD_POEN0寄存器 开启SEG0~SEG7
- LcdSegCom.stc_seg32_51_com0_8_t.seg32_51_com0_8 = 0xfe1fffff; ///< 初始化LCD_POEN1寄存器 全部关闭输出端口
- Lcd_SetSegCom(&LcdSegCom); ///< LCD COMSEG端口配置
- M0P_LCD->CR0_f.BSEL = LcdInResLowPower; // 内部电阻分压模式,小功耗模式
- M0P_LCD->CR0_f.DUTY = LcdDuty4; // 1/4duty
- M0P_LCD->CR0_f.BIAS = LcdBias3; // 1/3 BIAS
- M0P_LCD->CR0_f.CPCLK = LcdClk2k; // 电压泵时钟频率选择2kHz
- M0P_LCD->CR0_f.LCDCLK = LcdClk128hz; // LCD扫描频率选择128Hz
- M0P_LCD->CR0_f.CONTRAST = 0x0; // LCD对比度设置最大
-
- M0P_LCD->CR1_f.MODE = LcdMode0; // 选择模式0
- M0P_LCD->CR1_f.CLKSRC = LcdRCL; // LCD时钟选择RCL
- M0P_LCD->CR1_f.BLINKEN = 0; // LCD闪屏配置禁止
- // M0P_LCD->CR1_f.BLINKCNT = 63; //
- M0P_LCD->CR0_f.EN = LcdEnable; // 使能LCD模块
- }
- //实例化配置
- void Lcd_ConfigRead(void)
- {
-
- Sysctrl_ClkSourceEnable(SysctrlClkRCL,TRUE); ///< 使能RCL时钟
- Sysctrl_SetRCLTrim(SysctrlRclFreq32768); ///< 配置内部低速时钟频率为32.768kHz
- Sysctrl_SetPeripheralGate(SysctrlPeripheralLcd,TRUE); ///< 开启LCD时钟
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); ///< 开启GPIO时钟
-
- LCD_GPIOInit();// GPIO配置
- Lcd_InitConfig();// 功能配置
- }
而后,我们利用上图整理出来的字库,书写Display部分函数
- //数字
- uint16_t LCD_Char_Number[10]=
- {//*0* *1* *2* *3* *4*
- 0x0F05, 0x0600, 0x0B06, 0x0F02, 0x0603,
- //*5* *6* *7* *8* *9*
- 0x0D03, 0x0D07, 0x0700, 0x0F07, 0x0F03
- };
- //点
- uint16_t LCD_Char_Point=0x0008;
而有了这些显示函数后,我们对其段码屏的操作就简单了许多,因此,在RTC的时钟处理上如下:
- // RTC时间显示
- void Rtc_Time_Display(void)
- {
- uint8_t Minute=0, Second=0;
- char k[10];
- stc_rtc_time_t stcrtctimeconfig;//这个结构体中的时间为8421BCD码
-
- Rtc_ReadDateTime(&stcrtctimeconfig);
- Minute = (stcrtctimeconfig.u8Minute>>4)*10 + (stcrtctimeconfig.u8Minute&0x0F);//需要转换为十进制数
- Second = (stcrtctimeconfig.u8Second>>4)*10 + (stcrtctimeconfig.u8Second&0x0F);
-
- sprintf(k,"%u",Minute);//将数字转换为字符串
-
- if(Minute<10)
- {
- LCD_ShowChar('0',0);
- LCD_ShowChar(k[0],1);
- }
- else
- {
- LCD_ShowChar(k[0],0);
- LCD_ShowChar(k[1],1);
- }
-
- M0P_LCD->RAM0 |= (uint32_t)((uint32_t)LCD_Char_Point<<16);//将符号":"点亮
-
- sprintf(k,"%u",Second);//将数字转换为字符串
-
- if(Second<10)
- {
- LCD_ShowChar('0',2);
- LCD_ShowChar(k[0],3);
- }
- else
- {
- LCD_ShowChar(k[0],2);
- LCD_ShowChar(k[1],3);
- }
- }
而后,在main函数中调用以及对其进行硬件初始化就可以实现时钟显示了
其中 SYS_ClkConfig:系统时钟配置 APP_System_Init: 系统硬件初始化 main:主函数 - <blockquote><blockquote>void SYS_ClkConfig(void)
最终,我们可以看到如下视频效果(提交B站的时候,其视频标题写错了  )
|
|