单片机C语言入门之八#define宏定义流水灯
在前面各章中,已多次使用过以“#”号开头的预处理命令。如包含命令#include,宏定义命令#define等。预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。
在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。 在C语言中,“宏”分为有参数和无参数两种。下面分别讨论这两种“宏”的定义和调用。
无参宏的宏名后不带参数。其定义的一般形式为:
#define 标识符 字符串
其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。
在前面介绍过的符号常量的定义就是一种无参宏定义。此外,常对程序中反复使用的表达式进行宏定义。例如:
#define M (y*y+3*y)
#define PI 3.14159
第一条M它的作用是指定标识符M来代替表达式(y*y+3*y)。在编写源程序时,所有的(y*y+3*y)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式去置换所有的宏名M,然后再进行编译。涉及到运算时注意(y*y+3*y),两边括号不能少,否则会因为优先级导致计算结果错误。
C语言允许宏带有参数,带参宏定义的一般形式为:
#define 宏名(形参表) 字符串
在字符串中含有各个形参。带参宏调用的一般形式为:
宏名(实参表);
例如:
#define M(y) y*y+3*y /*宏定义*/
……
k=M(5); /*宏调用*/
……
在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为:k=5*5+3*5
就说这么多了,来看个不带参数的宏定义单片机例子。
#include<stc12.h> //STC12系列头文件
#define uint unsigned int //宏定义uint来替代unsigned int 在程序中只需使用uint即可
#define uchar unsigned char //宏定义uchar来替代unsigned char 在程序中只需使用uchar即可
#define LED P0 //LED来替代P0 程序中使用LED即代表P0
sbit LEDK = P1^4;
uchar code LEDarray[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void main(void)
{
uchar i=0; //变量i的值初始化为0
uint k; //定义变量
LEDK=0; //置0使PNP型三极管导通LED负极接地
P0=0x00; //P0口电平初始化为0 关闭全部LED
P0M1=0x00;
P0M0=0xff; //P0口全部设置为推挽输出 见手册87页 IO口模式配置
while(1)
{
for(i=0;i<8;i++)
{
LED=LEDarray[i];//就是P0=LEDarray[i]
for(k=0;k<50000;k++); //延时一会
}
}
}