
在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显示的,我的实际效果并不理想,改在主程序的空闲时更新“时间”显示,似更合理吧。

LCD1602显示RTC,ADC.
ADC:ANI2(P2.2),10位,软件触发;用Applilet产生AD初始代码,小心地选择。
【使用资源】
LCD1602 : P7 , P4.1~3
RTC: INTRTC(中断)
ADC:P2.2 ,INTAD(中断)
【关键程序】
AD中断程序是:
__interrupt void MD_INTAD(void)
{
/* Start user code. Do not edit comment generated here */
gADC_Result = ADCR >> 6;
ADIF = 0;
/* End user code. Do not edit comment generated here */
}
其实不用也罢。
【视频】 RTC和 ADC同时在LCD1602上显示
【看点】调节电位器(P2.2),ADC值变化,LCD的对比度同时变化(对比调节目前暂借用P2.2的电位器)

外部中断的实验
在LCD1602显示RTC,ADC的基础上加个外部中断.
响应按钮中断后,显示日期。在中断期间有蜂鸣器提示音。
【使用资源】
LCD1602 : P7 , P4.1~3
RTC: INTRTC(中断)
ADC:P2.2 ,INTAD(中断)
PCLBUZ0: P141
P5.0, INTP1(中断)
【关键程序】(外部中断程序:日期数据送显示,蜂鸣器的启、停)
#pragma vector = INTP1_vect
__interrupt void MD_INTP1(void)
{
/* Start user code. Do not edit comment generated here */
PCLBUZ0_Start();
/* Read the day value */
lcd_buffer1[7] = (stRTC_Data.Day & 0x0F) + 0x30;
lcd_buffer1[6] = (stRTC_Data.Day >> 4) + 0x30;
/* Read the month value */
lcd_buffer1[4] = (stRTC_Data.Month & 0x0F) + 0x30;
lcd_buffer1[3] = (stRTC_Data.Month >> 4) + 0x30;
/* Read the year value */
lcd_buffer1[1] = (stRTC_Data.Year & 0x0F) + 0x30;
lcd_buffer1[0] = (stRTC_Data.Year >> 4) + 0x30;
lcd_buffer1[2]=lcd_buffer1[5]='-';
ShowString(1, lcd_buffer1);
/* Clear interrupt flag */
PIF1 = 0;
PCLBUZ0_Stop();
/* End user code. Do not edit comment generated here */
}
【视频】
【看点】按下按钮后,上一行显示被替换为日期显示。按钮作为外部中断,在执行这个中断期间,蜂鸣器是响的。时间较短,听到的是简短的“嗒”声。

定时显示温度值的实验 (视频在40楼)
定时器使用了通道0( Channel 0),定时器中断时间设定为 500MS ,在计数结束时产生中断(INTTM00 ) 。
在定时中断程序里取得温度传感器的AD值(右下角显示),并之转换为温度值(右上角显示),再就是转成10进,显示于左上角。
在定时中断执行期间,可听到蜂鸣器的声音“嘀”。
显示的温度跳变比较厉害,因为是原始数据,未加处理。
【使用资源】
LCD1602 : P7 , P4.1~3
RTC: INTRTC(中断)
Timer:channel 0 (500mS中断)
ADC:Temp senser0,INTAD(中断)
PCLBUZ0: P141
仍然是在Applilet里做外设的初始,部分截图(定时器、温度传感器AD):
上面2张是定时器的截图,下面是ADC的:
再来1张蜂鸣器的(选的是容易接受的音调):
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |