我现在做的东西需要液晶显示。在程序中没有加入ADC中断时,液晶正常显示,一旦加上ADC中断就不能显示了!!我不知道是怎么回事!!请高手指教!!
高手赐教,万分感谢!!!!
ADC初始化配置程序如下:
//-------------------------------------------------------------------------
//ADC初始化程序
//-------------------------------------------------------------------------
void ADC_int()
{
EAD=0;; //禁止ADC中断 EAD=0
ADCON=0x80; // 开启所有模拟电路
ADMR=0x82; // 11.0592MHz/2560/2=10.8KHz 通道2
ENDATA=0x80; // 使能内部ref和禁止ADC转换和LVR检测
EAD=1; //允许ADC中断
}
其中采集函数:
//-------------------------------------------------------------------------
//ADC采样程序,返回采样值
//-------------------------------------------------------------------------
uint ad_sample()
{
uchar i;
uint sum=0,adc_data,max_data,min_data,temp;
ADMR=0x82; // 11.0592MHz/2560/2=10.8KHz 通道2
ENDATA=0xC0; // 使能内部ref和开启ADC转换
ADRES=ADRESH|ADRESL;
ADRES>>=6; //ADRES是自己定义的变量
for(i=0;i<AD_CNT;i++) //采样10次,并取出10次中的最大值和最小值
{
if(i==0) //如果是第一次采样
{
max_data=(0x3FF&ADRES);//将第一次采样的值赋给最大值变量max_data
}
else if(i==1)//如果是第二次采样
{
temp=(0x3FF&ADRES);//获取第二次采样值
if(temp>max_data)//第二次采样值是否大于第一次采样的值
{
min_data=max_data;//将最大值变量max_data的值给最小值变量min_data
max_data=temp;//将第二次采样值给最大值变量max_data
}
else//第二次采样的值不大于第一次采样的值
min_data=temp;//将第二次采样值给最小值变量min_data
}
else//第三次及以后的采样(包括第三次)
{
temp=(0x3FF&ADRES);//获取第三次及以后采样值
if(temp>max_data)//采样值大于最大值变量max_data的值
{
max_data=temp;//将采样值赋给最大值变量max_data
}
else//采样值不大于最大值变量max_data的值
{
if(temp<min_data)//采样值小于最小值变量min_data的值
{
min_data=temp;//采样值赋给最小值变量min_data
}
}
}
sum+=(0x3FF&ADRES);
}
adc_data=(sum-max_data-min_data)/(AD_CNT-2); //10次采样去掉最大值和最小值,然后求平均值
return adc_data; //返回采样值
}
低电压检测:
while(1)
{
ENDATA=0x90; // Enable LVR检测
ADMR=0x84; // 11.0592MHz/2560/2=10.8KHz and channel 0 ,选择通道4LVR
if(flag==1)
{ LVI=0;
TR0=0;//关PWM定时器
Character_display(0x90,"电池电压过低stop ");
Key5_Function();
flag=0;
}
}
---------------------------------------------------------------------------------------------------------------------------
中断函数:
--------------------------------------------------------------------------------------------------------------------------
void LVR_int() interrupt 5 using 0 /* LVR interrupt */
{
flag=1;
}
void AD_int() interrupt 6 using 0 // AD completion interrupt
{
if(ADC_flag==0)
{
Yali=Yali_calculate(Yali);
}
}