// 采用中断方式把模拟通道AN0的10位A/D转换结果送D口,C口显示
#include "pic.h"
__CONFIG(XT & WDTDIS & LVPDIS); // ICD2 调试配置字
interrupt ISR(void)
{
if(ADIE && ADIF==1)
{
ADIF=0; // A/D标志位清零
  ORTC=ADRESL; // 低两位送PORTC
  ORTD=ADRESH; // 高八位送PORTD
ADGO=1; // 启动下一次A/D转换
}
else
{
while(1); // 调试程序用,若有其它意外中断产生才会走的此处。
}
}
void main(void)
{
char i=0;
TRISA0=1; // AN0是RA0,所以要把A口置为输入
TRISD=0; // D口用做输出控制LED
TRISC=0; // C口用做输出控制LED
ADFM=0; //左对齐,ADRESH保存高八位
PCFG3=0;
PCFG2=0;
PCFG1=0;
PCFG0=0; // PCFG3 CFG0=0000,全为模拟引脚,参考电压为VDD和VSS
// 以上5条语句可以用一条语句表达:ADCON1=0b00000000;
// 分开写的目的是易于理解
ADCS1=1;
ADCS0=1; // 使用A/D转换模块内部RC振荡器作为时钟
CHS2=0;
CHS1=0;
CHS0=0; // CHS2:CHS0=000, 选择通道0进行A/D转换
ADON=1; // 开启A/D转换模块
// 以上6条语句可以用一条语句表达:ADCON0=0b11000001;
ADIE=1; // 允许A/D转换产生中断
ADIF=0; // A/D标志位清零
PEIE=1; // 允许外设中断
GIE=1; // 打开总中断使能位
for(i=0;i<25;i++)
{ // 为了采样保持电路充电的延时,超过25us即可
}
ADGO=1; // 启动一次A/D转换
while(1)
{
}
}
我想问一下上面这个语句的中断函数是在哪条语句后面执行 是GIE=1 还是ADGO=1??? 如果是GIE的话那这个程序是不是在没转换之前就已经给C口和D口赋了一次值了? |