打印

这个问题,我想了一个春节(是我没表达清楚?)

[复制链接]
楼主: yuntian
手机看帖
扫描二维码
随时随地手机跟帖
21
wangkj| | 2008-2-18 14:41 | 只看该作者 回帖奖励 |倒序浏览

简单问题复杂化了

仅仅计算过去1800s就够了,什么年之类的就不用计算了。除非关机,系统停机,才需要。

使用特权

评论回复
22
mikesullen| | 2008-2-19 00:44 | 只看该作者

5楼的应该是最合理

或者楼主还没表达清楚,否则真的是个很小儿科的问题。。。

使用特权

评论回复
23
forthlab| | 2008-2-19 09:25 | 只看该作者

关键点:CPU是否会除非关机或系统停机

就是21楼说的,如果有关机,系统停机,那么只能用时钟芯片内的年月日分秒来计算时间差.如果CPU不会停机,那么有简单的办法为何不用?

使用特权

评论回复
24
yuntian|  楼主 | 2008-2-19 10:08 | 只看该作者

to:forthlab兄

系统只有ID卡插入时才有电,系统本身不带电源的.

使用特权

评论回复
25
xxqarm| | 2008-2-19 10:11 | 只看该作者

建议再看看5楼的内容N次

使用特权

评论回复
26
xxqarm| | 2008-2-19 10:18 | 只看该作者

sorry,没注意第二页的条件.

使用特权

评论回复
27
xxqarm| | 2008-2-19 10:40 | 只看该作者

....

可否参考unix,有个基准时间点,比如08年1月1日零时开始,每次插卡都计算卡上的时间比这个时间延后了多少分钟,这样每次插卡只要相减限可.

使用特权

评论回复
28
alphal| | 2008-2-19 11:56 | 只看该作者

弱弱的问一句。。。

楼主说他的蛋片**用的只剩那么点rom空间了,现在对剩下的那么丁点也不放过,据说rom不能用完的吧,好像还说最好不要超过容量的2/3,否则会乱跑,不知道楼主的机子有没有这毛病?

使用特权

评论回复
29
yuntian|  楼主 | 2008-2-19 12:37 | 只看该作者

TO:alphal

目前还没有发现过这种毛病,经常写程序,只剩下二三十个字节,实在不够用,就查一下有没有子程序可以优化一下,再不行换芯片.

使用特权

评论回复
30
tomegeo| | 2008-2-19 16:47 | 只看该作者

我的看法

    其实这个问题可以这样理解:
    插第一张卡时,记下卡1的时间,然后系统定时30分钟,如果30分钟之内没有插卡2,就把卡1的时间清0,恢复初始状态,这样的话,就只需要比较分钟,直接用减法就可以了,代码肯定很简单。
    不过,楼主说只有插卡时才有电,这样问题就不是这么简单了,肯定要用到单片机的内部ROM。

使用特权

评论回复
31
Swd21ic| | 2008-2-19 21:48 | 只看该作者

Re.

把芯片写死了不符合设计要求..

这个方案在一开始就应该否决..

使用特权

评论回复
32
sodwell| | 2008-2-19 22:49 | 只看该作者

拜托

"系统只有ID卡插入时才有电,系统本身不带电源的."
这么高的要求不先说,到第二页才说!
不行就换个CPU吧 贵几毛钱  不要ROM只剩几个字节导致系统不稳定就惨了......

使用特权

评论回复
33
mikezhong| | 2008-2-20 00:44 | 只看该作者

ok

我用EMC的单片机ROM空间除开始的7个字节空间,全部用完未发现问题.不会出现程序乱跳的问题,担心是多余的!

使用特权

评论回复
34
mikesullen| | 2008-2-20 02:13 | 只看该作者

原来如此

楼主的智商应该没问题,不过可能语文学的不太好。
说实话,你在18楼写的我也没看明白,难怪春节没睡好。

不过现在能理解你的问题还是有点难度的,如果两次插卡时间分别是2007-12-31 23:59 和2008-01-01 0:28,肯定就需要年月日时分5个参数的运算了。

有两个思路,看是否可以参考:
(1)不知你的时间是如何获取的,如果时间格式可以更改,不是用年月日时分来表达,而是用一个单位,比如分、秒,这样就太好办了。实时时钟芯片的时间格式是可以设定的,希望你的系统也可以。
(2)时间格式如果不能改,那单片机在获取时间后,换算成分钟来存储,换算分钟时可以用相对一个参考的固定时间点的差来表示(比如2000-1-1 0:00),这部分代码应该好写,而且是循环,不太占用空间。两次时间的单位一样,比较就容易了吧。。。。。

我的语文高考时也没及格,如果各位看不懂,我再加注吧。。。

使用特权

评论回复
35
yuntian|  楼主 | 2008-2-20 08:46 | 只看该作者

还好智商没啥大问题,我把源程序贴出来.

使用特权

评论回复
36
yuntian|  楼主 | 2008-2-20 08:48 | 只看该作者

源程序,如果有用,算是春节没白干

bit time_over_test(void)
{    uchar i;
    char *date_p;
    date_p=&last_time.minute;
    i=90;
    do
    {if(date_same_test(&last_time.minute,&date.minute))//比较时间是否相同
            {return(0);}    //时间相同则返回未超时标志
        if(i==60)//过去时间连加30分钟后,指针切换为当前时间,连加60分钟,前30分钟为补时同步
            {date_p=&date.minute;}
        (*date_p)++;    //分钟+=1
        date_compute(date_p);    //重新计算分钟变更后的日历
    }while(--i);
    return(1);
}


//---比较两个日期时间是否相等,相等则返回=1,不相等则返回=0-----
bit date_same_test(char *date_p1,char *date_p2)
{uchar i;
    i=5;
    do{if(*date_p1++!=*date_p2++)
                {return(0);}
        }while(--i);
    return(1);
}
//---进行日历计算,入口参数指向分钟,指针加指向小时,以次类推----------------------
void date_compute(char *date_p)
{//FSR=date_p;
    uchar i=*(date_p+3);//缓存月份
    uchar j=*(date_p+4)&0x03;
    if(j==0&&i==2)
        {j=1;}
    else{j=0;}
    i=days_month+j;
    if(*date_p>=60)
    {*(date_p++)-=60;//分钟累加,指针指向小时
        if(++(*date_p)>=24)//小时>24?
            {*(date_p++)=0;    //hour 清零指针指向天
                (*date_p)++;    //天+=1
                if(*date_p>i)//天>当月天数?
                    {*(date_p++)=1;    //天=1号
                        (*date_p)++;    //月份+=1
                        if(*date_p>12)    //月份>12?
                            {*(date_p++)=1;    //月份=1;
                                (*date_p)++;    //年+=1
                            }
                    }
            }
    }
}

使用特权

评论回复
37
yuntian|  楼主 | 2008-2-20 08:52 | 只看该作者

结构

有位老兄说用结构程序量大,这个问题在这里不存在,这里引用的指针,再定义结构时是全局变量,编译后是是直接寻址的.

使用特权

评论回复
38
sz_kd| | 2008-2-20 09:34 | 只看该作者

飘过??????

使用特权

评论回复
39
bg6nw| | 2008-2-21 19:34 | 只看该作者

LS高,实在是高

使用特权

评论回复
40
5880527| | 2008-2-21 20:14 | 只看该作者

就比较个日和月吧

年怎么会牵涉到,还怎么会闰年都出来了,除非真有人吃饱了隔几年的同一时候再去插卡,而这中间还都没其他卡插过

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则