专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
TI
msp430驱动DS12C887读了C寄存器后依旧无法复位
2019-07-15 15:58
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
7465
8
1337
问题是这样的,DS12C887设置为有脉冲输出作为测试信号,主要的是想要IRQ信号,来回复位。每500ms产生一次周期中断。那么,主程序中,在中断函数中,读取了C寄存器的值,但是IRQ依旧无法复位。也尝试更改了ds12c887中的SET
ti
ME和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 编辑
加载中...
1
2
下一页
一周热门
更多
>
相关问题
CPLD的方波输出
4 个回答
11个版本Quartus II 软件下载,安装包网盘合集,附教程,47G!
20 个回答
请大家帮忙到21IC发展大家谈支持我申请新版面
20 个回答
【通知】21ic中国电子网服务条款 (所有人员必读)
1 个回答
满载而归乙亥年,大展鸿途庚子年---集签赢好礼
20 个回答
携手ADI,踏上电子工程师之巅—车辆电气化视频,答题领奖!
1 个回答
如何提升论坛质量,看你了!
20 个回答
【最终名单】二姨家喊你来拿100份新年大礼啦~
20 个回答
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
TI
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#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小时制
}
一周热门 更多>