打印
[PIC®/AVR®/dsPIC®产品]

PIC新人编写程序受阻求大神照应,自己动手从零学起做毕设

[复制链接]
3884|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rixiang316|  楼主 | 2014-5-18 20:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人新学PIC单片机,想实现一个模拟量(电压)输入,用1602把电压大小显示出来。
编译后错误是
Warning [361] C:\Users\john\Desktop\programe\try.c; 43.1 function declared implicit int
Error   [192] C:\Users\john\Desktop\programe\try.c; 62.1 undefined identifier "ADGO"
Warning [356] C:\Users\john\Desktop\programe\try.c; 67.20 implicit conversion of float to integer
这个错误实在搞不懂啊
ADGO不是ADCON0的一个寄存器吗,我借鉴了别人的程序也是这样写的,搞不懂啊。

#include<pic.h>

#define rs RA1   //端口定义
#define rw RA2
#define e RA3
#define uchar unsigned char
#define uint  unsigned int

const char hall[]={'h','a','l','l','.','v','o','l','t','a','g','e'};  //显示霍尔电压
uint get_adan0();   //RA0的AD转换输出
uchar output[];
void init();         //初始化定义
void lcd_init();     //lcd初始化定义
void write_hall();   //显示霍尔电压函数
void write_output();    //显示AD转换输出  
void write(char x);  //显示一字节数据
void lcd_enable();   //lcd显示设置函数
void delay();        //延时函数定义

void main()          //主函数程序
{
  uint temp;
  float lednum;
  int a1,a2,a3,a4;
  init();            //调用IO口初始化定义  
  lcd_init();        //调用lcd初始化定义
  write_hall();      //调用显示霍尔电压字符
  while(1)
  {
   temp=get_adan0();
   lednum=temp/1000;
   a1=(int)lednum;
   a2=((int)(lednum*10)-a1*10);
   a3=((int)(lednum*100)-a1*100-a2*10);
   a4=((int)(lednum*1000)-a1*1000-a2*100-a3*10);
   output[0]=a1;
   output[1]='.';
   output[2]=a2;
   output[3]=a3;
   output[4]=a4;
   PORTC=0xC0;        //定义第二行显示地址
   lcd_enable();      //调用lcd显示设置函数
   wirte_output();       //调用AD转换输出
}
  }   

void init()
{
TRISA=0x01;
TRISC=0x00;
PORTA=0;
PORTC=0;
ADCON0=0x41;
ADCON1=0x8e;
delay(10);
}

uint get_adan0()
{
uint adval16;
float advalf;
ADGO=1;           //GODONE变一启动AD
while(ADGO);
adval16=ADRESH;
adval16=adval16<<8|ADRESL;
advalf=adval16/1023.0*5.0;
adval16=advalf*1000;
return(adval16);
}

void lcd_init()
{
PORTC=0x01;      //清除显示
lcd_enable();
PORTC=0x38;      //8位两行5乘7点阵
lcd_enable();
PORTC=0x0c;      //显示开,光标关
lcd_enable();
PORTC=0x06;
lcd_enable();
PORTC=0x80;
lcd_enable();
}


void write_hall()          //显示霍尔电压函数
{
int i;
for(i=0;i<0x0b;i++)
{
write(hall[i]);
}
}

void write_output()         //显示输出电压函数
{
int i;
for(i=0;i<0x04;i++)
{
write(output[i]);
}
}

void write(char x)          //写一个字节
{
PORTC=x;
rs=1;
rw=0;
e=0;
delay;
e=1;
}

void lcd_enable()            //LCD显示设置函数
{
rs=0;
rw=0;
e-0;
delay();
e=1;
}

void delay()                 //延迟函数
{
int i;
for(i=0;i<50;i++);
}
沙发
y651503148| | 2014-5-19 08:46 | 只看该作者
编译器不一样,查看对应头文件的定义。

使用特权

评论回复
板凳
rixiang316|  楼主 | 2014-5-19 08:56 | 只看该作者
额,谢谢你的回来,不过我刚学,是查<pic.h>的定义吗?
怎么查啊? 我使得编译器是PICC v9.83,是说我用的编译器和大家不一样吗?
期待指教

使用特权

评论回复
地板
perry_peng| | 2014-5-19 08:57 | 只看该作者
对,应该是用了不同的编译器,不同的编译器对寄存器的名称在头文件中的定义不一样

使用特权

评论回复
5
rixiang316|  楼主 | 2014-5-19 09:03 | 只看该作者
ADCON0                                 equ 001Fh
#define ADON                           BANKMASK(ADCON0), 0
#define GO_nDONE                       BANKMASK(ADCON0), 2
#define GO                             BANKMASK(ADCON0), 2
#define CHS0                           BANKMASK(ADCON0), 3
#define CHS1                           BANKMASK(ADCON0), 4
#define CHS2                           BANKMASK(ADCON0), 5
#define ADCS0                          BANKMASK(ADCON0), 6
#define ADCS1                          BANKMASK(ADCON0), 7
#define nDONE                          BANKMASK(ADCON0), 2
#define GO_DONE                        BANKMASK(ADCON0), 2
#ifndef _LIB_BUILD
我找到了对应的头文件了,请问我该改成哪一个啊?没看明白。。
期待赐教。

使用特权

评论回复
6
rixiang316|  楼主 | 2014-5-19 09:12 | 只看该作者
大神 这个问题解决了 把ADGO改成GO_DONE就好了 谢谢你
可是出来了一个新问题
Error   [500] ; 0. undefined symbols:
        _output(main.obj) _wirte_output(main.obj)
这是哪里出了问题啊

使用特权

评论回复
7
浪子Tomorrow| | 2014-5-19 09:16 | 只看该作者
rixiang316 发表于 2014-5-19 09:12
大神 这个问题解决了 把ADGO改成GO_DONE就好了 谢谢你
可是出来了一个新问题
Error   [500] ; 0. undefined ...

函数没有声明或者没有定义

使用特权

评论回复
8
rixiang316|  楼主 | 2014-5-19 09:25 | 只看该作者
谢谢大神,我这里对output 与write_output 都声明了,是不是哪里不对啊,望指正。


const char hall[]={'h','a','l','l','.','v','o','l','t','a','g','e'};  //显示霍尔电压
uint get_adan0();   //RA0的AD转换输出
uchar output[];
void init();         //初始化定义
void lcd_init();     //lcd初始化定义
void write_hall();   //显示霍尔电压函数
void write_output();    //显示AD转换输出  
void write(char x);  //显示一字节数据
void lcd_enable();   //lcd显示设置函数
void delay();        //延时函数定义

使用特权

评论回复
9
yewuyi| | 2014-5-19 10:05 | 只看该作者
rixiang316 发表于 2014-5-19 09:12
大神 这个问题解决了 把ADGO改成GO_DONE就好了 谢谢你
可是出来了一个新问题
Error   [500] ; 0. undefined ...

调用了没有定义的函数或者变量等。

此时就会提示这个。

先在main.c中找找有没有用_output和_wirte_output这两个东西,如果有,应当先定义。

使用特权

评论回复
10
rixiang316|  楼主 | 2014-5-19 16:26 | 只看该作者
实在感谢,找到错误了,都很低级。
write写成wirte了
谢谢各位的支持

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

14

帖子

0

粉丝