keil 中自己编写C语言头文件
自己编写一个C语言头文件,把自己常用的一些函数放进去。所看到文章做法和一般C语言头文件写法基本一样,自己学着试了一下,老是不成功。后来去图书馆查书,才知道原
来keil 的C语言比较特别,引用同一工程其他文件中的函数需要在声明函数前加extern。
以下是一个例子:
//步骤一:建立fc.h
#ifndef FC_H
#define FC_H
#include <reg51.h>
extern void f(void)
#endif
//步骤二:建立fc.c
#include "fc.h"
#include <reg51.h>
//还需要什么头文件自己添加
void f(void)
{
//要什么程序自己添加
}
步骤三:将f.h和f.c放在工程的文件夹里,并在keil 中将f.c添加到工程中(右键左边的Source Group n,
选择Add file to group 'Source group n'),要用到f()函数的话就include“fC.h”就行了,例如:
#include <reg51.h>
#include "fc.h"
void main()
{
f();
while(1);
}
结果大功告成,成功编译,但是并没有想象中那么实用,例如 fc.c 中如果定义了函数但没有被引用的话,
keil 会发出警告,虽然可以编译,但是一大堆警告很烦人,也和容易让人忽视其他很重要警告。我想自己
编写头文件主要是适用于大型工程吧。很多人编写各自不同的函数,然后通过头文件的引用把函数给主程
序或者其他子程序引用。
注:fc.h也可以放在keil/C51/INC下,引用时变为#include <fc.h>
C51编程:头文件条件编译
程序移植到另外一个CPU上,其中头文件要更改。如想做一个兼容的,可用条件编译来控制头文件的编译。
假如有两个头文件my1.h和my2.h,在CPU1上编译my1.h,在CPU2上编译my2.h,则:
#define CPU1 // 在使用CPU1时打开该定义,反之关闭该定义;该定义放在公共入口头文件的顶头
#ifdefine CPU1
#include "my1.h"
#else
#include "my2.h"
#endif
如还有更多文件呢,如system.h,hard.h,这些在两个系统中都要有的,则有区别的就放在这里面,相同的就放在外面
#ifdef CPU1
#include "my1.h"
#include "system1.h"
#include "hard1.h"
#else
#include "my2.h"
#include "system2.h" 也可以是system1.h
#include "hard2.h"
#endif
#include "Public1.h"
...
也可以在各个头文件中把有差异的地方用
#ifdef CPU1
#else
#endif
来区分开来
不仅仅是头文件,其他输出设备以及电路板的不同版本都可采用条件编译
c51中的intrins.h库函数
1..怎么用C51写一个NOP语句呢?
把头文件intrins.h包含进来,然后在需用NOP处调用_nop_();函数即可。
头文件intrins.h包含进来,然后在需用NOP处调用_nop_();函数即可。
2.c51中的intrins.h库函数
_crol_ 字符循环左移
_cror_ 字符循环右移
_irol_ 整数循环左移
_iror_ 整数循环右移
_lrol_ 长整数循环左移
_lror_ 长整数循环右移
_nop_ 空操作8051 NOP 指令
_testbit_ 测试并清零位8051 JBC 指令
详解:
函数名: _crol_,_irol_,_lrol_
原 型: unsigned char _crol_(unsigned char val,unsigned char n);
unsigned int _irol_(unsigned int val,unsigned char n);
unsigned int _lrol_(unsigned int val,unsigned char n);
功 能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051“RLA”指令
相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
C-5 1 程序设计 37
y=0x00ff;
y=_irol_(y,4); /*y=0x0ff0*/
}
函数名: _cror_,_iror_,_lror_
原 型: unsigned char _cror_(unsigned char val,unsigned char n);
unsigned int _iror_(unsigned int val,unsigned char n);
unsigned int _lror_(unsigned int val,unsigned char n);
功 能:_cror_,_iror_,_lror_以位形式将val 右移n 位,该函数与8051“RRA”指令
相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
y=0x0ff00;
y=_iror_(y,4); /*y=0x0ff0*/
}
函数名: _nop_
原 型: void _nop_(void);
功 能:_nop_产生一个NOP 指令,该函数可用作C 程序的时间比较。C51 编译器在_nop_
函数工作期间不产生函数调用,即在程序中直接执行了NOP 指令。
例:
P()=1;
_nop_();
P()=0;
函数名: _testbit_
原 型:bit _testbit_(bit x);
功 能:_testbit_产生一个JBC 指令,该函数测试一个位,当置位时返回1,否则返回0。
如果该位置为1,则将该位复位为0。8051 的JBC 指令即用作此目的。
_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的
伪本征函数——Keil C51头文件INTRINS.H的应用演示
*--------------------------------------------------------------------------
伪本征函数——Keil C51头文件INTRINS.H的应用演示
作者:HotPower@126.com 2004.5.16 第一版
--------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
unsigned char readdata(void)
{
unsigned char val;
for (val = 8; val > 0; val--)
{
_clrb_(TXD);
_nop_();
_movcb_(RXD);
_rrca_();
_setb_(TXD);
_nop_();
}
_movra_(val);
return val;
}
void writedata(unsigned char val)
{
_movar_(val);
for (val = 8; val > 0; val--)
{
_clrb_(TXD);
_rrca_();
_movbc_(RXD);
_setb_(TXD);
_nop_();
}
}
main()
{
unsigned char i;
/*----------------------------------
_movb0_();演示
-----------------------------------*/
i = 0x01;
_movb0_(TXD,i);
i = 0x02;
TXD = i & 0x01;
i = 0x03;
if (i & 0x01) TXD = 1;
else TXD = 0;
/*---------------------------------*/
/*----------------------------------
_movb7_();演示
-----------------------------------*/
i = 0x04;
_movb7_(RXD,i);
i = 0x05;
TXD = i & 0x80;
i = 0x06;
if (i & 0x80) TXD = 1;
else TXD = 0;
i = 0x07;
if (i > = 0x80) TXD = 1;
else TXD = 0;
/*---------------------------------*/
/*----------------------------------
_rlcar_();_movra_()组合演示
-----------------------------------*/
i = 0x08;
_setc_();
_movra_(i);
i < <= 1;
i |= 0x01;
i < <= 1;
i ++;
i += i;
i *= 2;
i ++;
/*---------------------------------*/
/*----------------------------------
_rrcar_();_movra_()组合演示
-----------------------------------*/
i = 0x09;
_setc_();
_rrcar_(i);
_movra_(i);
i > > = 1;
i |= 0x80;
/*---------------------------------*/
i = readdata();
writedata(i);
while(1);
}
为了更好的支持我,如果要转载请注明出处:fengmm521.blog.163.com
欢迎大家去我的个人网站和论坛留下脚印,网站:http://www.k557.com,论坛:http://www.k557.com/bbs