驱动DS1302模块,显示时间
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
sbit RSPIN = P3^0;
sbit RWPIN = P3^1;
sbit EPIN = P3^2;
sbit DS1302_CLK = P0^1;
sbit DS1302_IO = P0^0;
sbit DS1302_RST = P0^2;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
void delay3ms(void)
{
unsigned char i,j,k;
for(i=0;i<18;i++)
for(j=0;j<55;j++)
for(k=0;k<100;k++);
}
void DS1302InputByte(unsigned char d)
{
unsigned char i;
ACC=d;
for(i=8;i>0;i--)
{
DS1302_IO = ACC0;
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC>>1;
}
}
unsigned char DS1302OutputByte(void)
{
unsigned char i;
for(i=8;i>0;i--)
{
ACC = ACC>>1;
ACC7 = DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0;
}
return(ACC);
}
void Write1302(unsigned char ucAddr, unsigned char ucDa)
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr);
DS1302InputByte(ucDa);
DS1302_CLK = 1;
DS1302_RST = 0;
}
unsigned char Read1302(unsigned char ucAddr)
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr | 0x01);
ucData = DS1302OutputByte();
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}
void lcdwaitidle(void)
{
unsigned char i;
P1=0xff;
RSPIN=0;
RWPIN=1;
EPIN=1;
for(i=0;i<20;i++)
if((P1&0x80)== 0)break;
EPIN=0;
}
void lcdwc(unsigned char c)
{
lcdwaitidle();
RSPIN=0;
RWPIN=0;
P1=c;
EPIN=1;
_nop_();
EPIN=0;
}
void lcdwd(unsigned char d)
{
lcdwaitidle();
RSPIN=1;
RWPIN=0;
P1=d;
EPIN=1;
_nop_();
EPIN=0;
}
void lcdreset(void)
{
lcdwc(0x38);
delay3ms();
lcdwc(0x38);
delay3ms();
lcdwc(0x38);
delay3ms();
lcdwc(0x38);
delay3ms();
lcdwc(0x08);
lcdwc(0x01);
delay3ms();
lcdwc(0x06);
lcdwc(0x0c);
}
unsigned char year,month,day,hour,min,sec;
unsigned char date[8]={0,0,'-',0,0,'-',0,0};
unsigned char time[8]={0,0,':',0,0,':',0,0};
void main()
{
unsigned char a,charpos,i,temp;
lcdreset();
Write1302(0x8e,0x00);
Write1302(0x80,0x00);
while(1)
{
temp= Read1302(0x80);
sec=((temp&0x70)>>4)*10 + (temp&0x0f);
temp = Read1302(0x82);
min=((temp&0x70)>>4)*10 + (temp&0x0f);
temp = Read1302(0x84);
hour = ((temp&0x70)>>4)*10 + (temp&0x0f);
temp= Read1302(0x86);
day=((temp&0x70)>>4)*10 + (temp&0x0f);
temp= Read1302(0x88);
month=((temp&0x70)>>4)*10 + (temp&0x0f);
temp= Read1302(0x8c);
year=((temp&0x70)>>4)*10 + (temp&0x0f);
date[0]=year/10+'0';
date[1]=year%10+'0';
date[3]=month/10+'0';
date[4]=month%10+'0';
date[6]=day/10+'0';
date[7]=day%10+'0';
time[0]=hour/10+'0';
time[1]=hour%10+'0';
time[3]=min/10+'0';
time[4]=min%10+'0';
time[6]=sec/10+'0';
time[7]=sec%10+'0';
charpos=0x4;
for(i=0;i<8;i++)
{
a=date[i];
lcdwc(charpos | 0x80);
lcdwd(a);
charpos++;
}
charpos=0x44;
for(i=0;i<8;i++)
{
a=time[i];
lcdwc(charpos | 0x80);
lcdwd(a);
charpos++;
}
}
}
效果: