/****************主函數(shù)****************/
void main(void)
{
uint i;
/*下面六行程序關閉所有的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; //關閉看門狗
P6DIR |= BIT2;P6OUT &= ~BIT2; //打開電平轉(zhuǎn)換
P2DIR |= BIT3;P2OUT &= ~BIT3; //電平轉(zhuǎn)換方向3.3V--->5V
P5DIR = 0xff;
P5OUT = 0xff;
/*------選擇系統(tǒng)主時鐘為8MHz-------*/
BCSCTL1 &= ~XT2OFF; //打開XT2高頻晶體振蕩器
do
{
IFG1 &= ~OFIFG; //清除晶振失敗標志
for (i = 0xFF; i > 0; i--); //等待8MHz晶體起振
}
while ((IFG1 & OFIFG)); //晶振失效標志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK選擇高頻晶振
/*------選擇系統(tǒng)主時鐘為8MHz-------*/
P3DIR |= 0X07;
P4DIR |= 0XFF;
LCD_init();
set_pos(0,6);
LCD_write_data('W');
LCD_write_data('T');
LCD_write_data('F');
P2DIR |= BIT0; //設置P2.0為輸出
P1SEL |= BIT2; //設置P1.2端口為功能模塊使用
P1DIR &=~ BIT2;
P1IFG = 0;
TACTL = TASSEL1+TACLR+TAIE+MC1; //定時器A時鐘信號選擇SMCLK,同時設置定時器A計數(shù)模式為連續(xù)增計模式
CCTL1 = MC0+SCS+CAP+CCIE; //輸入上升沿捕獲,CCI0A為捕獲信號源
start = 1;
disp_m = 1;
end = 1;
overflow = 0;
show_falg = 0;
_EINT();
while(1)
{
P2OUT |= BIT0;
delay(160); //給Trig一個啟動脈沖
P2OUT &=~ BIT0;
while(show_falg); //等待 Echo的 下降沿
show(); //更新顯示
}
}
#pragma vector=TIMERA1_VECTOR //定時器A中斷處理
__interrupt void timer_a(void)
{
switch(TAIV) //向量查詢
{ case 2: //捕獲中斷
if(CCTL1&CM0) //上升沿
{
CCTL1=(CCTL1&(~CM0))|CM1; //更變設置為下降沿觸發(fā)
start=TAR; //記錄初始時間
overflow=0; //溢出計數(shù)變量復位
}
else if (CCTL1&CM1) //下降沿
{
CCTL1=(CCTL1&(~CM1))|CM0; //更變設置為上升沿觸發(fā)
end=TAR; //用start,end,overflow計算脈沖寬度
show_falg = 1; //打開顯示計算處理程序
}
break;
case 10: //定時器溢出中斷
overflow++;
break; //溢出計數(shù)加1
default:break;
}
}
|