|
最近在单片机上做了个时钟显示,时钟芯片用的是DS1302,但是仿真时DS1302的管脚没有反应,一个1302困扰了我好多天了,现在贴出源程序,请高手们指点指点。感激不尽!
#include
#include
#include
#define uchar unsigned char
#define ds1302SCK P2_2 /*DS1302实时时钟时钟线引脚*/
#define ds1302IO P2_3 /*DS1302实时时钟数据线引脚*/
#define ds1302RST P2_4 /*DS1302实时时钟复位线引脚*/
#define sn595SH P3_6 /*SN74HC595移位寄存器时钟输入*/
#define sn595ST P3_7 /*SN74HC595存储寄存器时钟输入*/
#define sn595DS P2_7 /*SN74HC595串行数据输入*/
sbit BIT0=ACC^0;
sbit BIT7=ACC^7;
const uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar time[7]={0x00,0x30,0x12,0x00,0x00,0x00,0x00};
uchar timecur[7];
uchar timeint[14];
void RTInputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
for(i=8; i>0; i--)
{
ds1302IO = BIT0;
ds1302SCK = 1;
ds1302SCK = 0;
ACC = ACC >> 1;
}
}
uchar RTOutputByte(void)
{
uchar i;
ds1302IO=1;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
BIT7 = ds1302IO;
ds1302SCK = 1;
ds1302SCK = 0;
}
return(ACC);
}
void W1302(uchar ucAddr, uchar ucDa)
{
ds1302RST = 0;
ds1302SCK = 0;
ds1302RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
ds1302SCK = 1;
ds1302RST =0;
}
uchar R1302(uchar ucAddr)
{
uchar ucDa;
ds1302RST = 0;
ds1302SCK = 0;
ds1302RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucDa = RTOutputByte(); /* 读1Byte数据 */
ds1302SCK = 1;
ds1302RST =0;
return(ucDa);
}
void Timeset()
{
uchar i;
uchar ucAddr=0x80;
W1302(0x8e,0x00);
for(i=0;i<7;i++)
{
W1302(ucAddr,time);
ucAddr+=2;
}
W1302(0x8e,0x80);
}
void Timeget()
{
timecur[0]=R1302(0x81);
timeint[0]=(timecur[0]&0x0f);
timeint[1]=(timecur[0]>>4);
timecur[1]=R1302(0x83);
timeint[2]=(timecur[1]&0x0f);
timeint[3]=(timecur[1]>>4);
timecur[2]=R1302(0x85);
timeint[4]=(timecur[2]&0x0f);
timeint[5]=(timecur[2]>>4);
timecur[3]=R1302(0x87);
timeint[6]=(timecur[3]&0x0f);
timeint[7]=(timecur[3]>>4);
timecur[4]=R1302(0x89);
timeint[8]=(timecur[4]&0x0f);
timeint[9]=(timecur[4]>>4);
timecur[5]=R1302(0x8b);
timeint[10]=(timecur[5]&0x0f);
timeint[11]=(timecur[5]>>4);
timecur[6]=R1302(0x8d);
timeint[12]=(timecur[6]&0x0f);
timeint[13]=(timecur[6]>>4);
}
void display(void)
{
uchar i,temp;
sn595ST=0;
for(i=0;i<8;i++)
{
sn595SH=0;
temp=tab[timeint[2]];
ACC=(temp&0x01);
sn595DS=BIT0;
temp=temp<<1;
sn595SH=1;
}
P3_0=0;P3_1=1;
P3_2=1;P3_3=1;
sn595ST=1;
for(i=0;i<8;i++)
{
sn595SH=0;
sn595ST=0;
temp=tab[timeint[3]];
ACC=(temp&0x80);
sn595DS=BIT7;
temp=temp<<1;
sn595SH=1;
}
P3_0=1;P3_1=0;
P3_2=1;P3_3=1;
sn595ST=1;
for(i=0;i<8;i++)
{
sn595SH=0;
sn595ST=0;
temp=tab[timeint[4]];
ACC=(temp&0x80);
sn595DS=BIT7;
temp=temp<<1;
sn595SH=1;
}
P3_0=1;P3_1=1;
P3_2=0;P3_3=1;
sn595ST=1;
for(i=0;i<8;i++)
{
sn595SH=0;
sn595ST=0;
temp=tab[timeint[5]];
ACC=(temp&0x80);
sn595DS=BIT7;
temp=temp<<1;
sn595SH=1;
}
P3_0=1;P3_1=1;
P3_2=1;P3_3=0;
sn595ST=1;
}
main()
{
Timeset();
Timeget();
while(1)
{
display();
}
}
|
|