📄 1302.h
字号:
#include <REG52.H>
#include "type.h"
#define uint unsigned int
#define uchar unsigned char
uchar ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar aa[6],Sec,Cent,Hour,Year,Month,Day,Week,nian,yue,ri;
sbit ACC_7 = ACC^7;
sbit DS1302_CLK= P2^2; /*实时时钟时钟线引脚 */
sbit DS1302_IO=P2^1; /*实时时钟数据线引脚 */
sbit DS1302_RST= P2^0; /*实时时钟复位线引脚 */
void DS1302InputByte (uchar d) ;
void Write1302(uchar ucAddr, uchar ucDa);
unsigned char RTOutputByte ( void );
unsigned char Read1302 ( unsigned char addr );
void Init_1302(void);
void send_time(void);
void disptime(void);
void delay(uint k);
void disp_1302()
{
register unsigned char i,j,k,l;
for(i=0;i<11;i++)
{
if(i==3)
{
showtime(Year);
}
if(i==4)
{
showtime(Month);
}
if(i==5)
{
showtime(Day);
}
if(i==6)
{
showtime(Hour);
}
if(i==7)
{
showtime(Cent);
}
if(i==8)
{
showtime(Sec);
}
if(i==10)
{
for(j=0;j<2;j++)
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{
dispram[l*BLKN]=dispram[l*BLKN]
<<1|dispram[l*BLKN+1]>>7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]
<<1|dispram0[l*BLKN]>>7;
dispram0[l*BLKN]=dispram0[l*BLKN]
<<1|dispram0[l*BLKN+1]>>7;
dispram0[l*BLKN+1]=dispram0[l*BLKN+1]
<<1|xinqi[Week%16][l*BLKN+j]>>(8-k);
}
delay(50);
}
}
for(j=0;j<2;j++)
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{
dispram[l*BLKN]=dispram[l*BLKN]
<<1|dispram[l*BLKN+1]>>7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]
<<1|dispram0[l*BLKN]>>7;
dispram0[l*BLKN]=dispram0[l*BLKN]
<<1|dispram0[l*BLKN+1]>>7;
dispram0[l*BLKN+1]=dispram0[l*BLKN+1]
<<1|Timename[i][l*BLKN+j]>>(8-k);
}
delay(50);
}
}
}
void showtime(uchar shijian)
{
uchar l,k;
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{
dispram[l*BLKN]=dispram[l*BLKN]
<<1|dispram[l*BLKN+1]>>7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]
<<1|dispram0[l*BLKN]>>7;
dispram0[l*BLKN]=dispram0[l*BLKN]
<<1|dispram0[l*BLKN+1]>>7;
dispram0[l*BLKN+1]=dispram0[l*BLKN+1]
<<1|time[shijian/16][l]>>(8-k);
}
delay(50);
}
for(k=1;k<9;k++)
{
for(l=0;l<16;l++)
{
dispram[l*BLKN]=dispram[l*BLKN]
<<1|dispram[l*BLKN+1]>>7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]
<<1|dispram0[l*BLKN]>>7;
dispram0[l*BLKN]=dispram0[l*BLKN]
<<1|dispram0[l*BLKN+1]>>7;
dispram0[l*BLKN+1]=dispram0[l*BLKN+1]
<<1|time[shijian%16][l]>>(8-k);
}
delay(50);
}
}
/**********************1302**********************/
void DS1302InputByte (uchar d) //实时时钟写入一字节(内部函数)
{
uchar i;
for (i=0;i<8;i++) //循环8次 写入数据
{
DS1302_IO=d&0x01; //每次传输低字节
DS1302_CLK=1;
DS1302_CLK=0;
d>>=1; //右移一位
}
}
void Write1302(uchar ucAddr, uchar ucDa) //ucAddr: DS1302地址, ucData: 要写的数据(内部函数)
{
DS1302_RST=0; //DS1302_RST引脚为低,数据传送中止
DS1302_CLK=0; //清零时钟总线
DS1302_RST = 1; //DS1302_RST引脚为高,逻辑控制有效
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK =1;
DS1302_RST = 0;
}
unsigned char RTOutputByte ( void )
{
unsigned char i;
for ( i=8; i>0; i-- )
{
ACC>>=1;
ACC_7=DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return (ACC);
}
unsigned char Read1302 ( unsigned char addr )
{
unsigned char ucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST = 1;
DS1302InputByte(addr);
ucData=RTOutputByte();
DS1302_CLK = 1;
DS1302_RST=0;
return (ucData);
}
void Init_1302(void)
{
Write1302(0x8e,0x00);//允许写操作
Write1302(0x80,0x80);
Write1302(0x90,0xa5);//充电
Write1302(0x86,0x31);//日
Write1302(0x88,0x12);//月
Write1302(0x8c,0x04);//年
Write1302(0x8a,0x01);//星期
Write1302(0x84,0x22);//小时
Write1302(0x82,0x14);//分钟
Write1302(0x80,0x10);//秒
Write1302(0x8e,0x80);//禁止写操作
}
/*************************************************************************
函 数 名:Get1302()
功 能:读取DS1302当前时间
说 明:
调 用:Read1302()
入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 周 年
7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
******************************************************************/
void send_time(void)//发送当前时间
{
Day=Read1302(0x8b);
Month=Read1302(0x89);
Year=Read1302(0x8d);
Week=Read1302(0x87);
Hour=Read1302(0x85);
Cent=Read1302(0x83);
Sec=Read1302(0x81);
}
/**********************1302end**********************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -