目的:PIC16f1787单片机 RE0端口ADC采样,用LCD显示变化的电压值。
结果:LCD 一直显示同一个数字(W.112), 不知为何?
万用表量过RE0端口有电压输入且有变化,该程序LCD能够显示汉字(LCD显示正常)
不知道是哪里的原因,求教各位大神!!!!
unsigned int table[]; //用来存放数字值
void main()
{
unsigned int value;
init(); //端口初始化
ADC_init; //ADC初始化
lcd_init(); //LCD初始化
while(1)
{
value=ADC_Convert(); //转换值存入value
ADC_display(value);
}
}
void init() //其他端口的配置
{
TRISB=0B00111001; //RB4,RB5,RB3为按键输入
ANSELB=0X00;
LATB=0X00;
TRISC=0X00;
LATC=0X00;
TRISD=0X00;
ANSELD=0X00;
LATD = 0x00;
TRISCbits.TRISC5=0;
LATCbits.LATC5=0;
TRISEbits.TRISE2=0;
LATEbits.LATE2=1;
TRISEbits.TRISE1=0;
LATEbits.LATE1=0;
}
void ADC_init() //ADC初始化
{
TRISEbits.TRISE0=1; //RE0模拟通道
ANSELEbits.ANSE0=1;
WPUEbits.WPUE0=0;
ODCONEbits.ODCONE0=0;
PORTEbits.RE0=0;
LATEbits.LATE0=0;
ADCON1=0XF0; //ADFM=1, 结果右对齐,Frc时钟
ADCON2=0X0f; //反相输入通道
ADCON0=0b00000001; //ADRMD=0,12位AD,ADON=1,允许AD转换
delayms(10);
}
unsigned int ADC_Convert()
{ unsigned int adval;
float advalf;
ADCON0bits.CHS0=1; //通道RE0(即AN5), CHS=00101
ADCON0bits.CHS1=0;
ADCON0bits.CHS2=1;
ADCON0bits.CHS3=0;
ADCON0bits.CHS4=0;
ADCON0bits.DONE=1;
while(ADCON0bits.DONE);
adval=(unsigned int)ADRESH;
adval=(adval<<8)+ADRESL;
advalf=adval/4096.0*4.3; (12位AD, 供电万用表量过大概是4.3V)
adval=advalf*1000;
return adval;
}
void ADC_display(unsigned int x)
{
table[0]=x/1000+0x30; //第一位 (整数)
table[1]=x/100%10+0x30; //第二位
table[2]=x/10%10+0x30; //第三位
table[3]=x%10+0x30; //第四位
send_i(0x80);
writelcd(TAB1A); //显示一行汉字,以验证LCD
send_i(0x90); //显示整数部分
send_d(table[0]);
send_d(0X2E); //小数点
delay(2);
send_i(0x91); //显示小数点后面三位
send_d(table[1]);
send_d(table[2]);
send_d(table[3]);
}
|