以下是超声测距的程序,大神们能解释一下,其中测距部分的语句么?应该是这部分吧,求解释
//#pragma vector=PORT1_VECTOR
__interrupt void port1_int(void)
{
if((P1IN&BIT5)==BIT5)
{
TACTL|=MC_1+TACLR;
P1IES|=BIT5;
}
else
{
TACTL&=~MC_3;
P1IES&=~BIT5;
distance=TAR*5/3;
//P2OUT=TAR;
}
P1IFG&=~BIT5;
}
//
#include "msp430f149.h"
#define uint unsigned int
#define uchar unsigned char
/**************宏定义***************/
#define DataDir P2DIR
#define DataPort P2OUT
#define Busy 0x80
#define CtrlDir P6DIR
#define CLR_RS P6OUT&=~BIT3; //RS = P6.3
#define SET_RS P6OUT|=BIT3;
#define CLR_RW P6OUT&=~BIT4; //RW = P6.4
#define SET_RW P6OUT|=BIT4;
#define CLR_EN P6OUT&=~BIT5; //EN = P6.5
#define SET_EN P6OUT|=BIT5;
// Trig-->P1.0 Echo-->P1.1 下载时断开P1.1口,下载后在连接P1.1
void DispStr(unsigned char x,unsigned char y,unsigned char *ptr);
void DispNChar(unsigned char x,unsigned char y, unsigned char n,unsigned char *ptr);
void LocateXY(unsigned char x,unsigned char y);
void Disp1Char(unsigned char x,unsigned char y,unsigned char data);
void LcdReset(void);
void LcdWriteCommand(unsigned char cmd,unsigned char chk);
void LcdWriteData( unsigned char data );
void WaitForEnable(void);
void Delay5ms(void);
void timeinit();
void delay(uint y);
long static uint distance;
uchar table[]={"Distance:"};
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR|=BIT4;
P2DIR=0XFF;
timeinit();
LcdReset();
P1IE=BIT5;
P1IES&=~BIT5; //上升沿触发
DispNChar(0,0, 9,table);
while(1)
{
P1OUT|=BIT4;
delay(1);
P1OUT&=~BIT4;
// delay(10);
Disp1Char(2,1,(distance/100000)%10+0x30);
Disp1Char(3,1,(distance/10000)%10+0x30);
Disp1Char(4,1,(distance/1000)%10+0x30);
Disp1Char(5,1,(distance/100)%10+0x30);
Disp1Char(6,1,'.');
Disp1Char(7,1,(distance/10)%10+0x30);
Disp1Char(8,1,distance%10+0x30);
Disp1Char(9,1,'c');
Disp1Char(10,1,'m');
}
}
void timeinit()
{
TACTL=TASSEL_2+ID_3+MC_1; //ID_2表示八分频! MC_1表示连续计数模式!
BCSCTL2=0x88; //选择SMCLK的信号源XT2CLK(8MHz)
CCR0=65535;
_EINT(); //打开总中断!
}
#pragma vector=PORT1_VECTOR
__interrupt void port1_int(void)
{
if((P1IN&BIT5)==BIT5)
{
TACTL|=MC_1+TACLR;
P1IES|=BIT5;
}
else
{
TACTL&=~MC_3;
P1IES&=~BIT5;
distance=TAR*5/3;
//P2OUT=TAR;
}
P1IFG&=~BIT5;
}
void delay(uint y)
{
uint x;
for(;y>0;y--)
for(x=100;x>0;x--); //用8MHz的总频率!!!
}
/***********************************************
函数名称:DispStr
功 能:让液晶从某个位置起连续显示一个字符串
参 数:x--位置的列坐标
y--位置的行坐标
ptr--指向字符串存放位置的指针
***********************************************/
void DispStr(uchar x,uchar y,uchar *ptr)
{
uchar *temp;
uchar i,n = 0;
temp = ptr;
while(*ptr++ != '\0') n++; //计算字符串有效字符的个数
for (i=0;i<n;i++)
{
Disp1Char(x++,y,temp[i]);
if (x == 0x0f)
{
x = 0;
y ^= 1;
}
}
}
/*******************************************
函数名称:DispNchar
功 能:让液晶从某个位置起连续显示N个字符
参 数:x--位置的列坐标
y--位置的行坐标
n--字符个数
ptr--指向字符存放位置的指针
返回值 :无
********************************************/
void DispNChar(uchar x,uchar y, uchar n,uchar *ptr)
{
uchar i;
for (i=0;i<n;i++)
{
Disp1Char(x++,y,ptr[i]);
if (x == 0x0f)
{
x = 0;
y ^= 1;
}
}
}
/*******************************************
函数名称:LocateXY
功 能:向液晶输入显示字符位置的坐标信息
参 数:x--位置的列坐标
y--位置的行坐标
返回值 :无
********************************************/
void LocateXY(uchar x,uchar y)
{
uchar temp;
temp = x&0x0f;
y &= 0x01;
if(y) temp |= 0x40; //如果在第2行
temp |= 0x80;
LcdWriteCommand(temp,1);
}
/*******************************************
函数名称:Disp1Char
功 能:在某个位置显示一个字符
参 数:x--位置的列坐标
y--位置的行坐标
data--显示的字符数据
返回值 :无
********************************************/
void Disp1Char(uchar x,uchar y,uchar data)
{
LocateXY( x, y );
LcdWriteData( data );
}
/*******************************************
函数名称:LcdReset
功 能:对1602液晶模块进行复位操作
参 数:无
返回值 :无5
********************************************/
void LcdReset(void)
{
CtrlDir |= 0x38; //控制线端口设为输出状态
DataDir = 0xFF; //数据端口设为输出状态
LcdWriteCommand(0x38, 0); //规定的复位操作
Delay5ms();
LcdWriteCommand(0x38, 0);
Delay5ms();
LcdWriteCommand(0x38, 0);
Delay5ms();
LcdWriteCommand(0x38, 1); //显示模式设置
LcdWriteCommand(0x08, 1); //显示关闭
LcdWriteCommand(0x01, 1); //显示清屏
LcdWriteCommand(0x06, 1); //写字符时整体不移动
LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁
}
/*******************************************
函数名称:LcdWriteCommand
功 能:向液晶模块写入命令
参 数:cmd--命令,
chk--是否判忙的标志,1:判忙,0:不判
********************************************/
void LcdWriteCommand(uchar cmd,uchar chk)
{
if (chk) WaitForEnable(); // 检测忙信号?
CLR_RS;
CLR_RW;
_NOP();
DataPort = cmd; //将命令字写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
/*******************************************
函数名称:LcdWriteData
功 能:向液晶显示的当前地址写入显示数据
参 数:data--显示字符数据
********************************************/
void LcdWriteData( uchar data )
{
WaitForEnable(); //等待液晶不忙
SET_RS;
CLR_RW;
_NOP();
DataPort = data; //将显示数据写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
/*******************************************
函数名称:WaitForEnable
功 能:等待1602液晶完成内部操作
********************************************/
void WaitForEnable(void)
{
P2DIR &= 0x00; //将P4口切换为输入状态
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();
while((P2IN & Busy)!=0); //检测忙标志
CLR_EN;
P2DIR |= 0xFF; //将P4口切换为输出状态
}
/*******************************************
函数名称:Delay5ms
功 能:延时约5ms
********************************************/
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i--;
}
}
|
|