江科大10-2DS1302可调时钟-个人优化版

增加内容:增加按下key1后,能够退出TimeSet

修复内容:修改数值到小于0时,程序不能正常判断(我测试时发现,char类型0减一后就是255了,所以源代码判断不生效),将 <0 改为 >99  修复成功

主函数代码如下,模块函数没有做修改

#include <Atmel/REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "Key.h"
#include "Timer0.h"

unsigned char KeyNum, MODE, TimeSetSelect, TimeSetFlashFlag;
unsigned int T0Count;

void TimeShow() // 时间显示
{
    DS1302_ReadTime();                    // 读取时间
    LCD_ShowNum(1, 1, DS1302_Time[0], 2); // 显示年
    LCD_ShowNum(1, 4, DS1302_Time[1], 2); // 显示月
    LCD_ShowNum(1, 7, DS1302_Time[2], 2); // 显示日
    LCD_ShowNum(2, 1, DS1302_Time[3], 2); // 显示时
    LCD_ShowNum(2, 4, DS1302_Time[4], 2); // 显示分
    LCD_ShowNum(2, 7, DS1302_Time[5], 2); // 显示秒
}

void TimeSet() // 设置时间
{
    if (KeyNum == 1) { // 恢复到显示模式
        DS1302_SetTime();
        MODE    = 0;
        T0Count = 0;
        KeyNum  = 0;
    }
    if (KeyNum == 2) {
        TimeSetSelect++;    // 设置选择位+1
        TimeSetSelect %= 6; // 越界清0
    }
    if (KeyNum == 3) {
        DS1302_Time[TimeSetSelect]++;                    // 时间设置位数值加1
        if (DS1302_Time[0] > 99) { DS1302_Time[0] = 0; } // 年越界判断
        if (DS1302_Time[1] > 12) { DS1302_Time[1] = 0; } // 月越界判断
        if (DS1302_Time[1] == 1 || DS1302_Time[1] == 3 || DS1302_Time[1] == 5 || DS1302_Time[1] == 7 ||
            DS1302_Time[1] == 8 || DS1302_Time[1] == 10 || DS1302_Time[1] == 12) // 日越界判断
        {
            if (DS1302_Time[2] > 31) { DS1302_Time[2] = 1; } // 大月
        } else if (DS1302_Time[1] == 4 || DS1302_Time[1] == 6 || DS1302_Time[1] == 9 || DS1302_Time[1] == 11) {
            if (DS1302_Time[2] > 30) { DS1302_Time[2] = 1; } // 小月
        } else if (DS1302_Time[1] == 2) {
            if (DS1302_Time[0] % 4 == 0) {
                if (DS1302_Time[2] > 29) { DS1302_Time[2] = 1; } // 闰年2月
            } else {
                if (DS1302_Time[2] > 28) { DS1302_Time[2] = 1; } // 平年2月
            }
        }
        if (DS1302_Time[3] > 23) { DS1302_Time[3] = 0; } // 时越界判断
        if (DS1302_Time[4] > 59) { DS1302_Time[4] = 0; } // 分越界判断
        if (DS1302_Time[5] > 59) { DS1302_Time[5] = 0; } // 秒越界判断
    }
    if (KeyNum == 4) {                                    // 按键3按下
        DS1302_Time[TimeSetSelect]--;                     // 时间设置位数值减1
        if (DS1302_Time[0] > 99) { DS1302_Time[0] = 99; } // 年越界判断
        if (DS1302_Time[1] < 1) { DS1302_Time[1] = 12; }  // 月越界判断
        if (DS1302_Time[1] == 1 || DS1302_Time[1] == 3 || DS1302_Time[1] == 5 || DS1302_Time[1] == 7 ||
            DS1302_Time[1] == 8 || DS1302_Time[1] == 10 || DS1302_Time[1] == 12) // 日越界判断
        {
            if (DS1302_Time[2] < 1) { DS1302_Time[2] = 31; } // 大月
            if (DS1302_Time[2] > 31) { DS1302_Time[2] = 1; }
        } else if (DS1302_Time[1] == 4 || DS1302_Time[1] == 6 || DS1302_Time[1] == 9 || DS1302_Time[1] == 11) {
            if (DS1302_Time[2] < 1) { DS1302_Time[2] = 30; } // 小月
            if (DS1302_Time[2] > 30) { DS1302_Time[2] = 1; }
        } else if (DS1302_Time[1] == 2) {
            if (DS1302_Time[0] % 4 == 0) {
                if (DS1302_Time[2] < 1) { DS1302_Time[2] = 29; } // 闰年2月
                if (DS1302_Time[2] > 29) { DS1302_Time[2] = 1; }
            } else {
                if (DS1302_Time[2] < 1) { DS1302_Time[2] = 28; } // 平年2月
                if (DS1302_Time[2] > 28) { DS1302_Time[2] = 1; }
            }
        }

        if (DS1302_Time[3] > 99) { DS1302_Time[3] = 23; } // 时越界判断
        if (DS1302_Time[4] > 99) { DS1302_Time[4] = 59; } // 分越界判断
        if (DS1302_Time[5] > 99) { DS1302_Time[5] = 59; } // 秒越界判断
    }
    // 更新显示,根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能
    if (TimeSetSelect == 0 && TimeSetFlashFlag == 1) {
        LCD_ShowString(1, 1, "  ");
    } else {
        LCD_ShowNum(1, 1, DS1302_Time[0], 2);
    }
    if (TimeSetSelect == 1 && TimeSetFlashFlag == 1) {
        LCD_ShowString(1, 4, "  ");
    } else {
        LCD_ShowNum(1, 4, DS1302_Time[1], 2);
    }
    if (TimeSetSelect == 2 && TimeSetFlashFlag == 1) {
        LCD_ShowString(1, 7, "  ");
    } else {
        LCD_ShowNum(1, 7, DS1302_Time[2], 2);
    }
    if (TimeSetSelect == 3 && TimeSetFlashFlag == 1) {
        LCD_ShowString(2, 1, "  ");
    } else {
        LCD_ShowNum(2, 1, DS1302_Time[3], 2);
    }
    if (TimeSetSelect == 4 && TimeSetFlashFlag == 1) {
        LCD_ShowString(2, 4, "  ");
    } else {
        LCD_ShowNum(2, 4, DS1302_Time[4], 2);
    }
    if (TimeSetSelect == 5 && TimeSetFlashFlag == 1) {
        LCD_ShowString(2, 7, "  ");
    } else {
        LCD_ShowNum(2, 7, DS1302_Time[5], 2);
    }
}

void main()
{
    LCD_Init();
    DS1302_Init();
    Timer0_Init();
    LCD_ShowString(1, 1, "  -  -  ");
    LCD_ShowString(2, 1, "  :  :  ");

    DS1302_SetTime(); // 设置时间

    while (1) {
        KeyNum = Key();
        switch (MODE) // 根据不同的功能执行不同的函数
        {
            case 0:
                if (KeyNum == 1) { // 功能切换,因按键检测在主函数中,这个函数放入这里,不会在TimeSet模式下冲突
                    MODE          = 1;
                    TimeSetSelect = 0;
                    KeyNum        = 0;
                }
                TimeShow();
                break;

            case 1:
                TimeSet();
                break;
        }
    }
}

void Timer0_Routine() interrupt 1 // 中断函数
{
    TL0 = 0x18;
    TH0 = 0xFC;
    T0Count++;
    if (T0Count >= 500) { // 每500毫秒进入一次
        T0Count          = 0;
        TimeSetFlashFlag = !TimeSetFlashFlag; // 闪烁标志位取反
    }
}

 

posted @ 2025-08-12 23:26  Acholl  阅读(11)  评论(0)    收藏  举报