PIC16F877A程序求助

2020-02-06 10:22发布

各位大侠,
实在是想不通,
我是个新手,刚接触PIC,以前都是用AVR,
用MPLAP写了个简单的ADC程序,准备在仿真版上看看运行的效果
但在proteux仿真时通过了,在板子上出不来结果,LCD显示的值都是0,真不知道问题出在哪里,附件有图片
忘各位高手指点下
以下为程序
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uchar num,i,m;
uchar adc_data[]={"data:___________"};
uint count=0;
//__CONFIG(0x3B31);
//#define RS RE0
//#define RW RE1
//#define EN RE2


//********************函数定义*********************
const uchar table[]={"  China CEPARK  "};
uchar table1[]={" dian zi yuan   "};

void write_com(uchar com);
void write_data(uchar data);
void init(void);
void delay(uint z);
void delay1ms(uint DelayTime);     
uchar spi_write_read(uchar dd);
void led_display(void);
void decimal_bcd_16bit(uint cnt);
uint adc_converter(void);
void adc_channel(uchar channel);
void adc_init(void);


void main()
{
init();
       
        for        (num=0;num<16;num++)
        {        write_data(table[num]);
        delay(50);
        }
   write_com(0x80+0x40);
        for (i=0;i<16;i++)
    {
                write_data(table1[i]);
                delay(50);
        }

  adc_init();//adc初始化
  adc_channel(0);//选择通道0
        delay(10);

        while(1)
{
delay(1000);
count=adc_converter();
//count=1023;
table1[0]=count/1000+0x30;
table1[1]=count%1000/100+0x30;
table1[2]=count%100/10+0x30;
table1[3]=count%10+0x30;

write_com(0x80+0x40);
for (i=0;i<16;i++)
    {
                write_data(table1[i]);
                delay(50);
        }
}
;

}
void init()
{
         TRISE=0x00;
     TRISD=0x00;
     TRISA=0XFF;
         ADCON1=0X82;
        PORTE=0;
          PORTD=0;
        write_com(0x38);
        write_com(0x0f);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);

}
void adc_init()
{
  //AD 功能设置
  PCFG3=1;
  PCFG2=1;
  PCFG1=0;
  PCFG0=0;
  // PCF<3..0> AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 VERF+ VREF-
  // 0000      A   A   A   A   A   A   A   A   VDD   VSS
  TRISA=0b00111111;    //PORTA口全为输入

  ADCS2=0;
  ADCS1=0;
  ADCS0=0;     //AD转换频率设为32Tosc(Tosc=1/Fosc),该时间要大于1.6us
  ADFM=1;                  //AD转换结果右对齐
  ADON=1;
}

//**********************选择ad转换通道(0-7)*************************
void adc_channel(uchar channel)
{
  ADCON0|=((channel&0x07)<<3);     //选择AD转换通道
  delay1ms(1);                     //最少延时20us,使输入电压稳定
}

//***********************启动ad转换***************************
uint adc_converter(void)          //AD转换函数
{        
ulong adc_result;                //使用ulong型变量
  
  ADGO=1;                                                 //开始AD转换
  while(ADGO==1);                                    //等待AD转换结束
  ADIF=0;                          //清AD结束标志
  
  adc_result=ADRESH;
  adc_result=adc_result<<8;
  adc_result|=ADRESL;
  adc_result=(adc_result*5000)>>10;  //计算时应用ulong 查考电压5V
  return(adc_result);                  //将测量值扩大1000倍后,返回uint型变量
}

void write_data(uchar data)
{
        RE0=1;
        PORTD=data;
        delay(5);
        RE2=1;
        delay(5);
        RE2=0;
}
void write_com(uchar com)
{
        RE0=0;
        PORTD=com;
        delay(5);
        RE2=1;
        delay(5);
        RE2=0;
}
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--);
        for(y=110;y>0;y--);
}
//*****************延时 n*1ms 12MHz*****************
void delay1ms(uint DelayTime)
{       
  uint temp;
  for(;DelayTime>0;DelayTime--)
  {       
    for(temp=0;temp<270;temp++)
    {;}
  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。