电子万年历,屏蔽掉时钟读时间函数read_rtc();12864能显示

2019-07-15 20:30发布

电子万年历,屏蔽掉1302时钟函数12864就可以显示初始时间,温度显示正常,但是加入1302读时间函数之后12864直接没显示了...怎么回事,求大神解决!谢谢...
#include <reg52.h>
#include <intrins.h>
#include "DS1302.h"
#include "DS18b20.h"
#include "Delay.h"
#include "Display.h"


#define uchar unsigned char
#define uint unsigned int
uchar code codetable[]="0123456789";
uchar code weektable[]="一二三四五六日";
uchar str1[16]="2014/01/12  27℃";
uchar str2[16]="00:30:10  星期五";
uchar str3[16]="四月初五  闹钟开";
uchar str4[16]="下  午  00点03分";
struct time time;
uchar temp;
bit ReadRTC_Flag;//定义读DS1302标志
void main(){
        time.year=11;
        time.month=5;
        time.week=6;
        time.day=14;
        time.hour=10;
        time.minute=59;
        time.second=45;
        set_rtc();
        delay_50ms(4);
        lcd12864initinal();
        lcd12864display(str1,1);
        delay_50ms(40);

        while(1){
                read_rtc();//问题所在,屏蔽掉显示正常,函数应该是正常,网上找的程序也有同样问题
                delay_50ms(1);
                str1[2]=codetable[time.year/10];
                str1[3]=codetable[time.year%10];
                str1[5]=codetable[time.month/10];
                str1[6]=codetable[time.month%10];
                str1[8]=codetable[time.day/10];
                str1[9]=codetable[time.day%10];
                str2[0]=codetable[time.hour/10];
                str2[1]=codetable[time.hour%10];
                str2[3]=codetable[time.minute/10];
                str2[4]=codetable[time.minute%10];
                str2[6]=codetable[time.second/10];
                str2[7]=codetable[time.second%10];
                str2[14]=weektable[(time.week-1)*2-1];
                str2[15]=weektable[(time.week-1)*2];
                str4[8]=codetable[time.hour/10];
                str4[9]=codetable[time.hour%10];
                str4[12]=codetable[time.minute/10];
                str4[13]=codetable[time.minute%10];
                temp=readtemperature();
                str1[12]=codetable[temp/10];
                str1[13]=codetable[temp%10];

                lcd12864display(str1,1);
                lcd12864display(str2,2);
                lcd12864display(str3,3);
                lcd12864display(str4,4);}
        }

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#include <reg52.h>
#include "DS1302.h"
#include <intrins.h>
#include <Delay.h>
sbit sck=P3^6;
sbit io=P3^4;
sbit ce=P3^5;
uchar time_data[7]={10,6,4,17,11,58,30};
code uchar write_add[7]={0x8c, 0x8a,0x88, 0x86,
                    0x84, 0x82,0x80};//年周月日时分秒
code uchar read_add[7]={0x8d, 0x8b,0x89, 0x87,
                    0x85, 0x83,0x81};//年周月日时分秒
/*按位写一字节8位*/
void write_ds1302_byte(uchar dat){
        uchar i;
        for(i=0;i<8;i++){
        sck=0;
        _nop_();
        io=dat&0x01;
        dat>>=1;
        sck=1;
        }
}
/*写某个数据dat到某个地址add*/
void write_ds1302(uchar add,uchar dat){
        ce=0;
        _nop_();
        sck=0;
        _nop_();
        ce=1;
        write_ds1302_byte(add);
        write_ds1302_byte(dat);
        _nop_();
        ce=0;
        _nop_();
        io=1;
        sck=1;
}
/*读取某一个地址(年/周/月/日/时/分/秒)的数据*/
/*uchar read_ds1302(uchar add){
        uchar i,value=0;
        ce=0;
        _nop_();_nop_();
        sck=0;
        _nop_();_nop_();
        ce=1;
   _nop_();_nop_();
        write_ds1302_byte(add);
        _nop_();
        for(i=0;i<8;i++){


        if(io);
        value=value|=0x80;
                sck=0;
                value>>=1;                        //右移一位
                _nop_();
           _nop_();
           _nop_();
                sck=1;
        }
        ce=0;
        _nop_();_nop_();
        ce=0;
        sck=0;
        _nop_();_nop_();
        _nop_();_nop_();
        sck=1;
        _nop_();_nop_();
        io=0;
        _nop_();_nop_();
        io=1;
        _nop_();_nop_();
        return value;
}*/
uchar read_ds1302(uchar addr)
{
        uchar i,value;
        ce=0;
        _nop_();          _nop_();
        sck=0;
        _nop_();        _nop_();
        ce=1;
        _nop_();         _nop_();
        write_ds1302_byte(addr);
        for(i=0;i<8;i++)
        {
                value=value>>1;
                        _nop_();
                sck=0;
                if(io)
                value=value|0x80;
                        _nop_();
                sck=1;               

        }
        ce=0;
        _nop_();        _nop_();
        sck=0;
        _nop_();        _nop_();
        sck=1;
        io=1;
        return value;
}
/*初始化时间为2014年周1一月一日12点00分*/
void set_rtc(void){
        uchar i,j;
        /*for(i=0;i<7;i++){
                j=time/10;
                time=time%10;
                time=time+j*16;
        }//10进制转为16进制*/
        j=time.year/10;
        time_data[0]=time.year%10;
        time_data[0]=time_data[0]+j*16;       

        j=time.week/10;
        time_data[1]=time.week%10;
        time_data[1]=time_data[1]+j*16;

                j=time.month/10;
        time_data[2]=time.month%10;
        time_data[2]=time_data[2]+j*16;

                j=time.day/10;
        time_data[3]=time.day%10;
        time_data[3]=time_data[3]+j*16;

                j=time.hour/10;
        time_data[4]=time.hour%10;
        time_data[4]=time_data[4]+j*16;

                j=time.minute/10;
        time_data[5]=time.minute%10;
        time_data[5]=time_data[5]+j*16;

                j=time.second/10;
        time_data[6]=time.second%10;
        time_data[6]=time_data[6]+j*16;
        write_ds1302(0x8e,0x00);//去除写保护
        for(i=0;i<7;i++){
                write_ds1302(write_add,time_data);
        }
        write_ds1302(0x8e,0x80);//加写保护*/


       
}
/*读时间数据到数组disp[]存放,为完成BCD码转换*/
void read_rtc(void){
        uchar i,j=0;
        //write_ds1302(0x8e,0x00);//去除写保护
        for(i=0;i<7;i++){
          time_data=read_ds1302(read_add);
       
        }//读出 年周月日时分秒
//        write_ds1302(0x8e,0x00);//加写保护
                time.year=time_data[0]%16+(time_data[0]/16)*10;
                time.week=time_data[1]%16;
                        time.month=time_data[2]%16+(time_data[2]/16)*10;
                                time.day=time_data[3]%16+(time_data[3]/16)*10;
                                        time.hour=time_data[4]%16+(time_data[4]/16)*10;
                                                time.minute=time_data[5]%16+(time_data[5]/16)*10;
                                                        time.second=time_data[6]%16+(time_data[6]/16)*10;
                       


}   


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
xinhua527
1楼-- · 2019-07-15 22:01
求大神出现指导.....万分感谢!
依然落叶飘零
2楼-- · 2019-07-15 22:24
  1. for(i=0;i<7;i++){
  2.           time_data=read_ds1302(read_add);
  3.         
  4.         }//读出 年周月日时分秒
复制代码
这段代码错误,改为
  1. for(i=0;i<7;i++){
  2.           time_datap[i]=read_ds1302(read_add);
  3.         
  4.         }//读出 年周月日时分秒
复制代码
数组书写不对。
吊兰,毛尖
3楼-- · 2019-07-15 23:56
你把清屏注解了试试,有可能是刷屏太快,其实它正常显示了,只是肉眼无法识别而已

评分

参与人数 1积分 +10 收起 理由 zhou2sheng + 10 感谢您的参与,您的支持是我们最大的动力.

查看全部评分

吊兰,毛尖
4楼-- · 2019-07-16 05:39
这是我之前用430f149做的一个万年历的程序。不过时间有点久不知道哪一个是最终稿了,供你参考吧,

12864 18b20 红外 wt588d.zip 下载积分: 积分 -1 分

39.04 KB, 下载次数: 10, 下载积分: 积分 -1 分

12864+18b20+红外+wt588d

1522495332
5楼-- · 2019-07-16 07:34
 精彩回答 2  元偷偷看……
依然落叶飘零
6楼-- · 2019-07-16 08:16
1522495332 发表于 2014-4-16 18:14
“依然落叶飘零实名认证”回答的也是错的

应该改为

1522495332说得没错,地址也是数组应该写出read_add.我也疏忽大意了。

一周热门 更多>