[LaunchPad] 写了个ADC10单通道重复采样的程序,没法用

电子系乔布斯   2012-8-3 21:30 楼主
/*************************************************************
程序功能:P1.0采集电位器电压  通过两片74HC595在数码管上显示
  P1.1~3连第一片控制数码管段选的595
  P1.4~6连第二片控制数码管位选的595
测试问题:数码管上数字显示不全,但通过调节电位器可以使数据发生改变
*************************************************************/
#include  
#define uchar unsigned char
#define uint unsigned int
#define NixieDIR P1DIR
#define SCK1_SET P1OUT|=BIT1; //P1.1
#define SCK1_CLR P1OUT&=~BIT1;
#define RCK1_SET P1OUT|=BIT2; //P1.2
#define RCK1_CLR P1OUT&=~BIT2;
#define DATA1_SET P1OUT|=BIT3; //P1.3
#define DATA1_CLR P1OUT&=~BIT3;
#define SCK2_SET P1OUT|=BIT4; //P1.4
#define SCK2_CLR P1OUT&=~BIT4;
#define RCK2_SET P1OUT|=BIT5; //P1.5
#define RCK2_CLR P1OUT&=~BIT5;
#define DATA2_SET P1OUT|=BIT6; //P1.6
#define DATA2_CLR P1OUT&=~BIT6;

uint Aver;
//数码管7位段码:0--f
uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar DispBuf[4] = {0,0,0,0};
//记录显示位数的全局变量
uchar cnt = 0;
uchar temp;

void datawrite595_1(uchar DATA)//将数据送入74HC595内部移位寄存器
{
uchar j;
for (j=0;j<8;j++)
{
  if(DATA&0x80)
  {
   DATA1_SET;
  }
  else
  {
   DATA1_CLR;
  }
  DATA <<= 1;
  SCK1_SET ; //上升沿发生移位
  _NOP();_NOP();
  SCK1_CLR ;
}
}
void dataout595_1()//将移位寄存器内的数据锁存到输出寄存器并显示
{
RCK1_CLR;
RCK1_SET;//上升沿将数据送到输出锁存器
RCK1_CLR;
}
void datawrite595_2(uchar DATA)//将数据送入74HC595内部移位寄存器
{
uchar j;
for (j=0;j<8;j++)
{
  if(DATA&0x80)
  {
   DATA2_SET;
  }
  else
  {
   DATA2_CLR;
  }
  DATA <<= 1;
  SCK2_SET ; //上升沿发生移位
  _NOP();_NOP();
  SCK2_CLR ;
}
}
void dataout595_2()//将移位寄存器内的数据锁存到输出寄存器并显示
{
RCK2_CLR;
RCK2_SET;//上升沿将数据送到输出锁存器
RCK2_CLR;
}

void main(void)
{
    WDTCTL=WDTPW+WDTHOLD;
CCTL0=CCIE;
CCR0=5000;
TACTL=TASSEL_2+MC_1;
    P1SEL |= 0x01;        // Enable A/D channel A0
    ADC10CTL0 |= ADC10ON + ADC10SHT_3 +MSC +ADC10IE;      // Turn on ADC10, set sampling time
    ADC10CTL1 |= CONSEQ_2;               // Use sampling timer, set mode
    ADC10AE0 |= 0x01;                           // Enable ADC10IFG.0
    ADC10CTL0 |= ENC;                         // Enable conversions
    ADC10CTL0 |= ADC10SC;                     // Start conversion
    NixieDIR = 0X7e;
SCK1_CLR ;
RCK1_SET ;
SCK2_CLR ;
RCK2_SET ;
datawrite595_1(0);               //段选消影
dataout595_1();
datawrite595_2(0);               //位选消影
dataout595_2();

    _EINT();
    while(1)
    {
        Aver = ADC10MEM;
     __bis_SR_register(CPUOFF + GIE);    // Enter LPM0, Enable interrupts
        DispBuf[0] = Aver / 1000 % 10;              //更新数码管显示
        DispBuf[1] = Aver / 100 % 10 ;
        DispBuf[2] = Aver / 10 % 10;
        DispBuf[3] = Aver % 10;
    }
}
/*******************************************
函数名称:ADC12ISR
功    能:ADC12的中断服务函数
参    数:无
返回值  :无
********************************************/
#pragma vector=ADC10_VECTOR
__interrupt void ADC10ISR (void)
{
    _bic_SR_register_on_exit(CPUOFF);                   // Clear LPM0
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER_A(void)
{
if(cnt == 4) cnt = 0;
  temp = 0xff;
  temp &= ~(1 << cnt);           //输出位选信号
  datawrite595_2(temp);
  dataout595_2();

  datawrite595_1(DispBuf[cnt]); //输出段选信号
  dataout595_1();
  datawrite595_1(0);               //段选消影
  dataout595_1();
     cnt++;                        //位计数变量在0~3之间循环
}


数码管上数字显示不全,总是缺胳膊少腿的,通过调节电位器可以使数码管上数字发生变化,关于595的函数程序和数码管的显示程序我单独测过是没有问题的

希望高手能帮我解决疑难,真的十分感谢!

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复