小白跟做江科大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可控时钟

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GDB调试入门笔记

文章目录 What&#xff1f;WhyHow安装GDB安装命令查看是否安装成功调试简单的程序预备一个程序调试 使用breakinfolistnextprintstep一些小技巧在gdb前shell日志功能watch point| catch point 调试core调试一个运行的程序 What&#xff1f; GDB是什么&#xff1f; 全称GNU sym…

lowcode-engine接入编辑器

https://lowcode-engine.cn/site/docs/guide/create/useEditor 方案1 pnpm init pnpm add "alilc/create-elementlatest"pnpm create "alilc/element" editor-project-name选择编辑器 进入执行pnpm install命令安装包 pnpm start报错 pnpm add &qu…

JMeter VS RunnerGo :两大主流性能测试工具对比

说起JMeter&#xff0c;估计很多测试人员都耳熟能详。它小巧、开源&#xff0c;还能支持多种协议的接口和性能测试&#xff0c;所以在测试圈儿里很受欢迎&#xff0c;也是测试人员常用的工具&#xff0c;不少企业也基于JMeter建立起自己的自动化测试能力&#xff0c;提升工作效…

leetcode 经典题目42.接雨水

链接&#xff1a;https://leetcode.cn/problems/trapping-rain-water 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 思路分析 首先&#xff0c;我们需要遍历数组&#xff0c;对于每个元素&am…

链路负载均衡之策略路由

一、策略路由的概念 一般来说&#xff0c;防火墙是根据目的地址查看路由&#xff0c;这种情况下只能根据报文的目的地址为用户提供服务&#xff0c;没办法更加灵活对内网用户进行区分&#xff0c;让不同用户流量走不同的链路转发&#xff0c;如根据源地址、应用协议等区分流量…

3.3改造from框

1.如何解决如何导入组件 2.导入组件如何传值 我们如何区分哪个父组件那个子组件我们如何区分 我们现在只知道我们导入的组件&#xff0c;导入的组件是父组件还是子组件 看一下专业回答 如何进行传值的方式 父组件穿的通过是 v-bind的方式 子组件是通过defineProps接受的方…

如何构建用于物体和标志检测的自定义模型

让我们快速了解一下AWS的机器学习技术栈&#xff0c;它几乎提供了解决我们业务问题所需的所有机器学习方面的支持。 物体检测是什么&#xff1f; 物体检测是从图像或视频帧中检测特定类别实例的任务。我们的目标是在图像/视频帧中找出哪里有什么物体。它是其他依赖物体的任务…

基于单片机的室内空气质量监控系统设计

目 录 摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 方案选择 3 1.2 系统控制原理 4 2系统硬件设计 5 2.1 单片机的选择与设计 5 2.2 温湿度模块设计 6 2.3 甲醛采集模块设计 8 2.4 显示器模块设计 9 2.5 按键模块设计 10 2.6 报警模块设计 11 2.7 加湿及风扇模块设计 1…

【JavaEE】_Spring MVC项目之使用对象传参

目录 1. 使用对象传参 2. 后端参数重命名问题 2.1 关于RequestParam注解 本专栏关于Spring MVC项目的单个及多个参数传参一文中&#xff0c;已经介绍过了对于不同个数的参数传参问题&#xff0c;原文链接如下&#xff1a; 【JavaEE】_Spring MVC 项目单个及多个参数传参-CS…

部署LVS集群之DR模式

直接路由模式----DR模式 理念&#xff1a; 直接路由&#xff08;是lvs的默认模式&#xff09; DR模式和隧道模式唯一的区别&#xff1a;dr模式这四台服务器在同一网段&#xff0c;隧道模式 &#xff1a;这四台服务器不在同一网段 客户端 ------->代理服务器------->真实…

Linux命令之top命令

目录 语法 参数说明&#xff1a; 显示信息 top 命令的一些常用功能和显示信息&#xff1a; 第一行&#xff1a;系统负载信息 第二行&#xff1a;进程信息 进程列表 总体系统信息&#xff1a; 进程信息&#xff1a; 功能和交互操作&#xff1a; Linux top 是一个在 L…

JavaBoy假期如何学习项目?弯道块才是真的快!

至暗时刻 老话说的好&#xff0c;弯道快才是真的快&#xff0c;谁直线不会加油&#xff1f;每到假期都是在座的各位弯道超车的时候。转眼自己已经出来搬了快四年砖头了&#xff0c;偶尔访问下牛客发现行情真是一年不如一年。。。不由得回想起自己春招时候的经历。 回想起2020年…

Spring基础——方法注入(Method Injection)

目录 查找方法注入&#xff08;Lookup Method&#xff09;查找方法注入基于XML的方法注入基于注解的方法注入 Arbitrary Method Replacement&#xff08;任意方法替换&#xff09; 文章所用项目源码参考&#xff1a;java_spring_learn_repo 查找方法注入&#xff08;Lookup Met…

高分辨率全球海洋温度和盐度再分析数据Global Ocean Physics Reanalysis(0.083°),并利用matlab读取绘图

1.引言 在研究全球海平面变化的问题中&#xff0c;卫星测高获得总的海平面变化&#xff0c;而海平面变化包含质量变化和比容变化。因此测高数据和海洋物理分析数据对于海平面研究至关重要。 测高数据下载网址&#xff1a; Global Ocean Gridded L 4 Sea Surface Heights And …

厉害了,有了这款AI智能代码助手,摸鱼新纪元来了!

大家好啊&#xff0c;欢迎来到web测评。本期给大家分享一款AI智能代码助手BaiduComate&#xff0c;让大家上班有更多的时间来摸鱼&#xff0c;俗话说的好&#xff0c;摸鱼一时爽&#xff0c;一直摸一直爽啊哈哈~~ 智能代码助手使用地址 前往BaiduComatehttps://comate.baidu.c…

3d模型怎么镜像?3d模型镜像的步骤---模大狮模型网

在3D建模软件中&#xff0c;对3D模型进行镜像操作通常是指沿着某个轴线(如X、Y、Z轴)进行镜像翻转&#xff0c;使模型在该轴线的一侧产生对称的镜像效果。以下是在常见的3D建模软件中对3D模型进行镜像的一般步骤&#xff1a; 3d模型镜像步骤&#xff1a; 选择模型&#xff1a;…

碳视野|全国首个ESG区域行动方案通过,上海政府推进ESG有八“要”

引领绿色转型&#xff0c;共筑低碳未来&#xff01;AMT企源碳管理团队深入解读碳领域政策、概念及标准&#xff0c;分享实践经验&#xff0c;助力产业绿色发展。我们启动“碳视野、碳课堂、碳实践”三大专栏&#xff0c;紧跟碳行业政策动态&#xff0c;以“科普实践分享”为核心…

小程序管理平台:助力企业数字化转型

微信小程序生态近年来发展迅猛&#xff0c;已成为中国互联网不可忽视的力量。截至2023年6月&#xff0c;微信小程序数量已超过300万&#xff0c;同比增长25%&#xff0c;涵盖了电商、生活服务、教育、金融等众多行业。微信小程序内容生态已经日趋完善&#xff0c;并满足各领域用…

windows中使用nnUNet的nnUNet_convert_decathlon_task提示路径不对

找到问题并且解决解决办法 报错时候的指令 nnUNet_convert_decathlon_task -i D:\桌面\nnUNet\DATASET\nnUNet_raw\nnUNet_raw_data\Task05_Prostate 修改为 nnUNet_convert_decathlon_task -i D:/桌面/nnUNet/DATASET/nnUNet_raw/nnUNet_raw_data/Task05_Prostate 修改点&…

Day37 socket、TCP、UDP

socket类型 流式套接字(SOCK_STREAM) TCP 提供了一个面向连接、可靠的数据传输服务&#xff0c;数据无差错、无重复的发送且按发送顺序接收。内设置流量控制&#xff0c;避免数据流淹没慢的接收方。数据被看作是字节流&#xff0c;无长度限制。 数据报套接字(SOCK_DGRAM) UD…