#include"DS12C887.h"
#include"NixieLight.h"
unsigned int hour1; //用于存储小时的第一位
unsigned int hour2; //用于存储小时的第二位
unsigned int minute1;//用于存储分钟的第一位
unsigned int minute2;//用于存储分钟的第二位
extern struct SYSTEMTIME SetDS12C887Time;//声明两个在DS12C887.c中定义的结构体变量
extern struct SYSTEMTIME ReadDS12C887Time;
extern struct ALARM Alarm;//声明在DS12C887.c中定义的结构体变量
void Delay(unsigned int aa)
{
for(unsigned int i=0;i
for(unsigned int j=0;j<100;j++);
}
void DisplayTime()
{
AllCOM_OFF;
if(hour1==0) P4OUT=0x00; //消隐
else P4OUT=Nixielight_Tab[hour1]; //第一位显示
COM1_ON;
Delay(8);
AllCOM_OFF;
P4OUT=Nixielight_Tab[hour2]; //第二位显示
COM2_ON;
Delay(8);
AllCOM_OFF;
P4OUT=Nixielight_Tab[minute1]; //第三位显示
COM3_ON;
Delay(8);
AllCOM_OFF;
P4OUT=Nixielight_Tab[minute2]; //第四位显示
COM4_ON;
Delay(8);
}
void main()
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P4DIR |= 0xff; //P4口控制数码管的7个段,所以提前设置为输出
P3DIR |= 0xff; //P3口控制数码管的4个位选通,所以提前设置为输出
P3OUT&=0x00;
P3OUT|=(BIT4+BIT5);
P1DIR |= BIT0+BIT1+BIT2+BIT3; //P1口的低4位控制DS12C887的DS、AS、CS和R/W,提前设置为输出
//---------------------I/O口接收来自DS12C887的中断---------------------------
P1DIR &= ~BIT4; //P1.4为输入
P1IES |= BIT4; //下降沿触发
P1IE |= BIT4; //使能P1.4中断
_EINT(); //使能总中断
//--------------------------------------------------------------------------//
//----------------------------时钟有关程序-----------------------------------
SetDS12C887Time.Second=0x00;
SetDS12C887Time.Minute=0x00;
SetDS12C887Time.Hour=0x17;
SetDS12C887Time.Week=0x01;
SetDS12C887Time.Day=0x05;
SetDS12C887Time.Month=0x0C;
SetDS12C887Time.Year=0x10;
//Alarm.Second=0x05; //10S产生一次中断,在中断服务程序中读取时间
//Alarm.Minute=0xFE;
//Alarm.Hour=0xFF;
DS12C887_Init();
SetTime();
//SetAlarm();
//--------------------------------------------------------------------------//
while(1)
{
/* GetTime();
hour1=ReadDS12C887Time.Hour/10;
hour2=ReadDS12C887Time.Hour%10;
minute1=ReadDS12C887Time.Minute/10;
minute2=ReadDS12C887Time.Minute%10;*/
DisplayTime();
}
}
//在I/O口中断程序中,读取时间值,清除中断标志,并转换为数码管要显示的数字
#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)
{
if(P1IFG&BIT4)
{
P3OUT^=0x30;
GetTime();
ReadData(0x0C); //读C寄存器,清除DS12C887中断标志
// _NOP();
}
hour1=ReadDS12C887Time.Hour/10;
hour2=ReadDS12C887Time.Hour%10;
minute1=ReadDS12C887Time.Minute/10;
minute2=ReadDS12C887Time.Minute%10;
P1IFG=0; //清除I/O口中断标志
return;
}
#include"DS12C887.h"
struct SYSTEMTIME SetDS12C887Time;//定义两个结构体变量,用于设置和读取时间
struct SYSTEMTIME ReadDS12C887Time;
struct ALARM Alarm;//定义闹钟变量,用于产生闹钟中断,在中断程序中读取时间
void WriteData(unsigned char address,unsigned char data)
{
DATA_OUT;
OutData=0x00; //先将地址清零
_NOP();
OutData=address;//送地址
//以下程序严格按照数据手册上时序图编写,请对照数据手册看程序
RW_SetHigh;
CS_SetHigh;
DS_SetHigh;
_NOP();
AS_SetHigh;
CS_SetLow;
_NOP();
AS_SetLow;
_NOP();
RW_SetLow;
OutData=data;
_NOP();
RW_SetHigh;
_NOP();
CS_SetHigh;
_NOP();
AS_SetHigh;
}
unsigned char ReadData(unsigned char address)
{
unsigned char data;
DATA_OUT;
OutData=0x00; //先将地址清零
_NOP();
OutData=address;//送地址
//以下程序严格按照数据手册上时序图编写,请对照数据手册看程序
RW_SetHigh;
CS_SetHigh;
DS_SetHigh;
_NOP();
AS_SetHigh;
CS_SetLow;
_NOP();
AS_SetLow;
_NOP();
DS_SetLow;
_NOP();
DATA_IN;
data=InData;
_NOP();
DS_SetHigh;
_NOP();
CS_SetHigh;
_NOP();
AS_SetHigh;
return(data);
}
void DS12C887_Init()
{
WriteData(0x0A,0x2F); //打开振荡器,开始计时
WriteData(0x0B,0x4E); //正常更新,使能更新中断,二进制码格式,24小时制
}
void SetTime()
{
WriteData(0x0B,0xCE); //禁止更新
WriteData(DS12C887_Second,SetDS12C887Time.Second);
WriteData(DS12C887_Minute,SetDS12C887Time.Minute);
WriteData(DS12C887_Hour,SetDS12C887Time.Hour);
WriteData(DS12C887_Week,SetDS12C887Time.Week);
WriteData(DS12C887_Day,SetDS12C887Time.Day);
WriteData(DS12C887_Month,SetDS12C887Time.Month);
WriteData(DS12C887_Year,SetDS12C887Time.Year);
WriteData(0x0B,0x4E); //正常更新,使能更新中断,二进制码格式,24小时制
}
void SetAlarm()
{
WriteData(0x0B,0x96); //禁止更新
WriteData(DS12C887_SecondAlarm,Alarm.Second);
WriteData(DS12C887_MinuteAlarm,Alarm.Minute);
WriteData(DS12C887_HourAlarm,Alarm.Hour);
WriteData(0x0B,0x16); //正常更新,使能更新中断,二进制码格式,24小时制
}
void GetTime()
{
WriteData(0x0B,0xCE); //禁止更新
//ReadDS12C887Time.Second=ReadData(DS12C887_Second);
ReadDS12C887Time.Minute=ReadData(DS12C887_Minute);
ReadDS12C887Time.Hour=ReadData(DS12C887_Hour);
//ReadDS12C887Time.Week=ReadData(DS12C887_Week);
//ReadDS12C887Time.Day=ReadData(DS12C887_Day);
//ReadDS12C887Time.Month=ReadData(DS12C887_Month);
//ReadDS12C887Time.Year=ReadData(DS12C887_Year);
WriteData(0x0B,0x4E); //正常更新,使能更新中断,二进制码格式,24小时制
}
#include"DS12C887.h"
#include"NixieLight.h"
unsigned int hour1; //用于存储小时的第一位
unsigned int hour2; //用于存储小时的第二位
unsigned int minute1;//用于存储分钟的第一位
unsigned int minute2;//用于存储分钟的第二位
extern struct SYSTEMTIME SetDS12C887Time;//声明两个在DS12C887.c中定义的结构体变量
extern struct SYSTEMTIME ReadDS12C887Time;
extern struct ALARM Alarm;//声明在DS12C887.c中定义的结构体变量
void Delay(unsigned int aa)
{
for(unsigned int i=0;i
for(unsigned int j=0;j<100;j++);
}
void DisplayTime()
{
AllCOM_OFF;
if(hour1==0) P4OUT=0x00; //消隐
else P4OUT=Nixielight_Tab[hour1]; //第一位显示
COM1_ON;
Delay(8);
AllCOM_OFF;
P4OUT=Nixielight_Tab[hour2]; //第二位显示
COM2_ON;
Delay(8);
AllCOM_OFF;
P4OUT=Nixielight_Tab[minute1]; //第三位显示
COM3_ON;
Delay(8);
AllCOM_OFF;
P4OUT=Nixielight_Tab[minute2]; //第四位显示
COM4_ON;
Delay(8);
}
void main()
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P4DIR |= 0xff; //P4口控制数码管的7个段,所以提前设置为输出
P3DIR |= 0xff; //P3口控制数码管的4个位选通,所以提前设置为输出
P3OUT&=0x00;
P3OUT|=(BIT4+BIT5);
P1DIR |= BIT0+BIT1+BIT2+BIT3; //P1口的低4位控制DS12C887的DS、AS、CS和R/W,提前设置为输出
//---------------------I/O口接收来自DS12C887的中断---------------------------
P1DIR &= ~BIT4; //P1.4为输入
P1IES |= BIT4; //下降沿触发
P1IE |= BIT4; //使能P1.4中断
_EINT(); //使能总中断
//--------------------------------------------------------------------------//
//----------------------------时钟有关程序-----------------------------------
SetDS12C887Time.Second=0x00;
SetDS12C887Time.Minute=0x00;
SetDS12C887Time.Hour=0x17;
SetDS12C887Time.Week=0x01;
SetDS12C887Time.Day=0x05;
SetDS12C887Time.Month=0x0C;
SetDS12C887Time.Year=0x10;
//Alarm.Second=0x05; //10S产生一次中断,在中断服务程序中读取时间
//Alarm.Minute=0xFE;
//Alarm.Hour=0xFF;
DS12C887_Init();
SetTime();
//SetAlarm();
//--------------------------------------------------------------------------//
while(1)
{
/* GetTime();
hour1=ReadDS12C887Time.Hour/10;
hour2=ReadDS12C887Time.Hour%10;
minute1=ReadDS12C887Time.Minute/10;
minute2=ReadDS12C887Time.Minute%10;*/
DisplayTime();
}
}
//在I/O口中断程序中,读取时间值,清除中断标志,并转换为数码管要显示的数字
#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)
{
if(P1IFG&BIT4)
{
P3OUT^=0x30;
GetTime();
ReadData(0x0C); //读C寄存器,清除DS12C887中断标志
// _NOP();
}
hour1=ReadDS12C887Time.Hour/10;
hour2=ReadDS12C887Time.Hour%10;
minute1=ReadDS12C887Time.Minute/10;
minute2=ReadDS12C887Time.Minute%10;
P1IFG=0; //清除I/O口中断标志
return;
}
#include"DS12C887.h"
struct SYSTEMTIME SetDS12C887Time;//定义两个结构体变量,用于设置和读取时间
struct SYSTEMTIME ReadDS12C887Time;
struct ALARM Alarm;//定义闹钟变量,用于产生闹钟中断,在中断程序中读取时间
void WriteData(unsigned char address,unsigned char data)
{
DATA_OUT;
OutData=0x00; //先将地址清零
_NOP();
OutData=address;//送地址
//以下程序严格按照数据手册上时序图编写,请对照数据手册看程序
RW_SetHigh;
CS_SetHigh;
DS_SetHigh;
_NOP();
AS_SetHigh;
CS_SetLow;
_NOP();
AS_SetLow;
_NOP();
RW_SetLow;
OutData=data;
_NOP();
RW_SetHigh;
_NOP();
CS_SetHigh;
_NOP();
AS_SetHigh;
}
unsigned char ReadData(unsigned char address)
{
unsigned char data;
DATA_OUT;
OutData=0x00; //先将地址清零
_NOP();
OutData=address;//送地址
//以下程序严格按照数据手册上时序图编写,请对照数据手册看程序
RW_SetHigh;
CS_SetHigh;
DS_SetHigh;
_NOP();
AS_SetHigh;
CS_SetLow;
_NOP();
AS_SetLow;
_NOP();
DS_SetLow;
_NOP();
DATA_IN;
data=InData;
_NOP();
DS_SetHigh;
_NOP();
CS_SetHigh;
_NOP();
AS_SetHigh;
return(data);
}
void DS12C887_Init()
{
WriteData(0x0A,0x2F); //打开振荡器,开始计时
WriteData(0x0B,0x4E); //正常更新,使能更新中断,二进制码格式,24小时制
}
void SetTime()
{
WriteData(0x0B,0xCE); //禁止更新
WriteData(DS12C887_Second,SetDS12C887Time.Second);
WriteData(DS12C887_Minute,SetDS12C887Time.Minute);
WriteData(DS12C887_Hour,SetDS12C887Time.Hour);
WriteData(DS12C887_Week,SetDS12C887Time.Week);
WriteData(DS12C887_Day,SetDS12C887Time.Day);
WriteData(DS12C887_Month,SetDS12C887Time.Month);
WriteData(DS12C887_Year,SetDS12C887Time.Year);
WriteData(0x0B,0x4E); //正常更新,使能更新中断,二进制码格式,24小时制
}
void SetAlarm()
{
WriteData(0x0B,0x96); //禁止更新
WriteData(DS12C887_SecondAlarm,Alarm.Second);
WriteData(DS12C887_MinuteAlarm,Alarm.Minute);
WriteData(DS12C887_HourAlarm,Alarm.Hour);
WriteData(0x0B,0x16); //正常更新,使能更新中断,二进制码格式,24小时制
}
void GetTime()
{
WriteData(0x0B,0xCE); //禁止更新
//ReadDS12C887Time.Second=ReadData(DS12C887_Second);
ReadDS12C887Time.Minute=ReadData(DS12C887_Minute);
ReadDS12C887Time.Hour=ReadData(DS12C887_Hour);
//ReadDS12C887Time.Week=ReadData(DS12C887_Week);
//ReadDS12C887Time.Day=ReadData(DS12C887_Day);
//ReadDS12C887Time.Month=ReadData(DS12C887_Month);
//ReadDS12C887Time.Year=ReadData(DS12C887_Year);
WriteData(0x0B,0x4E); //正常更新,使能更新中断,二进制码格式,24小时制
}
举报