📄 c51ds12887.c
字号:
/****************DS12887 时钟日历芯片调试******************/
/****************作者:韩宝俊 *******************************/
/*********************************************************
管脚配置:
MOT: 接地
CS: 接地 地址:0x00
AS: 接单片机 ALE
R/W: 接 RW P3.6
DS: 接 RD P3.7
RESET: 接高
IRQ: 空
SQW: 空
AD0-AD7 接 P1.0-P1.7
/************************************************************/
/************************************************************/
#include <absacc.h>
#include <reg52.h>
#define uchar unsigned char
uchar xdata *chRegA ;
uchar xdata *chRegB ;
uchar xdata *chRegC ;
uchar xdata *chRegD ;
uchar xdata *newaddr ;
uchar k1, k2, orignalNumber, nowNumber ;
uchar key, cnt = 40, tag1 = 0, flag = -1 ;
uchar key1 = 0 , key2 = 0 , key3 = 0 , key4 = 0 ;
uchar idata dt[7] = {05, 11, 29, 2, 10, 21, 25} ;
uchar at[7] = {9, 8, 7, 6, 4, 2, 0} ; /* 年、月、日,星期、时、分、秒 */
uchar xdata *addr = 0x00 ; /* 片选地址 */
unsigned char DispCode[]={0x05,0xAF,0x16,0x0E,0xAC,
0x4C,0x44,0x2F,0x04,0x0C
}; /* 字形码库 0,1,2,3,4,5,6,7,8,9 */
void DelayT(unsigned int time) ;
void Start_calendar() ;
void stop_calendar() ;
void blinkfun() ;
void initatat() ;
void set_calendar() ;
uchar read_calendar(uchar display[7]) ;
void write_calendar(uchar xdata *newaddr) ;
void LEDdisplay(uchar display[]) ;
/**************************************************************/
/*该函数解决光标在特定位置上闪烁 */
/**************************************************************/
void blinkfun()
{
uchar i, temp ;
k1 = k2= 1 ;
i = 0 ;
SCON = 0 ;
TI = 0 ;
SBUF = 0x16 ;
while(!TI)
{
}
TI = 0 ;
SBUF = 0x05 ;
while(!TI)
{
}
TI = 0 ;
while(addr+at[i]>newaddr)
{
if((addr+at[i])!= 0x06)
{
SBUF = DispCode[*(addr+at[i])/10] ;
while(!TI)
{
}
TI = 0 ;
}
SBUF = DispCode[*(addr+at[i])%10] ;
i++ ;
}
if(flag%2 == 0)
{
temp = DispCode[*newaddr/10] ;
if(newaddr!= 0x06)
{
if(k1)
{
SBUF = 0xff ;
while(!TI)
{
}
TI = 0;
k1 = 0;
}
else
{
SBUF = temp ;
while(!TI)
{
}
TI = 0 ;
k1 = 1 ;
}
}
SBUF=DispCode[*newaddr%10] ;
while(!TI)
{
}
TI = 0 ;
}
else
{
if(newaddr!= 0x06)
{
SBUF=DispCode[*newaddr/10] ;
while(!TI)
{
}
TI = 0 ;
}
temp = DispCode[*newaddr%10] ;
if(k2)
{
SBUF = 0xff ;
while(!TI)
{
}
TI = 0 ;
k2 = 0 ;
}
else
{
SBUF = temp ;
while(!TI)
{
}
TI = 0 ;
k2 = 1 ;
}
}
++i ;
while(i<7)
{
if(addr+at[i]!= 0x06)
{
SBUF = DispCode[*(addr+at[i])/10];
while(!TI)
{
}
TI = 0 ;
}
SBUF = DispCode[*(addr+at[i])%10] ;
while(!TI)
{
}
TI = 0 ;
i++ ;
}
DelayT(10000) ;
}
/****************************************************************/
/* 延时函数 */
/**************************************************************/
void DelayT(unsigned int time)
{
unsigned int i;
for(i = 0;i< time;i++)
;
}
/**************************************************************/
/* 启动时钟芯片*/
/**************************************************************/
void Start_calendar()
{
*chRegA = 0x20 ;
*chRegB = 0x06 ;
}
/********************************************************/
/* 芯片停止运行 */
/**********************************************************/
void stop_calendar()
{
*chRegA=0x70 ;
}
/********************************************************/
/* 初始化时钟芯片 */
/***********************************************************/
void initatat()
{
Start_calendar() ;
ACC = *chRegC ; /*读寄存器C,清零中断请求标志*/
ACC = *chRegD ; /*读寄存器D,使VTR=1,数据有效*/
}
/*******************************************************/
/*设置系统时间 */
/*******************************************************/
void set_calendar()
{
uchar i ;
*chRegB = 0x80;
for(i = 0;i<= 6;i++)
*(addr+at[i]) = dt[i] ;
}
/***********************************************************/
/*读时钟芯片 */
/************************************************************/
uchar read_calendar(uchar display[7])
{
uchar i ;
*chRegB = 0x06;
for(i = 0;i<= 6;i++)
display[i] = *(addr+at[i]) ;
}
/*****************************************************************/
/*修改时钟函数*/
/*****************************************************************/
void write_calendar(uchar xdata *newaddr)
{
uchar temp1, temp2;
if(key2|key4)
{
if(key2) /*实现“+”功能*/
{
if(flag%2== 0) /* flag 为偶数时,修改对应的时间高位*/
{
temp2 = *newaddr%10 ;
temp1 = *newaddr/10 ;
if(newaddr!= 0x06)
{
if(newaddr!= 0x00)
{
temp1++ ;
}
else
{
stop_calendar() ;
temp1++ ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -