📄 复件 ds12887.c
字号:
/////////////////////////////////////////
// 接口 RTC.h
////////////////////////////////////////
#include <reg52.h>
//*******DS12887 *******
#define YEAR_IN_RTC 0
#define MONTH_IN_RTC 1
#define DAY_IN_RTC 2
#define HOUR_IN_RTC 3
#define MINUTE_IN_RTC 4
#define SECOND_IN_RTC 5
#define SECOND_ALARM_IN_RTC 6
#define MINUTE_ALARM_IN_RTC 7
#define HOUR_ALARM_IN_RTC 8
#define RTC_SECONDS XBYTE[0xfe00]
#define RTC_SECONDS_ALARM XBYTE[0xfe01]
#define RTC_MINUTES XBYTE[0xfe02]
#define RTC_MINUTES_ALARM XBYTE[0xfe03]
#define RTC_HOURS XBYTE[0xfe04]
#define RTC_HOURS_ALARM XBYTE[0xfe05]
#define RTC_DAYS XBYTE[0xfe07]
#define RTC_MONTHS XBYTE[0xfe08]
#define RTC_YEARS XBYTE[0xfe09]
#define DSA XBYTE[0xfe0a] //DS12887 register A
#define DSB XBYTE[0xfe0b]
#define DSC XBYTE[0xfe0c]
#define DSD XBYTE[0xfe0d]
sbit RTC_CS=P2^0;
bit Init_RTC(void);
bit Second_Interrupt(void);
unsigned char Read_RTC(unsigned char);
void Write_RTC(unsigned char,unsigned char);
/////////////////////////////////////////
// 实现部分 RTC.C
////////////////////////////////////////
#include <reg52.h>
#include<absacc.h>
#include<RTC.h>
unsigned char Read_RTC(unsigned char option)
{
switch(option)
{
case YEAR_IN_RTC:return(RTC_YEARS);break;
case MONTH_IN_RTC:return(RTC_MONTHS);break;
case DAY_IN_RTC:return(RTC_DAYS);break;
case HOUR_IN_RTC:return(RTC_HOURS);break;
case MINUTE_IN_RTC:return(RTC_MINUTES);break;
case SECOND_IN_RTC:return(RTC_SECONDS);break;
}
}
void Write_RTC(unsigned char option,unsigned char j)
{
switch(option)
{
case YEAR_IN_RTC:RTC_YEARS=j;break;
case MONTH_IN_RTC:RTC_MONTHS=j;break;
case DAY_IN_RTC:RTC_DAYS=j;break;
case HOUR_IN_RTC:RTC_HOURS=j;break;
case MINUTE_IN_RTC:RTC_MINUTES=j;break;
case SECOND_IN_RTC:RTC_SECONDS=j;break;
case SECOND_ALARM_IN_RTC:RTC_SECONDS_ALARM=j;break;
case MINUTE_ALARM_IN_RTC:RTC_MINUTES_ALARM=j;break;
case HOUR_ALARM_IN_RTC:RTC_HOURS_ALARM=j;break;
}
}
bit Second_Interrupt(void)
{
if( (DSC&0x20)==0x20 )return(1);
return(0);
}
/* initialize DS12887 */
bit Init_RTC(void)
{
DSA=0x20;
DSB=0x72; //SET=0,*IE=disenable,SQW=disenable ,BCD,NO DSE
DSC=0x00;
ACC=DSD;
//every second interrupt
Write_RTC(HOUR_ALARM_IN_RTC,0xff);
Write_RTC(MINUTE_ALARM_IN_RTC,0xff);
Write_RTC(SECOND_ALARM_IN_RTC,0xff);
//if(ACC&0x80)return(0); //when low bat return 0
//return(1);
/* DSB=0x82; //set SET=1
RTC_HOURS=0x23;
RTC_MINUTES=0x12;
RTC_SECONDS=0x30;
DSB=0x02;
*/
return(1);
}
#include<reg52.h>
#include<intrins.h>
#define time_1 10
sbit DATA2=P2^6;
sbit CLKPIN=P2^5;
sbit JUNJIE=P2^7;
unsigned char data l_data[5]; //用户自定义LCD缓冲区
unsigned char dis[4];
unsigned char d[4]={0,0,0,0};
void delay(unsigned int t) // 延时子程序
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<114;j++)
;
}
//主函数之前是与显示相关的程序,等待调用
unsigned char led_seg(unsigned char i)
{
unsigned char tem;
switch(i)
{
case 0: tem=0x88;break;
case 1: tem=0xbb;break;
case 2: tem=0xc1;break;
case 3: tem=0x91;break;
case 4: tem=0xb2;break;
case 5: tem=0x94;break;
case 6: tem=0x84;break;
case 7: tem=0xb9;break;
case 8: tem=0x80;break;
case 9: tem=0x90;break;
default:break;
}
return tem;
}
void lcdwbit2(bit n2) //低位
{ DATA2 = n2;
CLKPIN = 1;
CLKPIN = 0;
CLKPIN = 1;
}
void lcdwd2(unsigned char data2) //低位
{ unsigned char i;
//data2=~data2; //数据取反
for(i=0;i<8;i++)
{ if((data2&0x01)==0x01)
lcdwbit2(1);
else
lcdwbit2(0);
data2>>=1;
}
}
void l_setd()
{
unsigned char i;
l_data[1]=0xff;
for(i=2;i<6;i++)
{ l_data[i]=led_seg(dis[i-2]); }
l_data[4]=l_data[4]&0x7f;
}
void lcdwdd() //低位
{ unsigned char i;
for(i=0;i<5;i++)
lcdwd2(l_data[i+1]);
}
void xianshi(unsigned long dd)
{
int j;
for(j=0;j<8;j++)
{ d[j]=dd%10; dd=dd/10; }
//开始显示
while(1)
{
dis[0]=d[3];
dis[1]=d[2];
dis[2]=d[1];
dis[3]=d[0];
l_setd(); lcdwdd(); delay(time_1); //低4位显示
}
}
void main()
{
JUNJIE=0;
xianshi(4321);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -