1302读出的时间不走怎么回事啊。。。哪位大哥指教一下啊

2019-03-24 20:43发布

#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
//位选段选
#define we_set PORTA|=BIT(0)//
#define we_clr PORTA&=~BIT(0)//
#define du_set PORTA|=BIT(1)//       
#define du_clr PORTA&=~BIT(1)//
//1302端口定义
#define clk_set PORTB|=BIT(0)
#define clk_clr PORTB&=~BIT(0)
#define clk_OUT DDRB|=BIT(0)//

#define io_set PORTB|=BIT(1)//
#define io_clr PORTB&=~BIT(1)//
#define io_OUT DDRB|=BIT(1)//
#define io_IN DDRB&=~BIT(1)//
#define io_r PINB&BIT(1)//

#define rst_set PORTB|=BIT(2)//
#define rst_clr PORTB&=~BIT(2)//
#define rst_OUT DDRB|=BIT(2)//

void write_ds1302_byte(uchar dat);//单字节写
void write_ds1302(uchar add,uchar dat);//多字节写
uchar read_ds1302(uchar add);
uchar const table_we[]={0xDF,0xef,0xf7,0xfb,0xfd,0xfe};
uchar const table_du[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar disp[8];
uchar i;
uchar time_date[7]={12,1,11,23,12,02,02};//年周月日时分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写年月日地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读比写多1
void set_rtc(void);//对时间
void read_rtc(void);//读时间
void time_pros(void);//处理函数
void dispiay(void);        //显示函数         
void delay(uint xms)//延时函数
{
        uint n,m;
        for(n=xms;n>0;n--)
                for(m=124;m>0;m--);

}
void duanko(void)//端口初始化
{
         DDRA=0XFF;
         PORTA=0XFF;
         DDRC=0XFF;
         PORTC=0Xff;
}
void write_ds1302_byte(uchar dat)//单字节写
{
         io_OUT;
         for(i=0;i<8;i++)
         {
                 clk_clr;
                 if(dat&0x01)
                     io_set;
                 else
                     io_clr;
                 clk_set;
                 clk_clr;        
                 dat=dat>>1;
         }
}
void write_ds1302(uchar add,uchar dat)//写多个字节
{
        rst_clr;
    clk_clr;
        rst_set;
        write_ds1302_byte(add);//写地址
        write_ds1302_byte(dat);//写数据
        rst_clr;
        //io_set;
        //clk_set;                       
}                                                          
uchar read_ds1302(uchar add)//读地址
{
    uchar value;
        rst_clr;
    clk_clr;
        rst_set;
        write_ds1302_byte(add);//写地址
        io_IN;
        for(i=0;i<8;i++)
         {
            value=value>>1;
                 if(io_r)
                     value=value|0x80;
                 clk_set;
                 clk_clr;
         }
        rst_clr;
        return value;
}
void set_rtc(void)//对时间
{  
    uchar k;
         for(i=0;i<7;i++)
         {
                   k=time_date/10;
                  time_date=time_date%10;
                  time_date=time_date+k*16;
         }
          write_ds1302(0x8e,0x00);//去除写保护
          for(i=0;i<7;i++)
          {
                   write_ds1302(write_add,time_date);
          }
          write_ds1302(0x8e,0x80);//加写保护
}
void read_rtc(void)//读出对的时间
{
          for(i=0;i<7;i++)
          {
                    time_date=read_ds1302(read_add);
          }
}
void time_pros(void)//处理
{
        disp[0]=time_date[6]%16;
        disp[1]=time_date[6]/16;

    disp[2]=time_date[5]%16;
        disp[3]=time_date[5]/16;

    disp[4]=time_date[4]%16;
        disp[5]=time_date[4]/16;


}
void display(void)//显示函数
{
        uchar j;
        for(j=0;j<6;j++)
        {         
            we_set;
                PORTC=table_we[j];
                 we_clr;
                       
                du_set;       
            PORTC=table_du[disp[j]];
                  du_clr;
                 delay(5);
        }
       
}       
void main(void)
{   
     duanko();
         clk_OUT;
         rst_OUT;
     set_rtc();
         while(1)
         {
                 read_rtc();//读出对的时间
                time_pros();//处理
                for(i=0;i<40;i++)
                {
                display();//显示函数
                }
         }
               
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
lr2131
2019-03-25 07:50
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>