📄 ds1302.c
字号:
#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit CLK=P1^3;
sbit IO =P1^4;
sbit RST =P1^5;
sbit K1=P1^0;
#define LEDLen 6
xdata unsigned char OUTBIT _at_ 0x8002;//位控制口
xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口
unsigned char LEDBuf[LEDLen];// 显示缓冲
//定义全局变量
signed char h;
signed char m;
signed char s;
signed char y;
//signed char w;
signed char month;
signed char d;
signed char a;
signed char b;
signed char c;
code unsigned char LEDMAP[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};// 八段管显示码
void RTInputByte(uchar d) //DS1302 写指令
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
IO = ACC0;
CLK = 1;
_nop_();
CLK = 0;
ACC = ACC >> 1;
}
}
uchar RTOutputByte(void) //DS1302读指令
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = IO;
CLK = 1;
_nop_();
CLK = 0;
}
return(ACC);
}
void W1302(uchar ucAddr, uchar ucDa)//向指定地址写数据
{
RST = 0;
CLK = 0;
_nop_();
RST = 1;
_nop_(); _nop_();
RTInputByte(ucAddr);
_nop_();
RTInputByte(ucDa);
CLK = 1;
RST = 0;
}
uchar R1302(uchar ucAddr)//读出指定地址的数据
{
uchar ucData;
W1302(0xBE,1);
RST = 0;
CLK = 0;
_nop_();
RST = 1;
_nop_();
RTInputByte(ucAddr);
ucData = RTOutputByte();
CLK = 1;
RST = 0;
return(ucData);
}
void Init_time(void) // DS1302初始化
{
W1302(0x8C,0x08);
//W1302(0x8A,0x06);
W1302(0x88,0x09);
W1302(0x86,0x12);
W1302(0x84,0x11);
W1302(0x82,0x58);
W1302(0x80,0x00);
}
void Dispaly(void) //显示
{
y=R1302(0x8D);//读出年
// w=R1302(0x8B);//读出星期
month=R1302(0x89);//读出月
d=R1302(0x87); //读出日
h=R1302(0x85); //读出小时
m=R1302(0x83);//读出分钟
s=R1302(0x81);//读出秒
}
void Delay(unsigned char CNT)
{
unsigned char i;
do{
i = 100;
do{
}while(--i);
}while (--CNT);
}
void DisplayLED()
{
unsigned char i;
unsigned char Pos;
unsigned char LED;
Pos = 0x20; // 从左边开始显示
for (i = 0; i < LEDLen; i++) {
OUTBIT = 0;//关所有八段管
LED = LEDBuf[i];
OUTSEG = LED;
OUTBIT = Pos;// 显示一位八段管
Delay(2);
Pos >>= 1;//显示下一位
}
// OUTBIT = 0;
}
void DisplayResult()//显示结果并进行十进制调整
{
// signed char H ;
// signed char M ;
// signed char S ;
// H= a ;
// M= b ;
//S= c ;
if(a>16){
LEDBuf[0]=LEDMAP[a/16];
} else LEDBuf[0]=0X3F;
LEDBuf[1]=LEDMAP[a%16] |0x80 ;
if(b>16){
LEDBuf[2]=LEDMAP[b/16];
} else LEDBuf[2]=0x3f;
LEDBuf[3]=LEDMAP[b%16] |0x80 ;
if(c>16){
LEDBuf[4]=LEDMAP[c/16] ;
} else LEDBuf[4]=0x3f;
LEDBuf[5]=LEDMAP[c%16];
}
void main()
{
Init_time();//DS1302初始化
while(1)
{
if(K1==1)
{
a=h;
b=m ;
c=s;
}
else
{
a=y;
b=month;
c=d ;
}
DisplayResult();
DisplayLED();
// KeyProcess();
Dispaly();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -