#include <lcd.h>
#include <msp430f5529.h>
#include <string.h>
unsigned char Range[]= " maxD: 50 M ";
unsigned char distance[] = "distance:";
unsigned char ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
uint lastCCR1;
unsigned int t=0;
unsigned long S=0;
unsigned char disbuff[4] = {0,0,0,0};
void delayms(unsigned int m)
{
unsigned int i, j;
for(i=0; i<m; i++)
for(j=0; j<1000; j++);
}
void Conut(void)
{
S=(t*1.7)/100; //算出來是CM
if((S>=700)) //超出測量范圍顯示“-”
{
DisplayOneChar(10, 1, ASCII[11]);
DisplayOneChar(11, 1, ASCII[10]); //顯示點
DisplayOneChar(12, 1, ASCII[11]);
DisplayOneChar(13, 1, ASCII[11]);
DisplayOneChar(14, 1, ASCII[12]); //顯示M
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%100%10;
DisplayOneChar(10, 1, ASCII[disbuff[0]]);
DisplayOneChar(11, 1, ASCII[10]); //顯示點
DisplayOneChar(12, 1, ASCII[disbuff[1]]);
DisplayOneChar(13, 1, ASCII[disbuff[2]]);
DisplayOneChar(14, 1, ASCII[12]); //顯示M
}
}
void StartModule() //啟動模塊
{
uint i;
P6OUT|=BIT0 ; //啟動一次模塊
__delay_cycles(20); //20個機器周期,20μs
P6OUT&=~BIT0 ;
}
void Initclock()
{
UCSCTL3 = SELREF_2;//FLL參考時鐘源REFO
UCSCTL4 |= SELA_2; //先設置ACLK為REFO
//測試晶振是否失效,并清除故障失效標志位
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
//清除XT2、XT1、DCO故障失效標志位
SFRIFG1 &= ~OFIFG; //清除晶振故障失效中斷標志位
}while (SFRIFG1&OFIFG); //測試晶振故障失效中斷標志位
__bis_SR_register(SCG0); //關閉FLL
UCSCTL1 = DCORSEL_5; //選擇DCO的工作頻率范圍
UCSCTL2 |= 249; //(259+1)*32768 = 8Mhz
__bic_SR_register(SCG0); //啟用FLL
__delay_cycles(2500000); //延時,等待DCO工作穩定
UCSCTL4 |=SELM_3 + SELS_3; //主時鐘、子時鐘均配置為dcoclk
UCSCTL5 |=DIVM_3 + DIVS_3; //主時鐘、子時鐘8分頻
}
void SetTIMEA()
{
t=0;
lastCCR1=0;
TA0CTL = CM_3+TACLR+TASSEL_2+ID_2+MC_2+TAIE; //計數清0,選子系統時鐘做時鐘源,連續計數模式,定時器允許中斷
}
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
P6DIR|=BIT0;
P1DIR&=~BIT2;
P1SEL|=BIT2;
Initclock();
P6OUT&=~BIT0 ;
InitLcd1602();
SetTIMEA();
TA0CCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改為上升沿捕獲
LcdShowStr(2,0,Range);
LcdShowStr(0,1,distance);
_EINT();
while(1)
{
StartModule();
Conut();
delayms(10);
}
}
#pragma vector = TIMER0_A1_VECTOR //CCR1捕獲產生中斷
__interrupt void TIMER0_A1__ISR(void)
{
TA0CCTL1&=~CCIFG;//中斷標志清零
switch(__even_in_range(TA0IV,14))
{
case 0:
break;
case 2: //CCR1捕獲中斷
if(P1IN&BIT2==1)
{
lastCCR1 = TA0CCR1;
TA0CCTL1 = CAP+CM_2+CCIS_0+SCS+CCIE;//改為下降沿捕獲
}
else
{
_DINT(); //關閉全局中斷
t=TA0CCR1-lastCCR1;
TA0CCR1 = 0;
TA0CCTL1= CAP+CM_1+CCIS_0+SCS+CCIE;//改為上升沿捕獲
_EINT();
}
break;
case 4:
break;
case 6:
break;
case 8:
break;
case 0x0A:
break;
case 0x0C:
break;
case 0x0E: //定時器溢出中斷
if(TA0CCTL1&COV)
TA0CCTL1&=~COV;
break;
default:
break;
}
}
|