我想用数码管显示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();
}
}
一周热门 更多>