主函数
#include <stc15f2k60s2.h>
#include <ds1302.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define get() (P3&0x3f)|((P4&0x10)<<3)|((P4&0x04)<<4)
void allinit();
void Delay5ms() ; //@12.000MHz
void mkey();
void Timer0Init();
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar disbuf[8]={0,11,11,11,11,11,11,11};
uchar discom=0,key=0;
extern unsigned char clock[];
void main()
{
Timer0Init();
ET0=1;
EA=1;
allinit();
DsInit();
while(1)
{
dsread();
disbuf[0]=clock[2]/10;disbuf[1]=clock[2]%10;disbuf[2]=10;
disbuf[3]=clock[1]/10;disbuf[4]=clock[1]%10;disbuf[5]=10;
disbuf[6]=clock[0]/10;disbuf[7]=clock[0]%10;
mkey();
}
}
void mkey()
{
uchar temp;
P3=0x0f;P44=0;P42=0;
temp=get();
P3=0xf0;P44=1;P42=1;
temp|=get();//是或取位
if((temp!=0xff)&&!key)
{
key=temp;
}
else if((temp==0xff)&&key)//注意是else选择,==为松手触发,!=为按下触发//累加的功能用松手触发好!
{
switch (key)
{
case 0x7e:disbuf[0]=1;break;
case 0x7d:disbuf[0]=2;break;
case 0x7b:disbuf[0]=3;break;
case 0x77:disbuf[0]=4;break;
case 0xbe:disbuf[0]=5;break;
case 0xbd:disbuf[0]=6;break;
case 0xbb:disbuf[0]=7;break;
case 0xb7:disbuf[0]=8;break;
case 0xde:disbuf[1]=0;break;
case 0xdd:disbuf[2]=1;break;
case 0xdb:disbuf[3]=1;break;
case 0xd7:disbuf[4]=1;break;
case 0xee:disbuf[5]=1;break;
case 0xed:disbuf[6]=1;break;
case 0xeb:disbuf[7]=1;break;
case 0xe7:disbuf[0]=9;break;
}
key=0;
}
}
void Timer0Init(void) //1??@12.000MHz
{
AUXR |= 0x80; //?????1T??
TMOD &= 0xF0; //???????
TL0 = 0x20; //??????
TH0 = 0xD1; //??????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
}
void time0() interrupt 1
{
P2=0xc0;
P0=1<<discom;
P2=0xe0;
P0=tab[disbuf[discom]];
if(++discom==8)discom=0;
}
void allinit()
{
P2=0x80;
P0=0xff;
P2=0xa0;
P0=0x00;
P2=0xc0;
P0=0xff;
P2=0xe0;
P0=0xff;
}
void Delay5ms() //@12.000MHz
{
unsigned char i, j;
i = 59;
j = 90;
do
{
while (--j);
} while (--i);
}
时钟芯片驱动代码
#include <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
unsigned char clock[7]={56,59,23,0,0,0,0};
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
unsigned char num;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
num=(dat/10<<4)|(dat%10);
Write_Ds1302(num);
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00,low,high;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
low=temp%16;
high=temp/16;
temp=high*10+low;
return (temp);
}
void DsInit()
{
unsigned char add=0x80,i=0;
Write_Ds1302_Byte(0x8e,0x00);
for(;i<7;i++)
{
Write_Ds1302_Byte(add,clock[i]);
add=add+2;
}
Write_Ds1302_Byte(0x8e,0x80);
}
void dsread()
{
unsigned char add=0x81,i=0;
EA=0;
Write_Ds1302_Byte(0x8e,0x00);
for(;i<7;i++)
{
clock[i]=Read_Ds1302_Byte(add);
add=add+2;
}
Write_Ds1302_Byte(0x8e,0x80);
EA=1;
}