• Keil C251条件编译宏的应用实例


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

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

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

    1. #ifndef __STC32G_DELYAY_H_
    2. #define __STC32G_DELYAY_H_
    3. #include "mtype.h"
    4. #include "STC32G_Timer.h"
    5. #include "STC32G_INT.h"
    6. #include "config.h"
    7. /****************************************
    8. Function: Delayxus(ui16 x);
    9. Return value: void
    10. Discription: soft delay x us
    11. Example:
    12. Delayxus(1);
    13. ****************************************/
    14. void Delayxus(ui16 x);
    15. /****************************************
    16. Function: Delayxms(ui16 x);
    17. Return value: void
    18. Discription: soft delay x ms at fsclk
    19. Example:
    20. Delay1ms(1);
    21. ****************************************/
    22. void Delayxms(ui16 x);
    23. #endif

    下面是STC32G_delay .c源代码

    1. //****************************************
    2. void Delayxus(ui16 x)
    3. {
    4. ui16 i;
    5. #ifdef F11_0592MHz
    6. while(x--)
    7. {
    8. _nop_();
    9. _nop_();
    10. _nop_();
    11. _nop_();
    12. _nop_();
    13. _nop_();
    14. _nop_();
    15. }
    16. #endif
    17. #ifdef F12MHz
    18. while(x--)
    19. {
    20. _nop_();
    21. _nop_();
    22. _nop_();
    23. _nop_();
    24. _nop_();
    25. _nop_();
    26. _nop_();
    27. _nop_();
    28. }
    29. #endif
    30. #ifdef F18_432MHz
    31. while(x--)
    32. {
    33. _nop_();
    34. i = 2UL;
    35. while(i--);
    36. }
    37. #endif
    38. #ifdef F20MHz
    39. while(x--)
    40. {
    41. _nop_();
    42. _nop_();
    43. _nop_();
    44. i = 2UL;
    45. while(i--);
    46. }
    47. #endif
    48. #ifdef F22_1184MHz
    49. while(x--)
    50. {
    51. _nop_();
    52. i = 3UL;
    53. while(i--);
    54. }
    55. #endif
    56. #ifdef F24MHz
    57. while(x--)
    58. {
    59. _nop_();
    60. _nop_();
    61. _nop_();
    62. i = 3UL;
    63. while(i--);
    64. }
    65. #endif
    66. #ifdef F27MHz
    67. while(x--)
    68. {
    69. _nop_();
    70. _nop_();
    71. i = 4UL;
    72. while(i--);
    73. }
    74. #endif
    75. #ifdef F30MHz
    76. while(x--)
    77. {
    78. _nop_();
    79. i = 5UL;
    80. while(i--);
    81. }
    82. #endif
    83. #ifdef F33MHz
    84. while(x--)
    85. {
    86. i = 6UL;
    87. while(i--);
    88. }
    89. #endif
    90. #ifdef F33_1776MHz
    91. while(x--)
    92. {
    93. i = 6UL;
    94. while(i--);
    95. }
    96. #endif
    97. #ifdef F35MHz
    98. while(x--)
    99. {
    100. _nop_();
    101. _nop_();
    102. i = 6UL;
    103. while(i--);
    104. }
    105. #endif
    106. }
    107. //End of Delayxus(ui16 x)
    108. //****************************************/
    109. void Delayxms(ui16 x)
    110. {
    111. ui16 i,j;
    112. #ifdef F11_0592MHz
    113. while(x--)
    114. {
    115. _nop_();
    116. _nop_();
    117. i = 2762UL;
    118. while(i--);
    119. }
    120. #endif
    121. #ifdef F12MHz
    122. while(x--)
    123. {
    124. _nop_();
    125. _nop_();
    126. _nop_();
    127. i = 2997UL;
    128. while(i--i);
    129. }
    130. #endif
    131. #ifdef F18_432MHz
    132. while(x--)
    133. {
    134. _nop_();
    135. _nop_();
    136. _nop_();
    137. i = 4605UL;
    138. while(i--);
    139. }
    140. #endif
    141. #ifdef F20MHz
    142. while(x--)
    143. {
    144. _nop_();
    145. _nop_();
    146. _nop_();
    147. i = 4997UL;
    148. while(i--);
    149. }
    150. #endif
    151. #ifdef F22_1184MHz
    152. while(x--)
    153. {
    154. _nop_();
    155. i = 5527UL;
    156. while(i--);
    157. }
    158. #endif
    159. #ifdef F24MHz
    160. whilee(x--)
    161. {
    162. _nop_();
    163. _nop_();
    164. _nop_();
    165. i = 5997UL;
    166. while (i--);
    167. }
    168. #endif
    169. #ifdef F27MHz
    170. while(x--)
    171. {
    172. _nop_();
    173. _nop_();
    174. _nop_();
    175. i = 6747UL;
    176. while (i--);
    177. }
    178. #endif
    179. #ifdef F30MHz
    180. while(x--)
    181. {
    182. _nop_();
    183. _nop_();
    184. _nop_();
    185. i = 7497UL;
    186. while(i--);
    187. }
    188. #endif
    189. #ifdef F33MHz
    190. while(x--)
    191. {
    192. _nop_();
    193. _nop_();
    194. _nop_();
    195. i = 8247UL;
    196. while (i) i--;
    197. }
    198. #endif
    199. #ifdef F33_1776MHz
    200. while(x--)
    201. {
    202. i = 8292UL;
    203. while(i--);
    204. }
    205. #endif
    206. #ifdef F35MHz
    207. while(x--)
    208. {
    209. _nop_();
    210. _nop_();
    211. _nop_();
    212. i = 8747UL;
    213. while(i--);
    214. }
    215. #endif
    216. }
    217. //End of Delayxms(ui16 x)

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

    1. #ifndef __CONFIG_H__
    2. #define __CONFIG_H__
    3. #define PRINTF_SEGLED //printfÊä³öÖض¨Ïòµ½ISPÏÂÔØÈí¼þÖеÄ7¶ÎÊýÂë¹Ü
    4. //#define PRINTF_HID //printfÊä³öÖ±½ÓÖض¨Ïòµ½USB HID½Ó¿Ú
    5. #define FOSC 30000000UL
    6. //#define F11_0592MHz
    7. //#define F12MHz
    8. //#define F18_432MHz //18.432MHz
    9. //#define F20MHz
    10. //#defimne F22_1184MHz //22.1184MHz
    11. //#define F24MHz
    12. //#define F27MHz
    13. #define F30MHz
    14. //#define F33MHz
    15. //#define F33_1776MHz //33.1776MHz
    16. //#define F35MHz
    17. //********************************************************
    18. void SysInit(); //init System speed fastest
    19. #endif

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

  • 相关阅读:
    简单写一个eventbus
    【CGAL_网格处理】坐标变换
    文件批量搜索器:根据文件名清单查找文件夹内文件移动复制保存
    C++数据类型范围
    Linux常用命令
    【软件测试】软件测试的基础概念
    C++ Reference: Standard C++ Library reference: Containers: array: array: back
    nodejs校园二手交易管理系统vue
    数列求和-加强版
    JAVA春之梦理发店管理计算机毕业设计Mybatis+系统+数据库+调试部署
  • 原文地址:https://blog.csdn.net/billliu66/article/details/127964705