菜鸟求助,关于DS1302数码管显示

2019-07-15 14:48发布

我想用数码管显示DS1302的值,不知道为什么返回值一直是FF,求各位大神搭一下眼
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit io=P3^4;                 //数据线为P3.4,片选线为P3.5,时钟线为P3.6
sbit ce=P3^5;
sbit scl=P3^6;
sbit LSA=P2^2;                    //38译码器进行位选,P0口进行段选
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar time[7];
uchar timer[8]={0};
uchar code displaynum[]={                //数码管段选值,最后一位为-做时间间隔符
0x3f,0x06,0x5B,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40
};
uchar code set[]={0x00,0x30,0x20,0x10,0x03,0x04,0x16};        //要设定的时间值20点30分00秒
uchar code read_com[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};          //读取命令及地址
uchar code write_com[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};   //写入命令及地址
void ds1302_byte_write(uchar add,uchar dat)
{
        uchar mask;
        ce=0;
        _nop_();
        scl=0;
        _nop_();
        ce=1;
        _nop_();
        for(mask=0x01;mask!=0;mask<<=1)//输入地址命令
        {
                if(add&mask!=0)
                        io=1;
                else io=0;
                scl=1;
                _nop_();
                scl=0;
                _nop_();
        }
        for(mask=0x01;mask!=0;mask<<=1)//输入设定时间值
        {
                if(dat&mask!=0)
                        io=1;
                else io=0;
                scl=1;
                _nop_();
                scl=0;
                _nop_();
        }
        ce=0;
        _nop_();
}
uchar ds1302_byte_read(uchar add)
{
        uchar mask,dat;
        dat=0;
        ce=0;
        _nop_();
        scl=0;
        _nop_();
        ce=1;
        _nop_();
        for(mask=0x01;mask!=0;mask<<=1)                //输入地址命令
        {
                if(add&mask!=0)
                        io=1;
                else io=0;
                scl=1;
                _nop_();
                scl=0;
                _nop_();
        }
        _nop_();
        for(mask=0x01;mask!=0;mask<<=1)                 //读取时间值
        {
                if(io!=0)
                dat=dat|mask;
                scl=1;
                _nop_();
                scl=0;
                _nop_();               
        }
        ce=0;                                                           //仿照例程加入的恢复
        _nop_();
        scl=1;
        _nop_();
        io=0;
        _nop_();
        io=1;
        _nop_();
        return dat;
}
void display()
{
        uchar i,j;
        for(i=0;i<8;i++)  //使用38译码器控制八个位选端,P0口控制段选
                {
                        switch(i)
                        {
                                case(0):LSA=0;LSB=0;LSC=0;break;
                                case(1):LSA=1;LSB=0;LSC=0;break;
                                case(2):LSA=0;LSB=1;LSC=0;break;
                                case(3):LSA=1;LSB=1;LSC=0;break;
                                case(4):LSA=0;LSB=0;LSC=1;break;
                                case(5):LSA=1;LSB=0;LSC=1;break;
                                case(6):LSA=0;LSB=1;LSC=1;break;
                                case(7):LSA=1;LSB=1;LSC=1;break;
                        }
                        P0=displaynum[timer[i]];
                        j=50;                                           //持续50ms
                        while(j--);
                        P0=0X00;                                   //消隐
                }
}
void ds1302_init()
{
        uchar i;
        ds1302_byte_write(0x8E,0x00); //解除写保护
        for(i=0;i<7;i++)
        {
            ds1302_byte_write(write_com[i],set[i]);         //输入设定时间值
        }
        ds1302_byte_write(0x8E,0X80);  //添加写保护
}
void main()
{
        uchar j;
        ds1302_init();
        while(1)
        {
                for(j=0;j<7;j++)                           //读取时间值放入time数组
                {
                        time[j]=ds1302_byte_read(read_com[j]);
                }
                timer[0]=time[2]/16;  //把time数组中的时间值秒分时,各分为两部分,便于数码管显示
                timer[1]=time[2]%16;
                timer[2]=16;                  //时间分隔符
                timer[3]=time[1]/16;
                timer[4]=time[1]%16;
                timer[5]=16;
                timer[6]=time[0]/16;
                timer[7]=time[0]%16;
                display();
        }

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
ST_Lover
1楼-- · 2019-07-15 20:40
代码看不出来 ,你是要做毕设还是?  需要代做吗  1002925094                 
art0213156
2楼-- · 2019-07-15 21:20
找出问题了(add&mask)!=0

一周热门 更多>