效果
部分代码
#include <MSP430.h>
#include "ds1302.h"
#include "LCD.h"
//关掉ccs优化,并且Convert_BCD_To_Dec函数中只能是10.0f才行,不然有bug
void 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