小白跟做江科大51单片机之DS1302按键可调时钟

news2024/11/25 4:44:01

1.引入上一个程序的代码

2.引入Key和Timer0文件

3.获取按键值

定义全局变量unsigned char keynum

main函数中

keynum=Key();

4.设置第一个按键的两种模式,以此来控制时钟的设定和显示

if(keynum==1)
        {
            if(MODE==0)
            {
                MODE=1;
            }
            else if(MODE==1)
            {
                //待写设定修改后的新日期的代码
                MODE=0;
            }
        }
        switch(MODE)
            {
                case 0:time_show();break;
                case 1:time_set();break;
            }

5.模块化展示时间代码

void time_show()
{
    DS1302_showTime();   
    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);
}

6.模块化更改时间代码

//此函数捕捉按键并暂停,可以修改时间,但不可设定修改后的日期时间
void time_set()
{
    if(keynum == 2)//按键2按下
    {
        timeSet_select++;
        timeSet_select %= 6;//越界清零
    }
    if(keynum == 3)//按键3按下
    {
        DS1302_Time[timeSet_select]++;
        if(DS1302_Time[0]+1>100)
        {
            DS1302_Time[0]=0;
        }
        //月超越界限
        if(DS1302_Time[1]+1>13)
        {
            DS1302_Time[1]=1;
        }
        //日的判断
        if(DS1302_Time[0]%4==0)
        {
            if(DS1302_Time[1]==2)
            {
                if(DS1302_Time[2]+1>30)
                DS1302_Time[2]=1;
            }
        }
        else
        {
            if(DS1302_Time[1]==2)
            {
                if(DS1302_Time[2]+1>29)
                DS1302_Time[2]=1;
            }
            
        }
        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>32)
                DS1302_Time[2]=1;
            }
            if(DS1302_Time[1]==2||DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==11)
            {
                if(DS1302_Time[2]+1>31)
                DS1302_Time[2]=1;
            }
        //小时
        if(DS1302_Time[3]+1>25){DS1302_Time[3]=1;}
        //分钟
        if(DS1302_Time[4]+1>60){DS1302_Time[4]=0;}
        //秒钟
        if(DS1302_Time[5]+1>60){DS1302_Time[5]=0;}
    }
    
    //减减的判断
    if(keynum == 4)
    {
        DS1302_Time[timeSet_select]--;
        if(DS1302_Time[0]-1>100)
        {
            DS1302_Time[0]=99;
        }
        //月超越界限
        if(DS1302_Time[1]-1>12)
        {
            DS1302_Time[1]=12;
        }
        //日的判断
        if(DS1302_Time[0]%4==0)
        {
            if(DS1302_Time[1]==2)
            {
                if(DS1302_Time[2]-1>29)
                DS1302_Time[2]=29;
                if(DS1302_Time[2]+1>30)
                DS1302_Time[2]=1;
            }
        }
        else
        {
            if(DS1302_Time[1]==2)
            {
                if(DS1302_Time[2]-1>28)
                DS1302_Time[2]=28;
                if(DS1302_Time[2]+1>29)
                DS1302_Time[2]=1;
            }
        }
        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>31)
                DS1302_Time[2]=31;
                if(DS1302_Time[2]+1>32)
                DS1302_Time[2]=1;
            }
            if(DS1302_Time[1]==2||DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==11)
            {
                if(DS1302_Time[2]-1>30)
                DS1302_Time[2]=30;
                if(DS1302_Time[2]+1>31)
                DS1302_Time[2]=1;
            }
        
        //小时
        if(DS1302_Time[3]-1>24){DS1302_Time[3]=24;}
        //分钟
        if(DS1302_Time[4]-1>60){DS1302_Time[4]=59;}
        //秒钟
        if(DS1302_Time[5]-1>60){DS1302_Time[5]=59;}
    }
    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);
}

//此时可以更改时间,但是不能设定更改后的时候,以及不能修改时间的时候闪烁
7.最终主函数代码

#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302_con.h"
#include "Delay.h"
#include "Key.h"
#include "Time0.h"

unsigned char keynum,MODE=0,timeSet_select=0,selectflag;

void time_show()
{
    DS1302_showTime();   
    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 time_set()
{
    if(keynum == 2)//按键2按下
    {
        timeSet_select++;
        timeSet_select %= 6;//越界清零
    }
    if(keynum == 3)//按键3按下
    {
        DS1302_Time[timeSet_select]++;
        if(DS1302_Time[0]+1>100)
        {
            DS1302_Time[0]=0;
        }
        //月超越界限
        if(DS1302_Time[1]+1>13)
        {
            DS1302_Time[1]=1;
        }
        //日的判断
        if(DS1302_Time[0]%4==0)
        {
            if(DS1302_Time[1]==2)
            {
                if(DS1302_Time[2]+1>30)
                DS1302_Time[2]=1;
            }
        }
        else
        {
            if(DS1302_Time[1]==2)
            {
                if(DS1302_Time[2]+1>29)
                DS1302_Time[2]=1;
            }
            
        }
        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>32)
                DS1302_Time[2]=1;
            }
            if(DS1302_Time[1]==2||DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==11)
            {
                if(DS1302_Time[2]+1>31)
                DS1302_Time[2]=1;
            }
        //小时
        if(DS1302_Time[3]+1>25){DS1302_Time[3]=1;}
        //分钟
        if(DS1302_Time[4]+1>60){DS1302_Time[4]=0;}
        //秒钟
        if(DS1302_Time[5]+1>60){DS1302_Time[5]=0;}
    }
    
    
    if(keynum == 4)
    {
        DS1302_Time[timeSet_select]--;
        if(DS1302_Time[0]-1>100)
        {
            DS1302_Time[0]=99;
        }
        //月超越界限
        if(DS1302_Time[1]-1>12)
        {
            DS1302_Time[1]=12;
        }
        //日的判断
        if(DS1302_Time[0]%4==0)
        {
            if(DS1302_Time[1]==2)
            {
                if(DS1302_Time[2]-1>29)
                DS1302_Time[2]=29;
                if(DS1302_Time[2]+1>30)
                DS1302_Time[2]=1;
            }
        }
        else
        {
            if(DS1302_Time[1]==2)
            {
                if(DS1302_Time[2]-1>28)
                DS1302_Time[2]=28;
                if(DS1302_Time[2]+1>29)
                DS1302_Time[2]=1;
            }
        }
        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>31)
                DS1302_Time[2]=31;
                if(DS1302_Time[2]+1>32)
                DS1302_Time[2]=1;
            }
            if(DS1302_Time[1]==2||DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==11)
            {
                if(DS1302_Time[2]-1>30)
                DS1302_Time[2]=30;
                if(DS1302_Time[2]+1>31)
                DS1302_Time[2]=1;
            }
        
        //小时
        if(DS1302_Time[3]-1>24){DS1302_Time[3]=24;}
        //分钟
        if(DS1302_Time[4]-1>60){DS1302_Time[4]=59;}
        //秒钟
        if(DS1302_Time[5]-1>60){DS1302_Time[5]=59;}
    }
    
    if(timeSet_select==0 && selectflag==1){LCD_ShowString(1,1,"  ");}
    else {LCD_ShowNum(1,1,DS1302_Time[0],2);}
    
    if(timeSet_select==1 && selectflag==1){LCD_ShowString(1,4,"  ");}
    else {LCD_ShowNum(1,4,DS1302_Time[1],2);}
    
    if(timeSet_select==2 && selectflag==1){LCD_ShowString(1,7,"  ");}
    else {LCD_ShowNum(1,7,DS1302_Time[2],2);}
    
    if(timeSet_select==3 && selectflag==1){LCD_ShowString(2,1,"  ");}
    else {LCD_ShowNum(2,1,DS1302_Time[3],2);}
    
    if(timeSet_select==4 && selectflag==1){LCD_ShowString(2,4,"  ");}
    else {LCD_ShowNum(2,4,DS1302_Time[4],2);}
    
    if(timeSet_select==5 && selectflag==1){LCD_ShowString(2,7,"  ");}
    else {LCD_ShowNum(2,7,DS1302_Time[5],2);}
    
}

void main()
{
    Timer0Init();
    LCD_Init();
    DS1302_Init();
    LCD_ShowString(1,1,"  -  -  ");
    LCD_ShowString(2,1,"  :  :  ");
    DS1302_SetTime();
    
    while(1)
    {
        keynum=Key();
        if(keynum==1)
        {
            if(MODE==0)
            {
                MODE=1;
            }
            else if(MODE==1)
            {
                //设定修改后的新日期
                MODE=0;DS1302_SetTime();
            }
        }
        switch(MODE)
            {
                case 0:time_show();break;
                case 1:time_set();break;
            }
    }
}

void Timer0_Routine() interrupt 1
{
    static unsigned int T0Count;
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    T0Count++;
    if(T0Count>=500)
    {
        T0Count=0;
        selectflag=!selectflag;
    }
}

8.结果展示

DS1302可控时钟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1494495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器视觉相关网站推荐

机器视觉相关网站推荐 - 知乎计算机视觉&#xff08;Computer Vision&#xff09;最近这几年发展迅速&#xff0c;技术论坛和QQ群也如雨后春笋&#xff0c;特别是人脸检测/识别领域。近段时间云从君从研究院那里探得了好几个论坛&#xff0c;收藏了若干网站&#xff0c;记录下&…

numpy——基础知识(创建/类型/形状/运算)(python)

简介 NumPy 是一个 Python 包。它代表 Numeric Python。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric&#xff0c;即 NumPy 的前身&#xff0c;是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray &#xff0c;它拥有一些额外的功能。 2005年&#…

《程序员的职业迷宫:选择你的职业赛道》

程序员如何选择职业赛道&#xff1f; 大家好&#xff0c;我是小明&#xff0c;一名在编程迷宫中探索的程序员。作为这个庞大迷宫的探险者&#xff0c;我深知选择适合自己的职业赛道有多么重要。今天&#xff0c;我将分享一些关于如何选择职业赛道的心得&#xff0c;希望能够帮…

贪心 Leetcode 968 监控二叉树

监控二叉树 Leetcode 968 学习记录自代码随想录 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 要点&#xff1a;1.想到优先覆盖叶子节点&#xff0c…

【Windows 常用工具系列 14 -- windows 网络驱动映射】

文章目录 windows 网络驱动映射 windows 网络驱动映射 映射网络驱动器的意思是将局域网中的某个目录映射成本地驱动器号。 在windows上将服务器目录映射到本地盘&#xff1a; 进入到服务器执行下面命令既可以看到对应的 IP地址&#xff1a; 将对应的IP地址填入上图中。 映…

【three.js】22. Imported Models导入模型

22. Imported Models导入模型 介绍 Three.js 可以让你创建很多原始几何体&#xff0c;但是当涉及到更复杂的形状时&#xff0c;我们最好使用专用的 3D 软件建模。 在本课中&#xff0c;我们将使用已经制作好的模型&#xff0c;但我们将在以后的课程中学习如何完全在 3D 软件中…

人人都写过的6个bug

大家好&#xff0c;我是知微。 程序员写bug几乎是家常便饭&#xff0c;也是我们每个人成长过程中难以避免的一部分。 为了缓解这份“尴尬”&#xff0c;今天想和大家分享一些曾经都会遇到过的bug&#xff0c;让我们一起来看看这些“经典之作”。 1、数组越界 #include <…

如何给Vue项目配置好一个nginx.conf文件?

如何给Vue项目配置好一个nginx.conf文件&#xff1f; 一般前端项目中&#xff0c;会有一个docker/nginx/nginx.conf文件&#xff0c;用于配置DockerFile配置等。 那么&#xff0c;如何给项目写好一个nginx.conf文件&#xff0c;以DockerFile为例&#xff1a; # 使用 Node.js …

SpringBoot+Mybatis-plus+shardingsphere实现分库分表

SpringBootMybatis-plusshardingsphere实现分库分表 文章目录 SpringBootMybatis-plusshardingsphere实现分库分表介绍引入依赖yaml配置DDL准备数据库ds0数据库ds1 entitycotrollerserviceMapper启动类测试添加修改查询删除 总结 介绍 实现亿级数据量分库分表的项目是一个挑战…

第三百八十五回

文章目录 1.概念介绍2.使用方法3.示例代码 我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口&#xff0c;只不过窗口的内容…

Windows10 安装Neo4j流程

1、下载并安装ava运行环境 官网链接&#xff08;需要注册Oracle账号&#xff09;&#xff1a;https://www.oracle.com/java/technologies/downloads/ 根据自己Neo4j版本确认需要的JDK版本 百度网盘链接&#xff1a; 链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/…

Unity 整体界面淡入淡出效果

在Unity中&#xff0c;如果我们要实现控制多个组件同时淡出&#xff0c;同时淡入的效果&#xff0c;可以使用DOTween插件实现。 如图&#xff0c;一个页面中带有背景&#xff0c;一张图片&#xff0c;一个文本&#xff0c;一个滑动条。 要实现以上界面的整体淡入淡出&#xff…

企业内部培训考试系统在线考试都用到了哪些防作弊技术?

企业内部培训考试系统在线考试功能采用了多种技术手段来防止作弊行为&#xff0c;确保考试的公平性和有效性&#xff0c;具体如下&#xff1a; 1. 人脸识别验证&#xff1a;在考试开始前&#xff0c;考生需要进行人脸识别核验。系统会根据考生的姓名和身份证号实时采集人脸与公…

Python 弱引用全解析:深入探讨对象引用机制!

目录 前言 弱引用的概述 弱引用的原理 使用 WeakRef 类创建弱引用 使用 WeakValueDictionary 类创建弱引用字典 实际应用场景 1. 解决循环引用问题 2. 对象缓存 总结 前言 在Python编程中&#xff0c;弱引用&#xff08;Weak Reference&#xff09;是一种特殊的引用方式…

Android开发技巧,最详细的解释小白也能听懂

今天&#xff0c;跟大家聊聊&#xff0c;Framework开发的那些事。 系统应用开发&#xff0c;现在来说&#xff0c;已经开始脱离系统&#xff0c;单独拿出来开发&#xff0c;系统定制接口&#xff0c;已提供给应用调用&#xff0c;用来增强功能。 原生的桌面&#xff0c;拨号&…

【Java面试/24春招】技术面试题的准备

Spring MVC的原理 Mybatis的多级缓存机制 线程池的大小和工作原理 上述问题&#xff0c;我们称为静态的问题&#xff0c;具有标准的答案&#xff0c;而且这个答案不会变化&#xff01; 如果没有Spring&#xff0c;会怎么样&#xff1f;IOC这个思想是解决什么问题&#xff1f…

2024年腾讯云发红包了,可用于抵扣订单金额,你们领了吗?

在2024年腾讯云新春采购节优惠活动上&#xff0c;可以领取新年惊喜红包&#xff0c;打开活动链接 https://curl.qcloud.com/oRMoSucP 会自动弹出红包领取窗口&#xff0c;如下图&#xff1a; 腾讯云2024新春采购节红包领取 如上图所示&#xff0c;点击“领”红包&#xff0c;每…

Android学习笔记在互联网上火了,Android资深架构师分享学习经验及总结

本篇将由 环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来 等七个方面&#xff0c;对当前的 React Native 和 Flutter 进行全面的分析对比&#xff0c;希望能给你更有价值的参考。 前言 移动端跨平台在经历数年沉浮之后&#xff0c;如今还能在舞台聚光…

Android开发真等于废人,历经30天

前言 回顾一下自己这段时间的经历&#xff0c;三月份的时候&#xff0c;疫情原因公司通知了裁员&#xff0c;我匆匆忙忙地出去面了几家&#xff0c;但最终都没有拿到offer&#xff0c;我感觉今年的寒冬有点冷。到五月份&#xff0c;公司开始第二波裁员&#xff0c;我决定主动拿…

【《高性能 MySQL》摘录】第 9 章 操作系统和硬件优化

文章目录 9.1 什么限制了MySQL的性能9.2 如何为 MySQL 选择 CPU9.2.1 哪个更好&#xff1a;更快的 CPU 还是更多的 CPU9.2.2 CPU架构9.2.3 扩展到多个CPU和核心 9.3 平衡内存和磁盘资源9.3.1 随机 I/O 和顺序 I/O9.3.2 缓存&#xff0c;读和写9.3.3 工作集是什么9.3.4 找到有效…