[方案相关]【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站的时候,其视频标题写错了


---------------------
作者:hulai123456
链接:https://bbs.21ic.com/icview-3324428-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值