高级会员
- 积分
- 704
- 威望
- 460
- 贡献
- 182
- 兑换币
- 93
- 注册时间
- 2012-11-9
- 在线时间
- 31 小时
- 毕业学校
- 武汉科技大学
|
本帖最后由 yingxhgo 于 2013-8-18 17:02 编辑
MSP外部中断和用定时器来计数部分程序写出来有问题。。。
望前辈们赐教,不知道是我程序里面还缺点儿什么或者哪里不对。。。LZ已经很愁苦了。。。sigh
我觉得设置好定时器和IO部分(已红色标出)就应该能进中断能有输出了,但是没有a╮(╯_╰)╭
/***********************************************************
程序功能:在12864液晶上仅显示distance的数值,同时通过P2^0连接的led判断有没有进中断
-----------------------------------------------------------
----------------------------------------------------
测试说明:观察液晶显示
***********************************************************/
#include "msp430.h"
#include "cry12864.h"
#include "cry12864.C"
uint distance,start,end;
int z[5];
void delay(void)
{
int tmp;
for(tmp = 12000;tmp > 0;tmp--);
}
#pragma vector=TIMERA1_VECTOR //==定时器A中断处理==
__interrupt void timer_a(void)
{
switch(TAIV) //==向量查询==
{
case 2: //==捕获中断==
if(CCTL1&CM0) //==捕获到上升沿==
{
CCTL1=(CCTL1&(~CM0))|CM1; //==更变设置为下降沿触发==
start=TAR; //==记录初始时间==
P2OUT ^= BIT0;
delay();
}
else if (CCTL1&CM1) //==捕获到下降沿==
{
CCTL1=(CCTL1&(~CM1))|CM0; //==更变设置为上升沿触发==
end=TAR; //==用start,end,overflow计算脉冲宽度==
P2OUT ^= BIT0;
delay();
}
break;
default: break;
}
}
/***************************主函数*************************/
void main( void )
{
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF; P1OUT = 0XFF;
P2DIR = 0XFF; P2OUT = 0XFF;
P3DIR = 0XFF; P3OUT = 0XFF;
P4DIR = 0XFF; P4OUT = 0XFF;
P5DIR = 0XFF; P5OUT = 0XFF;
P6DIR = 0XFF; P6OUT = 0XFF;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
TACTL=TASSEL_1+ID_3+MC_1+TACLR+TAIE;//ID_3表示八分频 MC_1表示增计数模式
CCTL1=CM_1+SCS+CAP+CCIE;//上升沿+同步+CCI0A(P1.1信号源)+捕获功能+捕获中断允许
_EINT(); //开总中断允许
Ini_Lcd(); //初始化液晶
P1DIR&=~BIT1; // 方向寄存器设置为输入模式
P1SEL=BIT1; //设P1.1为功能模块使用,做捕获源,TA0功能
P2DIR|=BIT0; //P2^0设定为输出模式
distance=end-start;
z[0]=distance/10000;
z[1]=distance%10000/1000;
z[2]=distance%10000%1000/100;
z[3]=distance%10000%1000%100/10;
z[4]=distance%10000%1000%100%10;
Disp_SZ(0x80,z[0],1);
Disp_SZ(0x81,z[1],1);
Disp_SZ(0x82,z[2],1);
Disp_SZ(0x83,z[3],1);
Disp_SZ(0x84,z[4],1);
}
|
|