Keil 编译器不让我们随心所欲地使用自定义库函数, 因为如果你调用了一个自编写的 Delay.lib 库中的库函数,
如 Delayms (1000); 则 Delay.lib 库中所有函数都将加入到你的程序中, 例 Delay50us 等. 而 Keil 自己的库函数
则不存在这个问题, 例如调用 STRING.H 中的 strlen 函数, 它不会把 strcmp 等函数加入到你的程序中.
不得已, 只有使用笨办法, 以尽量让自己方便程序的编写:
在 C51\INC 下建 delay.h 文件:
#ifdef add_Delayms
#include "delay\delayms.c"
#endif
#ifdef add_Delay50us
#include "delay\delay50us.c"
#endif
再在这个目录下建目录 delay, 目录里分别写各个函数的原程序:
delayms.c:
void Delayms (unsigned int count);
/*----------------------------------------
1mS 延时 函数
参 数: count: count x 1mS
----------------------------------------*/
void Delayms (unsigned int count)
{
unsigned int i;
unsigned int j;
for (j=0; j<count; j++)
for (i=0; i<124; i++); // 根据 CPU 时钟修改 i 的循环值
}
delay50us.c:
void Delay50us (unsigned char count);
/*----------------------------------------
50uS 延时 函数
参 数: count: count x 50uS
----------------------------------------*/
void Delay50us (unsigned char count)
{
unsigned char i;
unsigned char j;
for (j=0; j<count; j++)
for (i=0; i<13; i++); // 根据 CPU 时钟修改 i 的循环值
}
最后在主程序中调用:
#include <at89x52.h>
#include <define.h>
//--- 自编库函数 ---
#define add_Delayms
#define add_Delay50us
#include <delay.h>
/*----------------------------------------
主函数
----------------------------------------*/
void main (void)
{
while (TRUE)
{
Delayms (1000);
Delay50us (5);
}
}
虽然感觉有点笨, 但还是方便了些, 如果编译时出现提示某个函数没有被使用, 只需注释掉一行就行, 例:
#include <AT89X52.H>
#include <DEFINE.H>
//--- 自编库函数 ---
#define add_Delayms
//#define add_Delay50us
#include <DELAY.H>
/*----------------------------------------
主函数
----------------------------------------*/
void main (void)
{
while (TRUE)
{
Delayms (1000);
}
}