用户工具

站点工具


侧边栏

抱歉,您没有权限增加页面
3.单片机c语言:9._define宏定义

八位流水灯学单片机C语言之宏定义

在前面各章中,已多次使用过以“#”号开头的预处理命令。如包含命令#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++);  //延时一会
	   }
	}
}
  以上代码完整工程在\STC51 Discovery\实验例程\基础实验\实验十二
3.单片机c语言/9._define宏定义.txt · 最后更改: 2017/03/01 14:54 由 wawooo