在LCD1602 终于成功驱动后,继续——显示RTC
RTC的主要源码严重地参照例程中的RTC部分,对着源码操作Applilet产生相近的初始代码,有少部分代码有区别,估计是不同版本的缘故。对于主程序及中断程序里的代码,尽量消化了采用。
看着例程中的一些代码,也是一个不错的学习过程。比如中断程序里的对时间显示的处理,比较简洁,很值得学习。
用Applilet产生INT是首次,产生初始及相应入口代码。目前只是学习模仿阶段。(与中断相关的文件名带有int,int_user)
部分代码:
=========================
/*
**-----------------------------------------------------------------------------
**
** Abstract:
** This function is INTRTC interrupt service routine.
**
** Parameters:
** None
**
** Returns:
** None
**
**-----------------------------------------------------------------------------
*/
#pragma vector = INTRTC_vect
__interrupt void MD_INTRTC(void)
{
RTC_ConstPeriodInterruptCallback();
}
/*
**-----------------------------------------------------------------------------
**
** Abstract:
** This function is real-time clock constant-period interrupt service handler.
**
** Parameters:
** None
**
** Returns:
** None
**
**-----------------------------------------------------------------------------
*/
void RTC_ConstPeriodInterruptCallback(void)
{
/* Start user code. Do not edit comment generated here */
/* Read the RTC data */
// R_RTC_Get_CounterValue(&stRTC_Data); // 换个说法
RTC_CounterGet(&stRTC_Data);
/* Read the seconds value */
lcd_buffer[7] = (stRTC_Data.Sec & 0x0F) + 0x30;
lcd_buffer[6] = (stRTC_Data.Sec >> 4) + 0x30;
/* Read the minutes value */
lcd_buffer[4] = (stRTC_Data.Min & 0x0F) + 0x30;
lcd_buffer[3] = (stRTC_Data.Min >> 4) + 0x30;
/* Read the hours value */
lcd_buffer[1] = (stRTC_Data.Hour & 0x0F) + 0x30;
lcd_buffer[0] = (stRTC_Data.Hour >> 4) + 0x30;
/* Display the time on the debug LCD */
// DisplayString(LCD_LINE2, lcd_buffer);
// ShowString(1, lcd_buffer);
/* End user code. Do not edit comment generated here */
}
/* Start user code for adding. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
=========================
(上段要点:读取RTC,并将各位拼成ASCII后送到显示缓冲器,在LCD第2行显示“时间”)
在原来的例程里,是在中断程序里做LCD显示的,我的实际效果并不理想,改在主程序的空闲时更新“时间”显示,似更合理吧。