单片机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++);  //延时一会
	}
     }
}

版权声明:
作者:wawooo
链接:http://www.wawooo.com/159.html
来源:挖窝网
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>