本帖最后由 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站的时候,其视频标题写错了 )
|
此文章已获得独家原创/原创奖标签,著作权归21ic所有,未经允许禁止转载。
|