📄 1302.c
字号:
#include <reg51.h>
#include "1302.h"
#include "1602.h"
//#define uchar unsigned char
//#define uint unsigned int
uchar clk_time[]={0x30,0x56,0x19,0x16,0x08,0x04,0x07}; //秒,分,时,天,月,星期,年寄存器初始值
uchar sec0,sec1,min0,min1,hr0,hr1,date0,date1,mon0,mon1,week,year0,year1;
/******************DS1302:写入操作(上升沿)*********************/
void write_byte(unsigned char da)
{
unsigned char i;
ACC=da;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=0;
T_CLK=1;
ACC=ACC>>1;
}
}
/*******************DS1302:读取操作(下降沿)******************/
unsigned char read_byte(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
T_CLK = 1;
T_CLK = 0;
ACC7 = T_IO;
}
return(ACC);
}
/******************DS1302:写入数据(先送地址,再写数据)***************************/
void write_1302(unsigned char addr,unsigned char da)
{
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
write_byte(da);
T_RST=0;
T_CLK=1;
}
/******************DS1302:读取数据(先送地址,再读数据)**************************/
unsigned char read_1302(unsigned char addr)
{
unsigned char temp;
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
temp=read_byte();
T_RST=0;
T_CLK=1; //停止工作
return(temp);
}
/******************************DS1302写时间子程序*************************/
void WriteTime()
{
uchar i;
uchar temp=0x80; //DS1302秒的写寄存器地址 0x80
for(i=0;i<7;i++)
{
write_1302(temp,clk_time[i]);
temp+=2;
}
}
/*********************************DS1302读时间子程序*********************/
void ReadTime()
{
uchar i;
uchar temp=0x81; //DS1302秒的写寄存器地址 0x81
for(i=0;i<7;i++)
{
clk_time[i]=read_1302(temp);
temp+=2;
}
}
/******************************初始化显示时间****************************************/
void DisplayInit()
{
Show(1,1,2+48);
Show(2,1,48);
year1=(clk_time[6]&0xF0)>>4; //读 年 的高位
Show(3,1,year1+48); // 显示
year0=clk_time[6]&0x0F; // 读年的低位
Show(4,1,year0+48); //显示
Show(5,1,'-'); //显示‘-’
week=clk_time[5]&0x07; //显示星期
mon1=(clk_time[4]&0x10)>>4; //月
Show(6,1,mon1+48);
mon0=clk_time[4]&0x0F;
Show(7,1,mon0+48);
Show(8,1,'-');
date1=(clk_time[3]&0x30)>>4; //天
Show(9,1,date1+48);
date0=clk_time[3]&0x0F;
Show(10,1,date0+48);
Show(11,1,'-');
Display(12,1,"Thu");
hr1=(clk_time[2]&0x30)>>4; //时
Show(1,2,hr1+48);
hr0=clk_time[2]&0x0F;
Show(2,2,hr0+48);
Show(3,2,':');
min1=(clk_time[1]&0x70)>>4; //分
Show(4,2,min1+48);
min0=clk_time[1]&0x0F;
Show(5,2,min0+48);
Show(6,2,':');
sec1=(clk_time[0]&0x70)>>4; //秒
Show(7,2,sec1+48);
sec0=clk_time[0]&0x0F;
Show(8,2,sec0+48);
}
/*******************************时间判断自加函数**********************************/
void Judgetime()
{
if(sec0==0&&sec1==0) //判断如果秒都为0则分加一显示
{
min1=(clk_time[1]&0x70)>>4;
Show(4,2,min1+48);
min0=clk_time[1]&0x0F;
Show(5,2,min0+48);
// P21=0;
}
if(min0==0&&min1==0) //判断如果分都为0则时加一显示
{
min1=1; //让min1为别的值
hr1=(clk_time[2]&0x30)>>4;
Show(1,2,hr1+48);
hr0=clk_time[2]&0x0F;
Show(2,2,hr0+48);
}
if(hr0==0&&hr1==0) //判断如果时都为0则天加一显示
{
hr0=1; //date让为别的值
date1=(clk_time[3]&0x30)>>4;
Show(9,1,date1+48);
date0=clk_time[3]&0x0F;
Show(10,1,date0+48);
switch (clk_time[5]) //同时显示星期
{
case 1: Display(12,1,"Mon"); break;
case 2: Display(12,1,"Tue"); break;
case 3: Display(12,1,"Wen"); break;
case 4: Display(12,1,"Thu"); break;
case 5: Display(12,1,"Fri"); break;
case 6: Display(12,1,"Sat"); break;
case 7: Display(12,1,"Sun"); break;
default:break;
}
}
if(date1==0&&date0==1) //判断如果天都为01则月加一显示
{
date0=0; //date让为别的值
mon1=(clk_time[4]&0x10)>>4;
Show(6,1,mon1+48);
mon0=clk_time[4]&0x0F;
Show(7,1,mon0+48);
}
if(mon1==0&&mon0==1) //判断如果月为01则年加一显示
{
mon0=0; //让为别的值
year1=(clk_time[6]&0xF0)>>4;
Show(3,1,year1+48);
year0=clk_time[6]&0x0F;
Show(4,1,year0+48);
}
}
void sec()
{
sec1=(clk_time[0]&0x70)>>4;
Show(7,2,sec1+48);
sec0=clk_time[0]&0x0F;
Show(8,2,sec0+48);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -