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

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.mzph.cn/news/723631.shtml

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

相关文章

c++ primer学习笔记(二)

目录 第三章 一、命名空间的using声明 二、标准库的string类型 1、string对象的定义和初始化 2、string对象的读写 3、string对象的操作 4、string对象中字符的处理 三、标准库的vector类型 1、vector对象的定义和初始化 2、vector对象的操作 四、迭代器简介 1、简…

前端复选框问题-节点赋值未选中最后显示时确变成选中状态?

问题&#xff1a; 前两天一同事请教我&#xff1a;前端复选框问题-节点赋值未选中最后显示时确变成选中状态&#xff1f; 还有就是明明传过为的是false&#xff0c;在控制台上打印确变成选中状态&#xff0c;如下图&#xff1a; 以下是前端vue代码&#xff1a; <Scroll h…

CentoS迁移好帮手——银河麒麟服务器迁移运维管理平台最新介绍

•银河麒麟服务器迁移运维管理平台&#xff0c;面向大规模、集群式的服务器主机管理场景&#xff1b; •跨多种环境、高可用与分布式部署、配置管理、漏洞修复、服务包升级、CentoS迁移等多种核心运维场景解决方案&#xff1b; •CPU架构同源支持&#xff0c;兼容Intel、 海光…

Linux下下载安装JDK配置Java环境变量

Linux下下载安装JDK配置Java环境变量 1. 下载JDK 下载链接&#xff1a;(https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) 2. 上传至服务器并解压 可通过shell工具进行上传&#xff0c;我这里是上传安装在/opt目录 解压jdk-17.0.10_linux-x64_b…

C++之关联式容器set和map的使用

目录 1、set的使用​编辑 1、初始化 2、遍历 3、查找​编辑 4、插入​编辑 5、不支持修改与下标 2、map的使用 1、初始化​编辑 2、遍历 3、map的下标(重点) #include <iostream> #include <vector> #include <set> #include <map> #include…

软件开发项目管理中各角色职责介绍

项目经理&#xff1a;项目经理在项目全生命周期中扮演着核心统筹与协调者的角色&#xff0c;负责从项目的启动、规划、执行、监控直至收尾的全过程管理。具体职责包括但不限于以下几点&#xff1a; 制定项目计划&#xff1a;依据项目业务主客户需求&#xff0c;明确项目范围、时…

MySQL学习Day26——事务基础知识

一、数据库事务概述: 事务是数据库区别于文件系统的重要特性之一,事务会让数据始终保持一致性,能通过事务机制恢复到某个时间点,可以保证提交到数据库的修改不会因为系统崩溃而丢失 1.查看引擎支持事务的情况:只有InnoDB存储引擎支持事务 SHOW ENGINES; 2.基本概念: 事…

2023预测误差位平面冗余-RDHEI Based on Bit-Plane

RRBE 本文仅供学习&#xff0c;切勿转载和搬运&#xff0c;如有侵权&#xff0c;联系立删~ 一、背景知识 The Gradient-Adjusted Predictor&#xff08;GAP&#xff0c;梯度调整预测器&#xff09; 根据被预测像素周围的七个像素进行预测 具体流程可参考文献X. Wu and N. M…

selenium4的相对定位

selenium4相对定位 Selenium 4新增了相对定位器&#xff0c;能帮助用户查找元素附近的其他元素。可用的相对定位器有above、below、toLeftOf、toRightOf、near。在Selenium 4中&#xff0c;find_element方法能够接受一个新方法withTagName&#xff0c;它将返回一个RelativeLoca…

项目管理必备的五张图表,助力你高效掌控全局

在项目管理中&#xff0c;图表作为一种直观的工具&#xff0c;帮助项目经理更有效的规划、监控和控制项目的各个方面&#xff0c;以下是项目经理常用的几张图表&#xff0c;它们在项目管理中发挥着至关重要的作用。 1、甘特图 甘特图&#xff08;Gantt Chart&#xff09;是最…

C语言——oj刷题——猜数字游戏

当用C语言来实现猜数字游戏时&#xff0c;我们可以设计一个简单的游戏规则&#xff1a;计算机随机生成一个1到100之间的整数&#xff0c;玩家需要通过猜测来猜出这个数字。游戏会根据玩家猜测的数字与目标数字的大小关系给出提示&#xff0c;直到玩家猜中为止。 下面是一个用C…

类体相关知识

定义 类声明之后的一对大括号“{”&#xff0c;“}” 以及它们之间 的内容称作 &#xff0c;大括号之间的内容称作类体的内容。 组成部分 变量的声明&#xff1a;用来刻画属性 。 方法的定义&#xff1a;用来刻画行为功能

2023年12月CCF-GESP编程能力等级认证Python编程七级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(每题 2 分,共 30 分) 第1题 假设变量 x 为 float 类型,如果下面代码输入为 100,输出最接近( )。 A.0 B.-5 C.-8 D.8 答案:B 第2题 对于下面动态规划方法实现的函数,以下选项中…

python 远程代码第一次推送

conda windows 环境 conda 安装后 配置环境变量 运行 conda init; conda active base 创建虚拟环境 conda create -n my_venv python3.9.5 虚拟环境应用 file-->New project --> Existing interpreter ... -->Virtualenv environment-->interpreter ...--&g…

VR科学知识互动展示介绍|游戏体验馆加盟|VR展示厅

VR科学知识互动展示是一种利用虚拟现实技术来呈现科学知识并与观众进行互动的展示方式。通过VR设备&#xff0c;参观者可以沉浸在各种科学主题的虚拟环境中&#xff0c;以全新的视角和体验来探索科学领域的知识。 这样的展示通常结合了视觉、听觉和触觉等感官体验&#xff0c;使…

springboot-异步、定时、邮件任务

一、异步任务 1、创建项目 2、创建一个service包 3、创建一个类AsyncService 异步处理还是非常常用的&#xff0c;比如我们在网站上发送邮件&#xff0c;后台会去发送邮件&#xff0c;此时前台会造成响应不动&#xff0c;直到邮件发送完毕&#xff0c;响应才会成功&#xff…

1.2_1 分层结构、协议、接口和服务

1.2_1 分层结构、协议、接口和服务 &#xff08;一&#xff09;为什么要分层&#xff1f; 主机A如果想要向主机B发送文件&#xff0c;则一定要经过中间的一些介质、链路。 发送文件前要完成的工作&#xff1a; 1.发起通信的计算机必须将数据通信的通路进行激活。 所谓的激活&a…

多线程系列(十五) -常用并发工具类详解

一、摘要 在前几篇文章中&#xff0c;我们讲到了线程、线程池、BlockingQueue 等核心组件&#xff0c;其实 JDK 给开发者还提供了比synchronized更加高级的线程同步组件&#xff0c;比如 CountDownLatch、CyclicBarrier、Semaphore、Exchanger 等并发工具类。 下面我们一起来…

MongoDB聚合运算符:$dateFromString

文章目录 语法使用使用例子对规则进行说明格式指示符 举例日期转换错误处理onError空值的粗粒 onNull $dateFromString聚合运算符将日期时间字符串转换为日期对象。 语法 { $dateFromString: {dateString: <dateStringExpression>,format: <formatStringExpression&g…

Java的三大核心特性解释以及对应的代码示例

文章目录 Java的三大核心特性是&#xff1a;封装、继承和多态 Java的三大核心特性是&#xff1a;封装、继承和多态 封装&#xff08;Encapsulation&#xff09;&#xff1a;封装是指将对象的状态信息隐藏在对象内部&#xff0c;不允许外部程序直接访问对象内部信息&#xff0c;…