|
大神们帮忙看看哪错了。要不就是没显示,要不就是乱七八糟的。
#include
unsigned int time;
unsigned int i=0;
unsigned int f=0,cnt;
typedef unsigned char uchar;
#define wei_h P5OUT|= BIT5
#define wei_l P5OUT&= ~BIT5
#define duan_l P6OUT &= ~BIT6
#define duan_h P6OUT |= BIT6
//数码管7位段码:0--f
uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar res[8];
void main()
{
WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次
IE1 |= WDTIE; // 使能看门狗中断
P4SEL|=BIT0; //P4.0作为捕获模块功能的输入端输入方波
P6DIR |=BIT0;
P6OUT |=BIT0;
//-------开晶振XT2---------
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (i=256;i>0;i--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK=SMCLK为XT2
//-----------------------------
TBCCTL0&=~(CCIS1+CCIS0); // 捕获源为P4.0,即CCI0A(也是CCI0B)
TBCCTL0|=CM_2+SCS+CAP; //下降沿捕获,同步捕获,工作在捕获模式
TBCCTL0|=CCIE; //允许捕获比较模块提出中断请求
TBCTL|=ID_3;
TBCTL|=TBSSEL_2; //选择时钟MCLK
TBCTL|=TBCLR; //定时器清零,
//定时器开始计数(连续计数模式0~0xFFFF)
TBCTL|=MC_2;
_EINT();
f=1/(time*2);
while(f>0)
{
res[i++] = f%10;
f = f/10;
}
i = i - 1;
while(1)
{
}
}
//―――――定时器TB的CCR0的中断:用于检测脉冲上升与下降沿――――
#pragma vector=TIMERB0_VECTOR
__interrupt void TimerB0(void)
{
if(TBCCTL0&CM1) //捕获到下降沿
{
P6OUT |=BIT0;
TBCTL|=TBCLR;
TBCCTL0=(TBCCTL0&(~CM1))|CM0; //改为上升沿捕获:CM1置零,CM0置一
}
else if(TBCCTL0&CM0) //捕获到上升沿
{
P6OUT &=~(BIT0);
time=TBCCR0; //记录下结束时间
TBCCTL0=(TBCCTL0&(~CM0))|CM1; //改为下降沿捕获:CM0置零,CM1置一
if(i==10) i=0;
}
}
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
while(i>0){
P4OUT = scandata[(res[i--])]; //输出段选信号
duan_h;
duan_l;
P4OUT = ~(1 << cnt); //输出位选信号
wei_h;
wei_l;
cnt++;
if(cnt == 8) cnt = 0;
}
}
|
|