打印

急求指教,两个基本一样的程序,一个却用不得

[复制链接]
1607|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DENG_LI_JUN|  楼主 | 2014-3-28 21:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MSP430单片机在定时器A中刷新四位数码管(显示A/D结果)如下是正常的:
     
      switch(i)
      {
          case 3 : {P4OUT=0X00;break;}         //最高位
          case 2 : {P4OUT=0X08;break;}
          case 1 : {P4OUT=0X10;break;}
          case 0 : {P4OUT=0X18;break;}        //
     }

     P5OUT=LedNumber[buff[i]];  //不加小数点,主循环中改变buff
         
      i++;
      if(i>3)i=0;


但是我加了小数点后就刷新速度就慢上百倍:老半天数字才变化,真不明白怎么了??:
P5OUT=0;
      switch(i)
      {
          case 3 : {P4OUT=0X00;break;}         // 最高位添加小数点
          case 2 : {P4OUT=0X08;break;}
          case 1 : {P4OUT=0X10;break;}
          case 0 : {P4OUT=0X18;break;}        //   
      }
     if(i==3)P5OUT=(LedNumber[buff[i]]|BIT7);//在此处添加小数点
     else    P5OUT=LedNumber[buff[i]];     //主循环中改变buff
     
         
      i++;
      if(i>3)i=0;

相关帖子

沙发
ayb_ice| | 2014-3-28 22:15 | 只看该作者
这语句功能都变了
一个是每次都处理,一个是等于3才处理

使用特权

评论回复
板凳
草民| | 2014-3-28 23:43 | 只看该作者
if(i==3)P5OUT=(LedNumber[buff[i]]|BIT7);//在此处添加小数点
else    P5OUT=LedNumber[buff[i]];     //主循环中改变buff

这个也是在一直处理吧?

使用特权

评论回复
地板
df_flying| | 2014-3-29 00:15 | 只看该作者
i==3 那不就一种情况吗?直接在case 3:{P4OUT=0X00;LedNumber[buff[i]]|BIT7;break;}  其他的加P5OUT=LedNumber[buff[i];这样试试~建议if(i>3)i=0;这一句可以这么写 i%=3;

使用特权

评论回复
5
十月风城| | 2014-3-29 08:23 | 只看该作者
怎么多了个P5OUT=0??

使用特权

评论回复
6
ayb_ice| | 2014-3-29 08:40 | 只看该作者
估计你那个正常也是带病工作,只是现象不同而已,

测试
直接将buff设为固定值,禁止修改,应该是没有问题的

使用特权

评论回复
7
huarens| | 2014-3-29 11:52 | 只看该作者
本帖最后由 huarens 于 2014-3-29 11:54 编辑

看着好像没什么问题,可能编译器的问题吧!
不过最好把完整的程序贴上来,包括变量的定义!

使用特权

评论回复
8
DENG_LI_JUN|  楼主 | 2014-4-5 08:58 | 只看该作者
ayb_ice 发表于 2014-3-29 08:40
估计你那个正常也是带病工作,只是现象不同而已,

测试

固定没有问题

使用特权

评论回复
9
DENG_LI_JUN|  楼主 | 2014-4-5 08:58 | 只看该作者
十月风城 发表于 2014-3-29 08:23
怎么多了个P5OUT=0??

消影用的

使用特权

评论回复
10
DENG_LI_JUN|  楼主 | 2014-4-5 09:05 | 只看该作者
df_flying 发表于 2014-3-29 00:15
i==3 那不就一种情况吗?直接在case 3:{P4OUT=0X00;LedNumber]|BIT7;break;}  其他的加P5OUT=LedNumber;这 ...

i==3时,即扫描最高位才加小数点,等于其他位只显示对应数字。

使用特权

评论回复
11
DENG_LI_JUN|  楼主 | 2014-4-5 09:11 | 只看该作者
huarens 发表于 2014-3-29 11:52
看着好像没什么问题,可能编译器的问题吧!
不过最好把完整的程序贴上来,包括变量的定义! ...

#include <msp430x13x.h>       //Can use , have  dot,but sllowlly
                             
unsigned int  results,ResultBuff;
unsigned char  LedNumber[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
                            0x00,                                                  //Close one nixie_tube
                            0x38,0x5c,0x76,0x30};                                  // "L"  ,"O", "H","I"

unsigned char  buff[]={9,9,9,9};

void TimerA_Init(void)
{
    WDTCTL = WDTPW+WDTHOLD;
   
    BCSCTL1=BIT7+BIT6;          //   Close XT2 ,LFXT1 choose hight medol  //
//   BCSCTL2 = SELS + DIVS1;      // ??  4MHz  4 frequency dividing   1MHz
    TACTL =TASSEL0+ ID_2+MC0+TACLR;    // 0000   00 01         00    01               01         00
                                   //       Unuse  ACLK     ID bit67  MC bit4,5     TACLR set1
                                  //                     4 divide   increase model    clear   
    CCTL0 = CCIE;           // Not TACTL|=TAIE,Because that is overflow interrupt . Enable compare and capture interrupt//
    CCR0 =1000;           //Generate 1mS

    P5DIR=0Xff;
    P5OUT=0XFF;
    P4DIR=0X18;

    P1DIR=0X03;
        
    TACTL|=MC0;

    _EINT();
}

void ADC_Init(void)
{
    WDTCTL = WDTPW+WDTHOLD;
  
    P6SEL |=BIT6;                                //P6_6 Set to ADC
    ADC12CTL0 &= ~ENC;                          //Clear the ENC
    ADC12CTL0=ADC12ON+REFON+REF2_5V+SHT0_2+MSC;  //Start internal core ,refer source,choice 2.5v,
                                                 // sampling holding time 4*T_clock*N, multiply sampling control.
    ADC12CTL1=ADC12SSEL_0+SHP+CONSEQ_2+CSTARTADD_4 ;  //clock Source select,SHP is up edge,convert sequence modul ,
                                                    // convert store start addrss(0-15)Memery  //
    ADC12MCTL4=SREF_0+INCH_6+EOS;           //2.5v,ADC0,end sign  
                                        //Memery control :+is AVcc(3.3v),
                                        //-is AVss (system analog power ground) ,input channel ADC0  P6.0/A0
                                       //ADC12MCTLx must match CSTARTADDx,
    ADC12IE|= BIT4;                   //but Channel number does not match the Memery number,you should choice youself  //
    _EINT();
    ADC12CTL0|= ENC+ADC12SC;
}


void main(void)
{   
    unsigned int j=0;
        
    TimerA_Init();
    ADC_Init();
   
    while(1)
    {                     
          if(results<300)P1OUT=0X03;        //1.4V do not have flowing
          else                  P1OUT=0;
     

          j++;
          if(j==10)                                         // Should not use "j=1000"  
          {
              j=0;                           
              ResultBuff=results*4+results/2;                     //results*4.5
         }
         
        
          buff[0]=ResultBuff%10;
          buff[1]=ResultBuff/10%10;
          buff[2]=ResultBuff/100%10;
          buff[3]=ResultBuff/1000%10;               
     }   
   
   

}
#pragma vector=TIMERA0_VECTOR                                                           
__interrupt void Timer_A(void)               //timerA  
{
   
    static  unsigned int i=0;
                                     //////////////////////////////////////////////////////
                                     //Becaerful ,here you can not add instruct any more//
                                     //                                                 //  
                                     /////////////////////////////////////////////////////
     P5OUT=0;
      switch(i)
      {
          case 3 : {P4OUT=0X00;break;}         //X0 last left,lay most bit
          case 2 : {P4OUT=0X08;break;}
          case 1 : {P4OUT=0X10;break;}
          case 0 : {P4OUT=0X18;break;}        //X3  last right  
      }
     if(i==3)P5OUT=(LedNumber[buff]|BIT7);
     else    P5OUT=LedNumber[buff];
//      P5OUT=LedNumber[buff];  
         
      i++;
      if(i>3)i=0;
      
   ADC12CTL0|=ENC+ADC12SC;
}  


#pragma vector=ADC_VECTOR
__interrupt void ADC12_IRQ(void)           //C++ use      #pragma vector=ADC_VECTOR       Pre_excute instruct //
{
   
    ADC12CTL0&=~ENC;                                       //Stop ADC  //
    results=ADC12MEM4;
   
//    if(results>1500)
//       P1OUT=0X03;
//    else P1OUT=0X00;

  //  ADC12CTL0|=ENC+ADC12SC;              //Enable ADC again //
}                                          //Must close here ,else can not
                                            //go to timerA interrupt nomal



使用特权

评论回复
12
huarens| | 2014-4-17 16:30 | 只看该作者
本帖最后由 huarens 于 2014-4-17 16:37 编辑
DENG_LI_JUN 发表于 2014-4-5 09:11
#include        //Can use , have  dot,but sllowlly
                             
unsigned int  res ...

看不出毛病
BIT7 是什么东西  用过具体的数代替看  比如 0x80;
另外在switch   中加上  default:  break; 中间的大括号不要,试下看!

    switch(i)
      {
          case 0 : P4OUT=0X18;break;        //X3  last right
          case 1 : P4OUT=0X10;break;
          case 2 : P4OUT=0X08;break;
          case 3 : P4OUT=0X00;break;         //X0 last left,lay most bit
                default :  break;


      }

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
DENG_LI_JUN + 1 淡定
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

18

帖子

0

粉丝