zhuyi25762 发表于 2011-1-24 15:53:26

430 IO即当AD用 又当IO口检测电平用,出怪事了?

void AD(void)
{
SD16CTL = SD16SSEL_1 + SD16DIV_1;               // SLCK=MCLK=1M   2分频 f=500KHz,OSR=1024,参考电源暂不开启,转换前开,转换后关。节能!
SD16CCTL0 = SD16DF + SD16OSR_1024 + SD16SNGL;   // + SD16UNI // 输出格式为2的补码(8000--7FFF)+过采样速率1024+单次转换 双极性模式(默认模式)
SD16INCTL0 = SD16INTDLY_0;                      // 中断延时(4第四次采样中断)

SD16AE = SD16AE0+SD16AE1;               // 设置通道0 因为通道0占用的脚是P1.0 P1.1
SD16INCTL0 |=SD16GAIN_32 + SD16INCH_0;// +增益为x32+通道为

SD16CTL |= SD16REFON;               // 只打开1.2V参考源
Delay_us(100);                     
SD16CCTL0 |=(SD16SC + SD16IE);      // 启动 SD16 进行转换并且允许 SD16 中断。

}



uchar check(void)
{
unsigned char sta;
SD16CCTL0 &= ~(SD16SC + SD16IE);          //关闭AD
SD16AE &= ~(SD16AE0+SD16AE1);//关闭模拟输入
P1SEL &=~(BIT0+BIT1); //P1.0 P1.1设为普通IO,输入输出功能
P1REN &=~(BIT0+BIT1); //P1.0 P1.1上拉,下拉禁止
P1DIR |=BIT0;         //P1.0 设为输出 1输出 0输入
P1DIR &=~BIT1;      //P1.1 设为输入
P1OUT |=BIT0;         //P1.0 输出高电平
_NOP();
_NOP();
_NOP();
_NOP();
if(P1IN & BIT1)   //获取P1.1引脚电平
    sta=0;//RTC 在线
else
    sta=1;//断线
return sta;
}


void main()
{
BCSCTL1 = CALBC1_1MHZ;   // Set DCO to 1MHz 校正数据
DCOCTL= CALDCO_1MHZ;   // 校正        
AD();
check();        //运行完成这函数后,AD再也得不到值??为什么 ??????????????单独AD对,单独IO电平检测对。切换后就不对!!求解

}

#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
SD16CCTL0 &= ~(SD16SC + SD16IE);       // SD16停止转换,禁止中断及关闭采集电路的电源。   
adc_last_val = SD16MEM0; // 保存 ADC 最后的结果
页: [1]
查看完整版本: 430 IO即当AD用 又当IO口检测电平用,出怪事了?