|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
数码管由595控制,在显示数据时数码管余辉现象比较明显,数据显示的不是很清晰,
我将重读数据的延时调到1秒左右才行,不过每重新读一次数据数码仍然会闪一下,哪位高手知道是哪不对呢???
/********************************************************************
*DS1302控制程序 2011.12.01 wqz
********************************************************************/
#include<reg52.h>
#include<intrins.h>
typedef unsigned uchar;
sbit sda=P2^1; //DS1302
sbit clk=P2^0;
sbit ce=P2^2;
sbit IO =P1^7; //595控制信号
sbit RLK =P1^6;
sbit CLK =P1^5;
#define my_delay5us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
uchar cc[8]; //将要显示的时间由BCD码转换成要显示的数值存放在CC[]中
uchar bb[8]; //存放从DS1302中读取出来的数据
uchar aa[7]={0,30,18,20,12,6,11}; //初始时间
uchar code write_rtc[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //时间寄存器写地址
uchar code tember[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管显示表
void my_delay1ms(int t); //延时1ms函数
void write_1byte(uchar temp); //写一字节数据
uchar read_1byte(); //读一字李数据
void write_addr_data(uchar Addr, uchar Data); //先写地址再写数据
uchar writeadd_readdat(uchar ucAddr); //先写地址再读数据
void write1_readM(); //连续读多个字节数据
void ds1302_init(); //DS1302初始化
/********************************************************************
*
* 主函数
********************************************************************/
void main()
{
uchar i,j,dat;
my_delay1ms(10);
ds1302_init(); //给DS1302付初值 11年12月20日 周六 18-30-00
while(1)
{
write1_readM(); //读DS1302中的数据
cc[0]=bb[0]%16;
cc[1]=bb[0]/16;
cc[2]=10;
cc[3]=bb[1]%16;
cc[4]=bb[1]/16;
cc[5]=10;
cc[6]=bb[2]%16;
cc[7]=bb[2]/16;
for(j=0;j<8;j++) //显示部分
{
dat=tember[cc[j]];
RLK=0;
my_delay5us();
for(i=0;i<8;i++)
{
if(dat&0x80)IO=1;
else IO=0;
my_delay5us();
CLK=1;
my_delay5us();
CLK=0;
dat<<=1;
}
my_delay5us();
RLK=1;
}
my_delay1ms(10);
}
}
/**********************************************************************/
void my_delay1ms(int t) //延时
{
uchar i,j;
while(t--)
{
for(i=4;i>0;i--)
for(j=50;j>0;j--);
}
}
/**********************************************************************/
void write_1byte(uchar temp) //写一字节数据
{
uchar i;
clk=0;
my_delay5us();
for (i=0;i<8;i++)
{
if(temp&0x01)sda=1;
else sda=0;
my_delay5us();
clk=1;
my_delay5us();
clk=0;
temp>>=1;
}
}
/**********************************************************************/
uchar read_1byte() //读一字节数据
{
uchar i,num;
for (i=0;i<8;i++)
{
num>>=1;
if(sda)
num|=0x80;
my_delay5us();
clk=1;
my_delay5us();
clk=0;
}
return num;
}
/**********************************************************************/
void write_addr_data(uchar Addr, uchar Data) //先写地址再写数据
{
ce = 0;
my_delay5us();
clk = 0;
my_delay5us();
ce = 1;
my_delay5us();
write_1byte(Addr); // 地址,命令
write_1byte(Data); // 写1Byte数据
my_delay5us();
clk=1;
my_delay5us();
ce =0;
}
/**********************************************************************/
uchar writeadd_readdat(uchar ucAddr) //先写地址再读数据
{
uchar num1=0;
ce = 0 ;
my_delay5us();
clk = 0;
my_delay5us();
ce = 1;
my_delay5us();
write_1byte(ucAddr); // 地址,命令
num1 = read_1byte(); // 读1Byte数据
my_delay5us();
clk = 1;
my_delay5us();
ce =0;
return(num1);
}
/**********************************************************************/
void write1_readM() //连续读多个字节数据
{
uchar i,Addr;
Addr=0x81;
for (i=0;i<7;i++)
{
bb = writeadd_readdat( Addr);//*格式为: 秒 分 时 日 月 星期 年
Addr += 2;
}
}
/**********************************************************************/
void ds1302_init() //初始时间 11年12月20日 周六 18-30-00
{
uchar i,*p,tmp;
for(i=0;i<7;i++)
{ /*转BCD
tmp=aa/10;
aa=aa%10;
aa=aa+tmp*16;
}
write_addr_data(0x8E,0X00);
p=write_rtc; //传地址
for(i=0;i<7;i++) //7次写入 秒分时日月周年
{
write_addr_data(*p,aa);
p++;
}
write_addr_data(0x8E,0x80);
} |
|