[原创] 超声波1602液晶显示

panyixin   2012-9-24 17:27 楼主
超声波能准确测量距离但是1602显示的时候老是一闪一闪的,类似于1602清屏。。。。。。纯粹是程序问题,但是我看不出是什么原因,以下是我的程序,希忘高手们能帮我看看。。。。。。。。。
/**************************************
TA0 捕获CCI0A

********************************************/
#include
#include"cry1602.h"
#include"xiaoche.h"
#define  RISE  1
#define  FALL  0
unsigned int TA_Overflow_Cnt;//TA溢出次数存放变量
unsigned long int Period;//脉宽存放结果变量
unsigned long int S;
unsigned int distance;
unsigned int RiseCapVal;//上升沿时刻捕获值存放变量
unsigned char Edge=1;//当前触发沿
unsigned char table[]={"0123456789.M"};
unsigned char a=0,b=0,c=0;
/*******************************************
函数名称:Delay_1ms
功    能:延时约1ms的时间
参    数:无
返回值  :无
********************************************/
void Delay_1ms(void)
{
unsigned char i;
   
for(i =150;i > 0;i--)  _NOP();
}
/*******************************************
函数名称:Delay_Nms
功    能:延时N个1ms的时间
参    数:n--延时长度
返回值  :无
********************************************/
void Delay_Nms(unsigned int n)
{
    unsigned int i;
   
    for(i = n;i > 0;i--)    Delay_1ms();
}

//初始化系统时钟函数
void init_clk()
{
    unsigned char i;
    BCSCTL1&=~XT2OFF;//打开XT振荡器
    BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M  
    do
    {
      IFG1 &= ~OFIFG;//清除振荡错误标志
      for(i = 0; i < 0xff; i++)  _NOP();//延时等待
    }
    while ((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待
    IFG1&=~OFIFG;
}
//初始化定时器A函数
void init_timerA()
{
  TACTL   |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
  TACCTL0 |= CAP+CM_1+CCIS_1+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕获,中断允许CCIS_1为B
}
//初始化端口函数
void init_IO()
{
  P1DIR |= BIT1;//P1.1输出
  P2DIR &=~ BIT2;//P1.2输入    P1.1捕获CCI0A   P2.2捕获CCI0B
  P2SEL |=  BIT2;//P1.2第二功能,捕获输入
  P1OUT &=~BIT1;
  Delay_Nms(1000);
}
void main()
{
   WDTCTL = WDTPW + WDTHOLD;  //停止看门狗定时器   
    LcdReset() ;

    init_IO();
    Disp1Char(7,1,table[11]);//单位M
    init_timerA();
  P3DIR = 0xff;                   //设置P2口方向为输出

  TACCTL0 |= CAP+CM_1+CCIS_1+SCS+CCIE;//改为上升沿捕获
  
  _EINT();
  while(1)
  {   
    P1OUT |= BIT1;
    Delay_Nms(10);
    P1OUT &=~BIT1;
    Delay_Nms(80);
   
  //  P5OUT = 0xff;//IO冲突
   // if(S<10)
   //  P5OUT = 0x00;
   
  };   
}

//定时器A服务程序
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{

  switch(TAIV)
  {
    //case 2
    case 0 :if(Edge==RISE)
              {
                RiseCapVal = TACCR0;
                TACCTL0 |= CAP+CM_2+CCIS_1+SCS+CCIE;//改为下降沿捕获
                //TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
                Edge = FALL;//下降沿捕获标志
              }
             else
              {
               
                _DINT();
            
                Period = TACCR0-RiseCapVal;
                S=(Period*17)/100;
                a=S/100;
                b=S%100/10;
                c=S%100%10;//显示乱码为接线松动
                Disp1Char(3,0,table[a]);//米
                Disp1Char(4,0,table[10]);//小数点
                Disp1Char(5,0,table);//分米
                Disp1Char(6,0,table[c]);//厘米
                Disp1Char(7,0,table[11]);//单位M
                TACCR0 = 0;
                TACCTL0|= CAP+CM_1+CCIS_1+SCS+CCIE;//改为上升沿捕获
                Edge = RISE;//上升沿捕获标志  
                _EINT();
              }
               break;
    case 2 :   break;
     
    case 4 :   break;
    case 10: TA_Overflow_Cnt++;break;
            
  }   
}

回复评论 (1)

大虾们帮帮忙啊。。。。。。。。。。。
点赞  2012-9-24 17:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复