一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3681|回复: 4

求助C编程移直

[复制链接]
发表于 2011-12-17 20:51 | 显示全部楼层 |阅读模式
RX-8025用户资料.rar (1.61 MB, 下载次数: 340)   我用LED四字屏仿制了一个翻页钟,发现用DS1302时钟芯片走时不准,于是在杜洋淘宝店买了一个DYS8100时温模块,
用于替换DS1302。由于本人不懂单片机编程,现请哪位DX帮忙用RX-8025移直一下。用DS12C887也可以。附上翻页钟
程序和DYS8100用户资料。 修正后的1664点阵时钟.rar (158.61 KB, 下载次数: 328)
发表于 2011-12-17 21:34 | 显示全部楼层
粗略看了一下,按照本来的1664程序结构,这个很好移植。
我太懒了,也花不起这个时间,所以说下思路。
main.c 里面是通过调用 DS1302.h 里的函数完成与时间有关的操作的。
其实就只有4个函数:
---------
DS1302_GetTime(SYSTEMTIME *Time);
DS1302_GetTime_ALL(SYSTEMTIME *Time);
void DS1302_SetTime(unsigned char Address, unsigned char Value);
Initial_DS1302(void);
--------
你只需要用DYS8100的这几个同功能的函数把他们代换了,就OK了。

ps. 您给出的1664程序其实也有不合理的地方:里面的1302.h里包含了1302的变量的定义和所有函数的实现。其实这样是不好的。应该把他们分开。
1302.h 包含1302的变量和函数的定义。
1302.c 包含1302的函数的实现,也就是函数体。(1302.c 里写上 #include "1302.h")
然后main.c 里写上 #include "1302.h" 就可以使用(引用)1302.c 里的函数了。
回复

使用道具 举报

 楼主| 发表于 2011-12-17 23:47 | 显示全部楼层
感谢您提供的思路,这个程序是论坛的抄板翻页钟程序。本人水平有限,主要看不懂函数之间的调用关系以及与底层函数之间的关系,
还有函数括号里参数的含义。比如:
DS1302_GetTime(SYSTEMTIME *Time);
这个 SYSTEMTIME *Time
...
DS1302_SetTime(DS1302_MONTH,(CurrentTime.Month));
这个 (DS1302_MONTH,(CurrentTime.Month));
void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 设置时间函数,Value为10 进制.
{
        DS1302_SetProtect(0);
        Write1302(Address, ((Value/10)<<4 | (Value%10)));
}

void DS1302_GetTime(SYSTEMTIME *Time)
{
        unsigned char ReadValue;
        ReadValue = Read1302(DS1302_SECOND);
        Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
       
        if(Time->Second==0)                //当秒为零时才读取 分和小时
        {
                ReadValue = Read1302(DS1302_MINUTE);
                Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
                if(Time->Minute==0)        //当分为0时,才读取小时数据       
                {
                        ReadValue = Read1302(DS1302_HOUR);
                        Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
                }
        }
        if( (Time->Second==0)&(Time->Minute==0)&(Time->Hour==0) )//当秒、分、时都为零时读取DS1302数据 日、月、年、星期
        {
                ReadValue = Read1302(DS1302_DAY);
                Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);       
                ReadValue = Read1302(DS1302_WEEK);
                Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
                ReadValue = Read1302(DS1302_MONTH);
                Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
                ReadValue = Read1302(DS1302_YEAR);
                Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);       
        }
}
请指教。
回复

使用道具 举报

发表于 2011-12-18 00:55 | 显示全部楼层
1 先说Set time
在 DS1302.h 里,DS1302_SetTime()是这样定义的
void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 设置时间函数,Value为10 进制.
---------
这表示DS1302_SetTime()函数要2个参数,第一个是uch类型的地址,第二个是uch类型的数值,就是往前面那个地址写入的数值。

2 DS1302_GetTime(SYSTEMTIME *Time);
这个GetTime()就有点难懂了,他的参数其实是一个指向SYSTEMTIME类型的指针变量。调用的时候需要给这个函数一个指针(地址)作为参数。
给个例子,在main.c里面有这样一句。
DS1302_GetTime(&CurrentTime);
这里就调用了 DS1302.h 里的 DS1302_GetTime() 这个函数。
调用的时候的参数是 &CurrentTime,它就是一个指针,也就是一个地址。通俗的说就是要求GetTime这个函数,把读到的时间值,放到 &CurrentTime 这个地址开始的一片空间里。那这片空间在哪里呢?其实就是 CurrentTime 这个变量所占的空间。
回复

使用道具 举报

发表于 2012-12-10 12:21 | 显示全部楼层
回复 4# chjj0


    一看就知道坛友是位大虾,,能否在您百忙之中,抽点空详细点说明整个移值过程呢,,刚入门51,,许多东西不懂,,望知晓,不甚感激!
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2026-1-13 01:35 , Processed in 0.032983 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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