打印
[AVR单片机]

如何将自己编写的子函数,以库函数的形式被主函数调用

[复制链接]
7910|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wucc2009|  楼主 | 2010-9-9 22:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//主函数
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#include"encoder.h"
#include"74hc595"
main()
{
   DDRA=0XFF;
   PORTA=0XEF;
   while()
   {
     uchar a,b,c=0x00;
     PORTA|=BIT(4);
  for(a=0;a<=9;a++)
  {
    sendbyte(a);
    for(b=0;b<2000;b++)
    {
      PORTA&=~c;
   c=c+0x20;
   delay(7);
   PORTA|=0xe0;
    }
  }
   }
}


//子函数1
void delay(uchar ms)
{
  for(;ms>0;ms--)
    for(t=0;t<1141;t++);
}
void sendbyte(uchar byte)
{
  uint i,tem;
  byte=encoder(byte);
  for(i=0;i<8;i++)
  {
    PORTA&=~BIT(1);
tem=byte&0x80;
if(tem==0)
{
   PORTA&=~BIT(3);
}
else
  PORTA|=BIT(3);
byte=byte<<1;
PORTA|=BIT(1);
  }
  PORTA&=~BIT(2);
  PORTA|=BIT(2);
}




//子函数2
uchar encoder(uchar num)
{
uchar code;
switch(num)
{
  case 0x00:
  code=0xc0;break;
  case 0x01:
  code=0xf9;break;
  case 0x02:
  code=0xa4;break;
  case 0x03:
  code=0xb0;break;
  case 0x04:
  code=0x99;break;
  case 0x05:
  code=0x92;break;
  case 0x06:
  code=0x82;break;
  case 0x07:
  code=0xf8;break;
  case 0x08:
  code=0x80;break;
  case 0x09:
  code=0x90;break;
  }
  return(code);
}

后面这两个函数如何以库函数的形式被主函数调用?
请教~~~~

相关帖子

沙发
宇宙飞船| | 2010-9-9 23:19 | 只看该作者
编译工具用哪种?ICC?IAR?GCC?

使用特权

评论回复
板凳
ynwqqq| | 2010-9-9 23:23 | 只看该作者
慢慢来嘛,用KEIL

使用特权

评论回复
地板
xuyiyi| | 2010-9-10 12:25 | 只看该作者
慢慢来嘛,用KEIL
ynwqqq 发表于 2010-9-9 23:23



用KEIL ?

AVR能用KEIL ?

使用特权

评论回复
5
wucc2009|  楼主 | 2010-9-10 12:27 | 只看该作者
iccavr   ,如果写在一个程序里面可以,但是如果通过库函数就不行了啊,怎么办啊?斑竹~~谢谢~~~ 2# 宇宙飞船

使用特权

评论回复
6
宇宙飞船| | 2010-9-10 18:20 | 只看该作者
ICC的楼主问错人了,飞船不懂,也没必要花时间去弄懂,因为俺以后不会再用到ICC。

使用特权

评论回复
7
wucc2009|  楼主 | 2010-9-10 23:08 | 只看该作者
为什么以后不用啊?编程不很好吗啊? 6# 宇宙飞船

使用特权

评论回复
8
wucc2009|  楼主 | 2010-9-10 23:08 | 只看该作者
谁能帮我解决啊???????谢谢~~~~~~~

使用特权

评论回复
9
xuyiyi| | 2010-9-11 06:08 | 只看该作者
本帖最后由 xuyiyi 于 2010-9-11 06:09 编辑

在ICC AVR里 icc\libsrc.avr\libsrc有很多库函数的源程序, 你可参考一下。

ICC俺没用过,这是网上找来的方法,供参考。

ICC AVR自制库文件

步骤1: 库文件的生成
  为叙述方便,请在C盘根目录中新建一目录,并将其命名为libtest。以下将C:\libtest简称为工作目录。

  在ICCAVR IDE环境中新建两个文件,分别命名为GetMax.c和GetMax.h,并保存至工作目录中。两文件内容如下所示:

**********************************

//------GetMax.h的内容如下:------
#ifndef __GETMAX_LIB

#define __GETMAX_LIB

extern int GetMax( int a, int b );

#endif

**********************************

//------GetMax.c的内容如下:------
#include "GetMax.h"

int GetMax( int a, int b )
{
  return ( (a > b)?a:b );
}

**********************************
   
    执行File菜单下的Compile File...项下的To Object项,将GetMax.c编译生成相应的目标文件GetMax.o 。

    执行命令ilibw -a libGetMax.a GetMax.o生成库文件。可执行文件ilibw.exe位于icc安装完后的系统目录(默认安装时在C:\icc)的子目录bin中。为使用方便可将ilibw.exe拷贝至工作目录中使用。至此库文件libGetMax.a已生成,其对应的头文件为GetMax.h 。

    注意库文件的命名必须以“lib”字样开头,否则在IDE中编译下面的应用范例过程中自动链接时会报错(手动链接除外)。

----------------------------------

步骤2:应用范例的编写和编译
  在工作目录中建立一个工程Test.prj 。工程Test.prj中包含一个C源程序文件Test.c 。Test.C的源代码如下所示:

**********************************
//------Test.c的源代码如下:------

#include "GetMax.h"
void main( void )
{
int Result,Value1,Value2;
Value1 = 0x10FF;
Value2 = 0x0FFF;
Result = GetMax( Value1, Value2);
}

**********************************
  
  然后,将前一步骤生成的库文件libGetMax.a拷贝至icc安装完后的系统目录(默认安装时在C:\icc)的子目录lib中。再执行Project菜单下的Option项,修改Target表单中的Additional Lib项,在文本框中输入GetMax (注意不能写成libGetMax.a)。

     完成上述步骤后,就以编译和调试test.prj 。
   
   如果在其它工程中需要使用上述库函数GetMax,只需拷贝所需的GetMax.h和libGetMax.a,并进行相应配置就可以了。

  也可以在已有的库中增加一些自定义的函数。详细参考ICCAVR IDE 中的在线帮助。

使用特权

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

本版积分规则

个人签名:加油,我的人生将会变得光明!!!

0

主题

51

帖子

1

粉丝