效果
部分代码
#include <MSP430.h>
#include "ds1302.h"
#include "LCD.h"//关掉ccs优化,并且Convert_BCD_To_Dec函数中只能是10.0f才行,不然有bugvoid main(void)
{char cnt = 0;char disp[16];WDTCTL = WDTPW + WDTHOLD; /* 关闭看门狗 */P1DIR = 0xFF; /* 设置方向 */P1SEL = 0; /* 设置为普通I/O 口 */P2DIR = 0xFF; /* 设置方向 */P2SEL = 0; /* 设置为普通I/O 口 */P3DIR = 0xFF; /* 设置方向 */P3SEL = 0; /* 设置为普通I/O 口 */P1OUT = 0x00;P2OUT = 0x00;P3OUT = 0x00;delay_ms(200);LCD_init();TimeData[0] = 59; //秒TimeData[1] = 58; //分TimeData[2] = 58; //时TimeData[3] = 23; //日TimeData[4] = 6; //月TimeData[6] = 25; //年TimeData[5] = 1; //星期Init_DS1302();Set_DS1302_Time(DS1302_W_ADDR); /* 先写入时钟日历寄存器起始地址再设置时钟日历初值 */while (1){Read_DS1302_Time( DS1302_R_ADDR); /* 先写入时钟日历寄存器起始地址再读出时钟日历写入到TimeData数组中 */cnt = 0;disp[cnt++] = '2';disp[cnt++] = '0';disp[cnt++] = TimeData[6] / 10 + '0';disp[cnt++] = TimeData[6] % 10 + '0';disp[cnt++] = '-';disp[cnt++] = TimeData[4] / 10 + '0';disp[cnt++] = TimeData[4] % 10 + '0';disp[cnt++] = '-';disp[cnt++] = TimeData[3] / 10 + '0';disp[cnt++] = TimeData[3] % 10 + '0';disp[cnt++] = 0;LCD_dsp_string(0, 1, disp);cnt = 0;disp[cnt++] = TimeData[2] / 10 + '0';disp[cnt++] = TimeData[2] % 10 + '0';disp[cnt++] = ':';disp[cnt++] = TimeData[1] / 10 + '0';disp[cnt++] = TimeData[1] % 10 + '0';disp[cnt++] = ':';disp[cnt++] = TimeData[0] / 10 + '0';disp[cnt++] = TimeData[0] % 10 + '0';disp[cnt++] = 0;LCD_dsp_string(0, 2, disp);TimeData[5]=getWeekdayByYearday(2000+TimeData[6],TimeData[4],TimeData[3]);switch (TimeData[5]){case 1:LCD_dsp_string(12, 2, "MON");break;case 2:LCD_dsp_string(12, 2, "TUE");break;case 3:LCD_dsp_string(12, 2, "WED");break;case 4:LCD_dsp_string(12, 2, "THU");break;case 5:LCD_dsp_string(12, 2, "FRI");break;case 6:LCD_dsp_string(12, 2, "SAT");break;case 7:LCD_dsp_string(12, 2, "SUN");break;}delay_ms(500);}
}
代码解释
代码功能讲解
主要模块和功能
-
头文件包含:
- 包含了MSP430微控制器、DS1302时钟模块和LCD显示屏的相关定义和函数声明。
-
初始化:
- 关闭看门狗定时器,防止系统复位。
- 设置P1、P2、P3端口的方向为输出,并将其设置为普通I/O口。
- 初始化LCD显示屏。
-
时间设置:
- 初始化
TimeData
数组,设置秒、分、时、日、月、年和星期的初始值。 - 初始化DS1302时钟模块,并将初始时间写入时钟模块。
- 初始化
-
主循环:
- 读取DS1302时钟模块中的当前时间,并更新
TimeData
数组。 - 将时间数据转换为字符串格式,并在LCD显示屏上显示日期和时间。
- 根据日期计算星期,并在LCD显示屏上显示相应的星期。
- 读取DS1302时钟模块中的当前时间,并更新
-
延时:
- 在循环的每次迭代中,增加一个500毫秒的延时,以确保显示内容稳定更新。
核心功能细节
-
时钟设置与读取:
- 初始化时钟模块,并设置初始时间。
- 从时钟模块读取当前时间并更新显示。
-
显示功能:
- 将时间数据转换为字符串,并分行显示日期和时间。
- 根据日期计算并显示当前星期。
-
延时控制:
- 在每次更新显示内容后,增加延时以防止频繁刷新导致显示不稳定。
注意事项
- 关闭CCS优化是为了防止在
Convert_BCD_To_Dec
函数中出现bug。 - 代码初始化了端口方向和输出状态,以确保正确控制外部设备。
通过这些步骤,该程序实现了从DS1302读取时间并在LCD显示屏上实时显示当前日期和时间的功能。
全部代码
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2