各位大侠,
实在是想不通,
我是个新手,刚接触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++)
{;}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>