迪文科技论坛

 找回密码
 立即注册
搜索
查看: 69|回复: 1

【分享】DS1302实时时钟

[复制链接]

3

主题

1

回帖

34

积分

新手上路

Rank: 1

积分
34
发表于 2024-12-26 11:28:12 | 显示全部楼层 |阅读模式
直接上代码:
main.c代码:

#include "sys.h"
#include "ds1302.h"
#include <stdio.h>

#define START_WIN_NUM_VP        0x2000 //这个地址是一个文本显示控件   
#define DATE_WIN_YEAR_VP        0x3000  // 年   
#define DATE_WIN_MONTH_VP        0x3010 //
#define DATE_WIN_DAY_VP            0x3020 //
#define DATE_WIN_HOUR_VP        0x3030 //
#define DATE_WIN_MIN_VP            0x3040 //
#define DATE_WIN_SEC_VP            0x3050//
#define DATE_WIN_WEEK_VP        0x3060 //

u8 date_buff[40];
u8 lenrq;
u16 btn_val;
u16 valrq;

u8 int_to_bcd(u8 val)
{
    return (((val/10)<<4)+(val%10));
}

void main(void)
{   
    sys_init();
    ds1302_init();

    while(1)
    {   
           
            ds1302_read_date();
            lenrq = sprintf(date_buff,"20%02x/%02x/%02x %02x:%02x:%02x week:%x",
                            (u16)cur_date.year,(u16)cur_date.month,(u16)cur_date.day,
                            (u16)cur_date.hour,(u16)cur_date.min,(u16)cur_date.sec,
                            (u16)cur_date.week
                        );
            date_buff[lenrq+1] = 0;
            sys_write_vp(START_WIN_NUM_VP,date_buff,lenrq/2+2);
        
   
            sys_read_vp(0x1000,(u8*)&btn_val,1);
            if(btn_val==1)
            {
        
                sys_read_vp(DATE_WIN_YEAR_VP,(u8*)&valrq,1);  
                cur_date.year = int_to_bcd(valrq);
               
                sys_read_vp(DATE_WIN_MONTH_VP,(u8*)&valrq,1);  
                cur_date.month = int_to_bcd(valrq);
               
                sys_read_vp(DATE_WIN_DAY_VP,(u8*)&valrq,1);  
                cur_date.day = int_to_bcd(valrq);
               
                sys_read_vp(DATE_WIN_HOUR_VP,(u8*)&valrq,1);  
                cur_date.hour = int_to_bcd(valrq);
               
                sys_read_vp(DATE_WIN_MIN_VP,(u8*)&valrq,1);  
                cur_date.min = int_to_bcd(valrq);
               
                sys_read_vp(DATE_WIN_SEC_VP,(u8*)&valrq,1);  
                cur_date.sec = int_to_bcd(valrq);
               
                sys_read_vp(DATE_WIN_WEEK_VP,(u8*)&valrq,1);  
                cur_date.week = int_to_bcd(valrq);
               
                ds1302_init_date();
               
                btn_val = 0;
                sys_write_vp(0x1000,(u8*)&btn_val,1);
            }
    }
}
main------------------------------------------------------------------------------------------------

头文件(ds1302.h):
----------------------------------------------------------------------------------------------------

#ifndef __DS1302_H__
#define __DS1302_H__
#include "sys.h"

sbit DS1302_CLK = P3^1;
sbit DS1302_DAT = P3^2;
sbit DS1302_RST = P3^3;

#define DS1302_DAT_IN()        P3MDOUT&=0xFB
#define DS1302_DAT_OUT()    P3MDOUT|=0x04


#define DS1302_SEC_ADDR                0x80
#define DS1302_MIN_ADDR                0x82
#define DS1302_HOUR_ADDR            0x84
#define DS1302_DAY_ADDR                0x86
#define DS1302_MONTH_ADDR            0x88
#define DS1302_WEEK_ADDR            0x8a
#define DS1302_YEAR_ADDR            0x8c
#define DS1302_CTRL_ADDR            0x8e

typedef struct{
    u8 sec;
    u8 min;
    u8 hour;
    u8 day;
    u8 month;
    u8 week;
    u8 year;
}DATE;

extern DATE cur_date;


void ds1302_init(void);
void ds1302_write_reg(u8 addr,u8 dat);
u8 ds1302_read_reg(u8 addr);
void ds1302_init_date(void);
void ds1302_read_date(void);

#endif


---------------------------------------------------------------------------------------------------------------------------
UI设计:

我这使用两个滑动手势调节:

还有两个数据窗口指示:



一个按键返回:

一个取消按键使用基础按键:



回复

使用道具 举报

0

主题

2

回帖

83

积分

注册会员

Rank: 2

积分
83
发表于 4 天前 | 显示全部楼层
博主能给源码吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-3-31 15:39 , Processed in 0.067909 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表