msp430驱动DS12C887读了C寄存器后依旧无法复位

2019-07-15 15:58发布

问题是这样的,DS12C887设置为有脉冲输出作为测试信号,主要的是想要IRQ信号,来回复位。每500ms产生一次周期中断。那么,主程序中,在中断函数中,读取了C寄存器的值,但是IRQ依旧无法复位。也尝试更改了ds12c887中的SETtiME和GETTIME,依旧还是不行。不知道怎么才能实现。
Desktop.rar 207.47 KB, 下载次数: 1
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
铭念
1楼-- · 2019-07-15 21:07
#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<aa;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小时制
}
铭念
2楼-- · 2019-07-15 23:13
本帖最后由 铭念 于 2016-12-6 10:46 编辑


铭念
3楼-- · 2019-07-15 23:49
 精彩回答 2  元偷偷看……
铭念
4楼-- · 2019-07-16 02:17
本帖最后由 铭念 于 2016-12-6 10:47 编辑


铭念
5楼-- · 2019-07-16 03:07
本帖最后由 铭念 于 2016-12-6 10:47 编辑


铭念
6楼-- · 2019-07-16 07:00
本帖最后由 铭念 于 2016-12-6 10:47 编辑


一周热门 更多>