
cpp展开代码#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);
    }
}
头文件包含:
初始化:
关闭看门狗定时器,防止系统复位。
设置P1、P2、P3端口的方向为输出,并将其设置为普通I/O口。
初始化LCD显示屏。
时间设置:
初始化TimeData数组,设置秒、分、时、日、月、年和星期的初始值。
初始化DS1302时钟模块,并将初始时间写入时钟模块。
主循环:
读取DS1302时钟模块中的当前时间,并更新TimeData数组。
将时间数据转换为字符串格式,并在LCD显示屏上显示日期和时间。
根据日期计算星期,并在LCD显示屏上显示相应的星期。
延时:
时钟设置与读取:
初始化时钟模块,并设置初始时间。
从时钟模块读取当前时间并更新显示。
显示功能:
将时间数据转换为字符串,并分行显示日期和时间。
根据日期计算并显示当前星期。
延时控制:
关闭CCS优化是为了防止在Convert_BCD_To_Dec函数中出现bug。
代码初始化了端口方向和输出状态,以确保正确控制外部设备。
通过这些步骤,该程序实现了从DS1302读取时间并在LCD显示屏上实时显示当前日期和时间的功能。
cpp展开代码https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!