条件编译宏通常是以#ifdef 或者#ifndef开头 ,以#endif结尾,在编译满足条件的就被编译,不符合条件的就不被编译,即所谓的条件编译。它不可代替条件语句及条件转移语句,同样条件语句及条件转移语句也不可能代替条件编译宏。条件编译宏常用于元件的驱动固件,可针对不同的工作模式,选择编译,可建设编译后程序的大小。例如LCD1602,4线、8线工作模式驱动代码的选择编译。本文将以STC32G 软件延时程序为例,详细讲解,条件编译宏的应用。

我们知道STC32单片机内部集成高精度R/C时钟,可不需要外部晶振。ISP编程时4MHz~33MHfanwei范围时钟频率可选择设置。我们可以依据实际需求,选择设置单片机的系统时钟频率。软件延时程序与单片机的系统时钟频率相关,如果我们针对每一系统时钟频率写一延时程序,管理·起来就很麻烦。这里我们使用条件编译宏就可巧妙地解决这一问题。

下面是软件延时程序的头文件的部分代码

#ifndef __STC32G_DELYAY_H_
#define __STC32G_DELYAY_H_
#include "mtype.h"
#include "STC32G_Timer.h"
#include "STC32G_INT.h"
#include "config.h"/****************************************
Function: Delayxus(ui16 x);
Return value: void
Discription: soft delay x us
Example:
Delayxus(1);
****************************************/
void Delayxus(ui16 x);/****************************************
Function: Delayxms(ui16 x);
Return value: void
Discription: soft delay x ms at fsclk
Example:
Delay1ms(1);
****************************************/
void Delayxms(ui16 x);#endif

下面是STC32G_delay .c源代码

//****************************************
void Delayxus(ui16 x)
{ui16 i;#ifdef F11_0592MHzwhile(x--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}#endif#ifdef F12MHzwhile(x--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}#endif #ifdef F18_432MHzwhile(x--){_nop_();i = 2UL;while(i--);}#endif#ifdef F20MHzwhile(x--){_nop_();_nop_();_nop_();i = 2UL;while(i--);}#endif#ifdef F22_1184MHzwhile(x--){_nop_();i = 3UL;while(i--);}#endif#ifdef F24MHzwhile(x--){_nop_();_nop_();_nop_();i = 3UL;while(i--);}#endif#ifdef F27MHzwhile(x--){_nop_();_nop_();i = 4UL;while(i--);}#endif#ifdef F30MHzwhile(x--){_nop_();i = 5UL;while(i--);}#endif#ifdef F33MHzwhile(x--){i = 6UL;while(i--);}#endif#ifdef F33_1776MHzwhile(x--){i = 6UL;while(i--);}#endif#ifdef F35MHzwhile(x--){_nop_();_nop_();i = 6UL;while(i--);}#endif
}
//End of Delayxus(ui16 x)//****************************************/
void Delayxms(ui16 x)
{ui16 i,j;#ifdef F11_0592MHzwhile(x--){_nop_();_nop_();i = 2762UL;while(i--);}#endif#ifdef F12MHzwhile(x--){_nop_();_nop_();_nop_();i = 2997UL;while(i--i);}#endif#ifdef F18_432MHzwhile(x--){_nop_();_nop_();_nop_();i = 4605UL;while(i--);}#endif#ifdef F20MHzwhile(x--){_nop_();_nop_();_nop_();i = 4997UL;while(i--);}#endif#ifdef F22_1184MHzwhile(x--){_nop_();i = 5527UL;while(i--);}#endif#ifdef F24MHzwhilee(x--){_nop_();_nop_();_nop_();i = 5997UL;while (i--);}#endif#ifdef F27MHzwhile(x--){_nop_();_nop_();_nop_();i = 6747UL;while (i--);}#endif#ifdef F30MHzwhile(x--){_nop_();_nop_();_nop_();i = 7497UL;while(i--);}#endif#ifdef F33MHzwhile(x--){_nop_();_nop_();_nop_();i = 8247UL;while (i) i--;}#endif#ifdef F33_1776MHzwhile(x--){i = 8292UL;while(i--);}#endif#ifdef F35MHzwhile(x--){_nop_();_nop_();_nop_();i = 8747UL;while(i--);}#endif
}
//End of Delayxms(ui16 x)

下面是config.h的代码,在 config.h中选择配置系统时钟,在下载程序时选择的系统时钟须与该配置一致。

#ifndef __CONFIG_H__
#define __CONFIG_H__#define PRINTF_SEGLED           //printfÊä³öÖض¨Ïòµ½ISPÏÂÔØÈí¼þÖеÄ7¶ÎÊýÂë¹Ü
//#define PRINTF_HID            //printfÊä³öÖ±½ÓÖض¨Ïòµ½USB HID½Ó¿Ú#define  FOSC   30000000UL
//#define    F11_0592MHz
//#define  F12MHz
//#define  F18_432MHz    //18.432MHz
//#define  F20MHz
//#defimne  F22_1184MHz    //22.1184MHz
//#define  F24MHz
//#define  F27MHz#define  F30MHz
//#define  F33MHz
//#define  F33_1776MHz   //33.1776MHz
//#define  F35MHz
//********************************************************
void SysInit(); //init System speed  fastest#endif

以上程序已通过实际验证。

Keil C251条件编译宏的应用实例相关推荐

  1. KEIL工程中汇编文件添加条件编译宏

    在项目中,移植第三方组件到工程中,由于出现相同的函数定义导致程序链接时出现重复定义问题.后来考虑添加条件编译宏来控制使用自己的函数还是第三方组件的宏.在C文件中,通过#if/#else/#endif或 ...

  2. KEIL,#ifdef宏定义下失效代码差异性显示

    KEIL,#ifdef宏定义下失效代码差异性显示 下图代码中我没有定义OS_USING_VFS,但是该段宏定义下的代码和普通代码显示无差异,不方便调试查找问题. 打开配置: 在Text Complet ...

  3. 加工中心宏程序c语言,加工中心宏程序编程实例与技巧方法

    <加工中心宏程序编程实例与技巧方法>由会员分享,可在线阅读,更多相关<加工中心宏程序编程实例与技巧方法(15页珍藏版)>请在人人文库网上搜索. 1.用户宏程序编程,在数控编程中 ...

  4. 条件编译宏定义_C语言学习- 预处理指令2 - 条件编译

    上一篇已经介绍了预处理指令中的宏定义,这篇就介绍一下条件编译! 条件编译的概念 在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执 ...

  5. WPS JS宏表格定位实例

    工具软件:WPS JS宏编辑器 实例功能: 给你这样的功课表,将各位老师的功课定位到任课情况中去. 任课情况表: 本实例的定位要实现将功课表的各教师任教情况定位到表中,实现上有一定的难度. 代码实现思 ...

  6. Keil中使用宏编译来定义DEBUG输出

    使用宏编译来格式化调试信息,是一个不错的方法,即可以在需要的时候打印出信息,还可以格式化我们所需要的输出. #define DEBUG 1 #if (DEBUG == 1) #define DBG(A ...

  7. C语言函数调用及宏定义代码实例

    函数 #include<stdio.h>int square(int x); int square(int x){return x * x; }/*** 求x的平方*/ int main( ...

  8. labview运行excel宏_LabVIEW编程实例:电子表格文件的读写操作方法

    问题引出 在使用LabVIEW软件编写大型测试程序时,很多时候需要将原始采样数据或者分析处理后的数据在硬盘上存储为文件,而存储的格式可以是直观的普通的文本文件,也可以是占用空间小的二进制文件,除了这些 ...

  9. Keil 二进制数输入宏

    源:http://hi.baidu.com/skystalker/item/e7679cd79c6f751220e250c1?qq-pf-to=pcqq.c2c 在C语言中有十进制,十六进制,八进制; ...

最新文章

  1. 2022-2028年中国节能建材行业深度调研及投资前景预测报告
  2. 哥们,你真以为你会做这道JVM面试题?
  3. python—Celery异步分布式
  4. JS如何捆绑TypeScript声明文件
  5. Struts2 Result详解
  6. 有关android 应用的plugin框架调研
  7. window7开放端sqlserver端口
  8. 【uiautomator】UiDevice
  9. 下列哪个不是it行业技术岗位_28岁毕业进入IT互联网行业从事技术研发岗位是否还来得及...
  10. python3 从尾部读取_Python3基础:列表详解
  11. 机器学习Tensorflow基本操作:线程队列图像
  12. javascript中对象、JSON格式数据、创建对象的方式、数据类型分类及特点
  13. 2020年视频号发展白皮书
  14. Java中的Arrays类使用详解
  15. 电压跟随器不要随便加
  16. 环境工程学(整理知识点)
  17. PowerBI开发 第三篇:报表设计技巧
  18. Android 发送短信
  19. 经济学积累(二)一些经济学词汇及概念
  20. C语言学习笔记之初识

热门文章

  1. github搜索技巧:搜索star数量大于10000的Java项目
  2. 匈牙利算法和卡尔曼滤波器
  3. 网页设计作业使用Dreamweaver输入空格字符快捷键
  4. 电商运营流程图模板分享,附赠绘制流程图方法
  5. ant design pro charts图表渲染之后台数据类型转换
  6. 中文汉字转换拼音功能实现
  7. Java设计模式之JDK动态代理模式
  8. Python 修复 ImportError: cannot import name Markup from jinja2
  9. Android动画-Animation原理解析
  10. Mysql通用语法及分析