在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张蜂鸣器的(选的是容易接受的音调):

回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |
我要赚赏金打赏帖 |
|
|---|---|
| 在FireBeetle2ESP32-C5上实现温湿度检测和显示被打赏¥20元 | |
| 在FireBeetle2ESP32-C5上实现光照强度检测及显示被打赏¥21元 | |
| 以FireBeetle2ESP32-C5实现数据识读播报被打赏¥19元 | |
| 【STM32F103ZET6】14:实测STM32F1的串口输出任务的挂起与恢复功能被打赏¥27元 | |
| Chaos-nano在压力容器监控系统中的项目应用被打赏¥23元 | |
| 基于FireBeetle2ESP32-C5的WS2812B彩色灯带控制被打赏¥21元 | |
| SWM221CBT7显示开发板驱动TFT显示屏被打赏¥19元 | |
| SWM221CBT7显示开发板驱动OLED屏显示被打赏¥19元 | |
| SWM221CBT7显示开发板及其使用被打赏¥20元 | |
| 揭秘Chaos-nano:ArduinoProMini轻量级操作系统开发框架深度解析与实战应用被打赏¥19元 | |
我要赚赏金
