程序如下:
#include<msp430x14x.h>
#include "cry1602.h"
#include "cry1602.c"
unsigned char big[]="abcdefghijklmnopqrstuvwxyz";
unsigned char small[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void main(void)
{
P1DIR=0xff;P1OUT=0xff;
P2DIR=0xff;P2OUT=0xff;
P3DIR=0xff;P3OUT=0xff;
P4DIR=0xff;P4OUT=0xff;
P5DIR=0xff;P5OUT=0xff;
P6DIR=0xff;P6OUT=0xff;
unsigned char i;
P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换
WDTCTL=WDT_ADLY_1000; //间隔定时器,定时1000ms
LcdReset();
DispStr(0,0,big);
for(i = 0; i < 3; i++) //延时2s
{
IFG1 &= ~WDTIFG;
while(!(IFG1 & WDTIFG));
IFG1 &= ~WDTIFG;
}
LcdWriteCommand(0x01,1);
DispNChar(0,0,26,small);
}
黑体部分的延时是如何做到的???,IFG1宏定义的值是多少,为何我在msp430x14x.h的的头文件里看的好像不对的,是0x0002u???还请各位赐教!!
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
The WDT+ interrupt flag, WDTIFG, located in IFG1.0。说明了看门狗的中断标志位叫做WDTIFG位于IFG1寄存器的第0位。
When using the WDT+ in interval timer mode, the WDTIFG flag is set after the selected time interval and requests a WDT+ interval timer interrupt if the WDTIE and the GIE bits are set。说明这个标志位在在周期定时模式且看门狗中断与全局中断开的时候,只要定时时间到就会将标志位置一。
再说程序的事,上面WDTCTL=WDT_ADLY_1000完成设置,定时器间隔为1s。延时程序首先清标志位,然后等到标志位置一,就过去了1s并把标志位清0(有点重复?)。循环两次就是2s,你那个应该是3秒。
IFG1是寄存器,0X0002U是IFG1_。下面IFG1又通过宏U0IFG进行了重定义,所以你应该看宏U0IFG的定义。
首先很感谢您的回复,我想您在学习的时候肯定也会遇到就算是看书看N遍也不明白的地方。
接着您的回复我有几个疑问:
1.首先,先说IFG1吧,我截了个图在下面,您说IFG1通过宏U0IFG进行了重定义,这个我看到了,但后面并没有在另外定义值是多少,我截了个图在下面,上电后IFG1初始值第0位和4位都是0,其余位用作其他用途,但我想一开始IFG1肯定会有一个初始值的吧,我想的对吗???2.这是我对程序的理解,不知道这几步的注释对不对还请帮忙看下:
for(i = 0; i < 3; i++)
{
IFG1 &= ~WDTIFG; //IFG1原本为0,但启用了看门狗定是间隔器第0位变1,所以WDTIFG为0x01,这一步将IFG1第0位置0,其余位不变
while(!(IFG1 & WDTIFG)); //等待IFG1的第0位置0
IFG1 &= ~WDTIFG; //将IFG1第0位置1,也就是这一步IFG1为1时后会引起上面的1s的延时是吧
}
3.上面这个延时函数应该是2s的,我在开发板实验了几次,分别将for语句中的i<3,分别试了1,2,3,为1的时候时间特别短估计0.5s吧,闪的特别快,为2的时侯差不多1s,3的时候差不多2s,按照您的说法3次应该延时3s,但这确实没有3s,如果您不信我可以把原程序发给您试一下。
一周热门 更多>