刚刚写程序的时候遇到一个问题

2019-03-24 08:43发布

  1. #include <msp430g2553.h>
  2. #include "LCD_init.h"
  3. #define CPU_F ((double)1000000)
  4. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  5. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
  6. #define delay_s(x)  __delay_cycles((long)(CPU_F*(double)x/1.0))

  7. unsigned int start,end;
  8. unsigned char overflow;
  9. unsigned int length;
  10. unsigned char display_buffer[]={0x00,0x00,0x00,0x00,0xff};
  11. unsigned char number_table[]={'0','1','2','3','4','5','6','7','8','9'};


  12. void Data_Converter(uchar *p)
  13. {

  14.         uint j=0;
  15.         j=length/1000;
  16.         p[0]=number_table[length/10000];
  17.         j=length%10000/1000;
  18.         p[1]=number_table[j];
  19.         j=length%1000/100;
  20.         p[2]=number_table[j];
  21.         j=length%100/10;
  22.         p[3]=number_table[j];
  23.         j=length%10/1;
  24.         p[4]=number_table[j];
  25. }

  26. void LCD_GPIO_init(void)
  27. {
  28.     LCD_DIR|=BIT0+BIT1+BIT2+BIT3+BIT5;
  29.     LCD_IN|=BIT4;//字库输入脚设置
  30. }

  31. void setup(void)
  32. {
  33.     BCSCTL1 = CALBC1_1MHZ;                       /* Set DCO 改变频率显示速度改变  */
  34.     DCOCTL =  CALDCO_1MHZ;
  35.         P1DIR |= BIT0+BIT3;                           //设置P1.0 P1.4为输出
  36.         P1SEL |= BIT1 + BIT2;                         //设置P1.2端口为功能模块使用
  37.         TA0CTL = TASSEL_1 | ID_0 | MC_2 | TACLR;     //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式
  38.         TA0CCTL0 =  CM_1 | CCIS_0 | SCS | CAP | CCIE;
  39.         _EINT(); //中断允许

  40.         LCD_GPIO_init();
  41.         initial_lcd();
  42.         clear_screen();    //clear all dots
  43. }

  44. int main(void)
  45. {
  46.         WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
  47.         setup();
  48.         start=1;
  49.     while(1)
  50.     {
  51.             P1OUT |= BIT0;
  52.             delay_us(15);
  53.             P1OUT &= ~BIT0;
  54.             delay_ms(60);
  55.             length=start;
  56.             Data_Converter(display_buffer);
  57.         display_GB2312_string(2,1,display_buffer);
  58.     }
  59. }

  60. #pragma vector=TIMER0_A0_VECTOR
  61. __interrupt void TIMER0_A0(void)
  62. {
  63.         switch(TA0IV) //向量查询
  64.         {
  65.                 case 2: //捕获中断
  66.                         if(TA0CCTL0&CM_0) //上升沿
  67.                         {
  68.                                 TA0CCTL0=(TA0CCTL0&(~CM_1))|CM_2;//更变设置为下降沿触发
  69.                                 start=TA0CCR0; //记录初始时间
  70.                                 overflow=0; //溢出计数变量复位
  71.                         }
  72.                         else if (TA0CCTL0&CM_2) //下降沿
  73.                         {
  74.                                 TA0CCTL0=(TA0CCTL0&(~CM_2))|CM_1;//更变设置为上升沿触发
  75.                                 end=TA0CCR0;
  76.                                 TA0CTL |= TACLR;//用start,end,overflow计算脉冲宽度
  77.                         }
  78.                         break;
  79.                 case 10: //定时器溢出中断
  80.                         overflow++;
  81.                         break; //溢出计数加1
  82.                 default:break;
  83.         }
  84. }
复制代码我在写一个对脉冲宽度的捕捉然后在显示屏上显示出脉冲的宽度,这是程序的一部分。然后我调试的时候,一开始是发现无法进入中断,然后对P1.1口接VCC时应该会有一个上升沿的,但是没有进入中断,但是接GND的时候会产生中断,但是这个时候观察寄存器TA0IV  发现一直显示的是0x0000,我就觉得很奇怪,请问是怎么回事呢?
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
3955793141
2019-03-25 10:57
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章