本帖最后由 stirwl 于 2011-3-26 22:32 编辑
看门狗关了,程序会重复的执行主函数,
天呐,这到底是为什么啊???
#include<msp430x16x.h>
#include<string.h>
#define STCS P3OUT|=0x01
#define STSTD P3OUT|=0x02
#define STSCLK P3OUT|=0x04
#define CLCS P3OUT&=0xfe
#define CLSTD P3OUT&=0xfd
#define CLSCLK P3OUT&=0xfb
char show[16]=" Hz";
unsigned freq;
void delay1ms()
{
int i;
for(i=0;i<8000;i++);
}
void delaynms(int n)
{
int i;
for(i=0;i<n;i++) delay1ms();
}
void num2str(unsigned num)
{
int i;
show[0]=num/10000+48;
num%=10000;
show[1]=num/1000+48;
num%=1000;
show[2]=num/100+48;
num%=100;
show[3]=num/10+48;
show[4]=num%10+48;
for(i=0;show=='0'&&i<5;i++) show=' ';
if(show[0]==' '&&show[1]==' ')
{
// for(i=0;show==' ';i++);
// for(j=0;i<5;i++,j++) show[j]=show;
show[6]='K';
}
else
{
for(i=5;i>2;i--) show=show[i-1];
show[2]='.';
show[6]='M';
}
}
void sendbyte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byte&0x80) {_NOP();STSTD;}
else {_NOP();CLSTD;}
_NOP();
STSCLK;
_NOP();
CLSCLK;
byte=byte<<1;
}
}
void write(unsigned char start,unsigned char data)//0写指令,1写数据
{
unsigned char hdata,ldata;
if(start) start=0xfa;
else start=0xf8;
sendbyte(start);
hdata=data&0xf0;
sendbyte(hdata);
ldata=(data<<4)&0xf0;
sendbyte(ldata);
}
void writedatas(char show[16])
{
int i,n=strlen(show);
for(i=0;i<n;i++) write(1,show);
}
void lcdinit(void)
{
STCS;
delaynms(40);
write(0,0x30);
delay1ms();
write(0,0x30);
delay1ms();
write(0,0x0c);
delay1ms();
write(0,0x01);
delaynms(10);
write(0,0x06);
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P3DIR=0Xff;//0,1,2 12864液晶控制端 CS STD SCLK
P3OUT=0;
P4DIR=0;
P4SEL=0x80;
BCSCTL1=0x07;
while(IFG1&OFIFG)
{
IFG1 &= ~OFIFG;
delay1ms();
}
BCSCTL2=0x08;//T=0.125us
TACTL=0x02d2;//timera时钟配置,1M,T=1us
TACCTL0=OUTMOD_2+CCIE;//此控制位待定
TACCR0=0;//10ms,10000
TBCTL=0x0020;
TBCCR0=0;
lcdinit();
write(0,0x80);
writedatas("输入信号频率:");
write(0,0x88);
TACCR0=10000;
_BIS_SR(LPM0_bits+GIE);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void timer_a(void)
{
freq=TBR/5;//KHz
num2str(freq);
writedatas(show);
write(0,0x88);
TBCCR0=0;
TBR=0;
TBCCR0=0xffff;
TACCR0=10000;
}
找到原因了,是堆栈溢出,但我把timera程序屏蔽,然在main后放个wile(1);程序也会莫名其妙的堆栈溢出??? |