MCXN947配有RTC计算器,将它与LCD显示屏配合可方便地实现电子时钟功能。
在配置LCD显示屏之前,RTC程序所实现的功能是设置系统时间,如何开始计时,当得到预置的闹钟时间时停止计时,在打开串口的情况下,其运行结构如图1所示。
图1 测试效果
在为LCD屏配置数据显示函数后,即可完成时钟显示的需要,该数据显示函数是:
void LCD_ShowNum(uint16_t x,uint16_t y,uint16_t num,uint8_t len,uint16_t color)
{
uint8_t t,temp;
uint8_t show=0;
for(t=0;t<len;t++)
{
temp=(num/mypow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
LCD_ShowChar(x+8*t,y,' ',0,color);
continue;
}
else
show=1;
}
LCD_ShowChar(x+8*t,y,temp+48,0,color);
}
}
实现电子时钟计时效果的主程序是:
int main(void)
{
irtc_config_t irtcConfig;
gpio_pin_config_t led_config = {
kGPIO_DigitalOutput,
0,
};
#if APP_IRTC_IS_SLAVE
irtc_datetime_t alarmDatetime, datetimeGet;
#else
irtc_datetime_t datetime, alarmDatetime, datetimeGet;
datetime.year = 2024;
datetime.month = 12;
datetime.day = 15;
datetime.weekDay = 7;
datetime.hour = 18;
datetime.minute = 55;
datetime.second = 30;
#endif
CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1u);
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
CLOCK_EnableClock(kCLOCK_Gpio0);
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
GPIO_PinInit(GPIO0, 25U, &led_config);
GPIO_PinInit(GPIO0, 26U, &led_config);
GPIO_PinInit(GPIO0, 24U, &led_config);
GPIO_PinInit(GPIO0, 27U, &led_config);
GPIO_PinInit(GPIO0, 10U, &led_config);
GPIO_PinInit(GPIO0, 28U, &led_config);
Lcd_Init();
LCD_Clear(RED);
LCD_ShowString(20,10,"MCXN947 CLOCK",YELLOW);
LCD_ShowString(20,40," : :",YELLOW);
CLOCK_SetupClk16KClocking(kCLOCK_Clk16KToVbat | kCLOCK_Clk16KToMain);
IRTC_GetDefaultConfig(&irtcConfig);
if (IRTC_Init(RTC, &irtcConfig) == kStatus_Fail)
{
return 1;
}
#if !defined(FSL_FEATURE_RTC_HAS_NO_GP_DATA_REG) || (!FSL_FEATURE_RTC_HAS_NO_GP_DATA_REG)
IRTC_Enable32kClkDuringRegisterWrite(RTC, true);
#endif
#if !defined(FSL_FEATURE_RTC_HAS_NO_TAMPER_FEATURE) || (!FSL_FEATURE_RTC_HAS_NO_TAMPER_FEATURE)
IRTC_ClearTamperStatusFlag(RTC);
#endif
#if !APP_IRTC_IS_SLAVE
IRTC_SetDatetime(RTC, &datetime);
#endif
IRTC_GetDatetime(RTC, &datetimeGet);
LCD_ShowNum(20,40,datetimeGet.hour,2,YELLOW);
LCD_ShowNum(44,40,datetimeGet.minute,2,YELLOW);
LCD_ShowNum(68,40,datetimeGet.second,2,YELLOW);
while (1)
{
IRTC_GetDatetime(RTC, &datetimeGet);
LCD_ShowNum(20,40,datetimeGet.hour,2,YELLOW);
LCD_ShowNum(44,40,datetimeGet.minute,2,YELLOW);
LCD_ShowNum(68,40,datetimeGet.second,2,YELLOW);
}
}
经程序的编译与下载,其显示效果如图2显示,这样就实现了电子时钟的计时功能。
图2 显示效果
|