找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12318|回复: 12
收起左侧

一种基于定时中断的按键检测程序

  [复制链接]
ID:70650 发表于 2014-12-20 18:31 | 显示全部楼层 |阅读模式
该程序产生的背景
    话说2012年,小白菜要做一个三相电压电流组合表,这个仪表需要进行数据输入(小白菜以前的项目也有输入,但是小白菜没有仔细的研究过),并且给出的时间很长,小白菜有时间来做一些“研究处理”。拿着以前写的按键检测程序,感觉漏洞百出,于是想着趁着有时间把这部分做出来,于是便用了一个星期(实际是5天,双休思密达)专门写了这部分程序。
小白菜的应用需求
小白菜的仪表仅需要单短击(简称单击)和单长击(简称长击),单短击要在按键松开后才进行识别,单长击要在达到设定的时间阀值时进行识别(这时按键未松开)。
不需要考虑的情况如下,不需要连击(可以做为多次短击)、不需要多键同时击、暂时不需要考虑输入数字时长按某键,数字快速自加或自减。
该检测程序要满目不依赖于任何一种单片机,也不依赖按键连接方式,如独立式,矩阵式(当然你要用按键扫描芯片那就……你要用AD式键盘,我……好吧,你赢了~),能够独立存在。

按键过程分析
1 按键小思考
正常的按键过程(不考虑非法的按键状态)如图2.1.1。
2249085zccjmnojx9qxeni.jpg
图2.1.1 正常按键状态示意图
单击和长击只是时间上的区分而已,但是其识别时稍有区别,单击是在按键松开时进行识别的,长击是在按键闭合时进行识别的。见图2.1.2。
224908h5c8rckfofjrg35j.jpg
图2.1.2 长短击按键状态示意图

2 各种可能出现的按键情况
合法情况不再赘述。下面把非法(仅在本应用中非法)的情况列一下。
(1) 人为或干扰引起的单击时间过短(主要为防干扰)。
(2) 单击时间过长(与(1)对应,凡事有短就有长,要有度嘛~)。
(3) 按下了多个键(与我的应用需要相悖,所以非法)。这里有可能是同时按的,也有可能是异步按下的。
(4) 快速多次按同一个键。这种情况可以归结到(1)。
(5) 我觉得没有了,元芳,你怎么看??
一种基于定时器按键检测程序(已测试).rar (527.02 KB, 下载次数: 257)
回复

使用道具 举报

ID:70650 发表于 2014-12-20 18:32 | 显示全部楼层
AppStdin.C文件:
  1. /*
  2. ********************************************************************************
  3. * 开发环境  : Keil4
  4. * 文件名    : AppStdin.C
  5. * 程序员    : 3htech
  6. * 开发时间  : 20120806----
  7. * 描述      : 标准输入处理,如按键。
  8. * 生存条件  :
  9. *-------------------------------------------------------------------------------
  10. * 修 改    :
  11. * 日 期    :
  12. * 描  述    :
  13. *-------------------------------------------------------------------------------
  14. ********************************************************************************
  15. */


  16. //------------------------------    程序开关    ------------------------------//
  17. //----------------------------------------------------------------------------//
  18. // 名称 :
  19. // 功能 :
  20. //----------------------------------------------------------------------------//


  21. //------------------------------ 系统头文件包含 ------------------------------//
  22. // 无

  23. //----------------------------- 自定义头文件包含 -----------------------------//
  24. #include"Config.H"

  25. //------------------------------  全局变量定义  ------------------------------//

  26. //----------------------------------------------------------------------------//
  27. //变量名称:KeyScan
  28. //变量功能:按键扫描参数结构体。
  29. //作用域  :全局、对外完全可见
  30. //重要说明:仅能查询键值KeyScan.u8KeyValue;
  31. //        :您不应当试图改写KeyScan的所有成员。
  32. //----------------------------------------------------------------------------//
  33. KeyScanType KeyScan;

  34. //-------------------------------   宏定义   ---------------------------------//
  35. //----------------------------------------------------------------------------//
  36. //宏名    :
  37. //功能    :
  38. //重要说明:无
  39. //----------------------------------------------------------------------------//



  40. ////////////////////////////////////////////////////////////////////////////////
  41. //                            本文件专用函数定义                              //
  42. ////////////////////////////////////////////////////////////////////////////////
  43. //----------------------------------------------------------------------------//
  44. //                      按键相关变量清零函数 (仅限本文件使用)
  45. //函数名称:App_Key_Clear()
  46. //函数功能:清零按键相关变量。但不清按键寄存器KeyScan.u8KeyValue。
  47. //        :KeyScan.u8KeyValue变量在调用函数App_Get_Key_Value()之后自动清零。
  48. //入口参数:无
  49. //出口参数:无
  50. //重要说明:无
  51. //编写日期:20120806
  52. //----------------------------------------------------------------------------//
  53. //修改日期:
  54. //修改人员:
  55. //修改内容:
  56. //----------------------------------------------------------------------------//
  57. static void App_Key_Clear(void)
  58. {
  59.     KeyScan.u8KeyErrFlg = TRUE;
  60.     KeyScan.u8KeyLast   = KEY_NULL;
  61.     KeyScan.u8KeyTimer  = 0;
  62.     KeyScan.u8KeyOffTimer  = 0;

  63. }
  64. //----------------------------------------------------------------------------//
  65. //                      获取本次扫描时的按键键值函数 (仅限本文件使用)
  66. //函数名称:App_Get_Current_Key()
  67. //函数功能:获取本次扫描时的按键键值。
  68. //入口参数:无
  69. //出口参数:返回本次扫描到的键值。
  70. //重要说明:无
  71. //编写日期:20120807
  72. //----------------------------------------------------------------------------//
  73. //修改日期:
  74. //修改人员:
  75. //修改内容:
  76. //----------------------------------------------------------------------------//
  77. static uint8 App_Get_Current_Key(void)
  78. {
  79.     uint8 u8Current;

  80.     // 获取本次扫描的键值。硬件上键按下时,口线为0,这里翻转一下,即键按下时为1.
  81.     u8Current = 0x07 & (~P3);

  82.     // 键值翻译
  83.     if(0x00 == u8Current)        // 无键按下
  84.     {
  85.         u8Current = KEY_NULL;
  86.     }
  87.     else if(0x01 == u8Current)   // Key1按下
  88.     {
  89.         u8Current = KEY_ENTER;
  90.     }
  91.     else if(0x02 == u8Current)   // Key2按下
  92.     {
  93.         u8Current = KEY_UP;
  94.     }
  95.     else if(0x04 == u8Current)   // Key3按下
  96.     {
  97.         u8Current = KEY_ESC;
  98.     }
  99.     else                            // 按键出错
  100.     {
  101.         u8Current = KEY_ERR;
  102.     }

  103.     return u8Current;
  104. }
  105. ////////////////////////////////////////////////////////////////////////////////
  106. //                          本文件专用函数定义结束                            //
  107. ////////////////////////////////////////////////////////////////////////////////







  108. //============================================================================//
  109. //                             对外服务函数定义                               //
  110. //============================================================================//


  111. //============================================================================//
  112. //                      按键初始化函数 (对外提供服务)
  113. //函数名称:App_Init_Key()
  114. //函数功能:初始化按键检测所需要的寄存器。
  115. //入口参数:无
  116. //出口参数:无
  117. //重要说明:必须在定时中断服务函数执行前调用完本函数,使变量一个合法的初始值
  118. //        :开始运行,以防止因为变量随机值而出现误动作的情况!!!
  119. //编写日期:
  120. //============================================================================//
  121. //修改日期:
  122. //修改人员:
  123. //修改内容:
  124. //============================================================================//
  125. extern void App_Init_Key(void)
  126. {
  127.     App_Key_Clear();

  128.     KeyScan.u8KeyReg    = KEY_NULL;
  129.     KeyScan.u8KeyValue  = KEY_NULL;
  130. }
  131. //============================================================================//
  132. //                      按键检测函数 (对外提供服务)
  133. //函数名称:App_Detect_Key()
  134. //函数功能:检测按键。
  135. //入口参数:无
  136. //出口参数:无
  137. //重要说明:请参见按键流程图和状态转换图来读本程序。本函数在中断中调用。
  138. //        :若有键按下,键值保存在KeyScan.u8KeyReg变量中。您应当使用函数
  139. //        :App_Get_Key_Value()来读取按键值,调用该函数后,u8KeyReg变量清零。
  140. //编写日期:
  141. //============================================================================//
  142. //修改日期:
  143. //修改人员:
  144. //修改内容:
  145. //============================================================================//
  146. extern void App_Detect_Key(void)
  147. {
  148.     // 获取本次扫描时的键值
  149.     KeyScan.u8KeyCurrent = App_Get_Current_Key();

  150.     // 按键未发生错误
  151.     if(TRUE == KeyScan.u8KeyErrFlg)
  152.     {
  153.         //===========================================================//
  154.         // 本次单按键松开或无键按下
  155.         if(KEY_NULL == KeyScan.u8KeyCurrent)
  156.         {
  157.             // 上次也无键按下
  158.             if(KEY_NULL == KeyScan.u8KeyLast)
  159.             {
  160.                 KeyScan.u8KeyTimer  = 0;
  161.                 KeyScan.u8KeyOffTimer  = 0;
  162.                 // 由于本函数在中断中调用,并且绝大部分时间都无按键操作,所以这里使用
  163.                 // return直接返回,以加速系统响应。
  164.                 return ;
  165.             }
  166.             else
  167.             {
  168.                 KeyScan.u8KeyOffTimer++;
  169.                 if(KEY_OFF_MIN_TIME <= KeyScan.u8KeyOffTimer)
  170.                 {
  171.                     // 上次有键按下,且键值合法
  172.                     if(KEY_SHORT_MAX_VALUE >= KeyScan.u8KeyLast)
  173.                     {
  174.                         // 短按
  175.                         if(    (KEY_SHORT_PRESS_MIN_TIME <= KeyScan.u8KeyTimer)
  176.                             && (KEY_LONG_PRESS_MIN_TIME  >  KeyScan.u8KeyTimer))
  177.                         {
  178.                             KeyScan.u8KeyReg = KeyScan.u8KeyLast;
  179.                         }
  180.                     }

  181.                     App_Key_Clear();
  182.                 }// if(KEY_OFF_MIN_TIME <= KeyScan.u8KeyOffTimer)
  183.             }// if(KEY_NULL == KeyScan.u8KeyLast) else
  184.         }// if(KEY_NULL == KeyScan.u8KeyCurrent)

  185.         //===========================================================//
  186.         // 本次按键值合法。
  187.         else if(KEY_SHORT_MAX_VALUE >= KeyScan.u8KeyCurrent)
  188.         {
  189.             // 上次无键按下
  190.             if(KEY_NULL == KeyScan.u8KeyLast)
  191.             {
  192.                 // 记录键值
  193.                 KeyScan.u8KeyLast  = KeyScan.u8KeyCurrent;
  194.                 KeyScan.u8KeyTimer++;
  195.             }
  196.             // 上次有键按下,且两次按键相同
  197.             else if(KeyScan.u8KeyCurrent == KeyScan.u8KeyLast)
  198.             {
  199.                 // 时间记数器
  200.                 if(0xFF != KeyScan.u8KeyTimer)
  201.                 {
  202.                     KeyScan.u8KeyOffTimer = 0;
  203.                     KeyScan.u8KeyTimer++;
  204.                 }

  205.                 // 如果时间已经过了长按键所要求的最短时间,则直接认为是长按键,
  206.                 // 并且把u8KeyErrFlg = FALSE,这样可以忽略后面的错误情况的出现。
  207.                 if(KEY_LONG_PRESS_MIN_TIME <= KeyScan.u8KeyTimer)
  208.                 {
  209.                     KeyScan.u8KeyReg = KEY_LONG | KeyScan.u8KeyLast;
  210.                      KeyScan.u8KeyErrFlg = FALSE;
  211.                 }
  212.             }
  213.             // 两次键值不相同,说明按键出错。
  214.             else
  215.             {
  216.                 KeyScan.u8KeyErrFlg = FALSE;
  217.             }
  218.         }// else if(KEY_SHORT_MAX_VALUE >= u8KeyCurrent)

  219.         //===========================================================//
  220.         // 本次按键值非法
  221.         else
  222.         {
  223.             KeyScan.u8KeyErrFlg = FALSE;
  224.         }
  225.     }//if(TRUE == KeyScan.u8KeyErrFlg)

  226.     // 按键发生错误
  227.     else
  228.     {
  229.         // 错误的按键已经松开
  230.         if(KEY_NULL == KeyScan.u8KeyCurrent)
  231.         {
  232.             KeyScan.u8KeyOffTimer++;
  233.             if(KEY_OFF_MIN_TIME <= KeyScan.u8KeyOffTimer)
  234.             {
  235.                 App_Key_Clear();
  236.             }
  237.         }
  238.         else
  239.         {
  240.             KeyScan.u8KeyOffTimer = 0;
  241.         }
  242.     }//if(TRUE == KeyScan.u8KeyErrFlg) else
  243. }

  244. //============================================================================//
  245. //                      键值读取函数 (对外提供服务)
  246. //函数名称:App_Get_Key_Value()
  247. //函数功能:读取按键值。用户可查询的变量KeyScan.u8KeyValue在本函数中进行赋值操作。
  248. //        :您也可以直接使用KeyScan.u8KeyValue,但使用前一定要先调用本函数。
  249. //               合法值为KEY_NULL、KEY_ERR、
  250. //               KEY_ESC、KEY_UP、KEY_ENTER
  251. //               KEY_ESC_L、KEY_UP_L、KEY_ENTER_L
  252. //入口参数:无
  253. //出口参数:读取到的按键值。
  254. //重要说明:该函数仅能在按键处理程序中调用一次。
  255. //编写日期:20120808
  256. //============================================================================//
  257. //修改日期:
  258. //修改人员:
  259. //修改内容:
  260. //============================================================================//
  261. extern uint8 App_Get_Key_Value(void)
  262. {
  263.     // 这段代码不允许被打断,以防止定时中断函数对键值寄存器做赋值操作。
  264.     EA = 0;
  265.     KeyScan.u8KeyValue = KeyScan.u8KeyReg;
  266.     KeyScan.u8KeyReg = KEY_NULL;
  267.     EA = 1;

  268.     return KeyScan.u8KeyValue;
  269. }
  270. ////////////////////////////////////////////////////////////////////////////////
  271. //                           对外服务函数定义结束                             //
  272. ////////////////////////////////////////////////////////////////////////////////



  273. //------------------------------    文件结束    ------------------------------//s
复制代码
回复

使用道具 举报

ID:70650 发表于 2014-12-20 18:32 | 显示全部楼层
AppStdin.H文件:
  1. /*
  2. ********************************************************************************
  3. * 开发环境  : Keil4
  4. * 文件名    : AppStdin.H
  5. * 程序员    : 3htech
  6. * 开发时间  : 20120806----
  7. * 描述      : 标准输入处理,如按键。
  8. * 生存条件  :
  9. *-------------------------------------------------------------------------------
  10. * 修 改    :
  11. * 日 期    :
  12. * 描  述    :
  13. *-------------------------------------------------------------------------------
  14. ********************************************************************************
  15. */

  16. //------------------------------    文件开关    ------------------------------//
  17. // 防止文件包含时多次编本文件,与本文件结尾处的endif对应。
  18. #ifndef         _APPSTDIN_H_
  19.     #define     _APPSTDIN_H_
  20. //----------------------------------------------------------------------------//



  21. //------------------------------ 系统头文件包含 ------------------------------//
  22. // 无

  23. //----------------------------- 自定义头文件包含 -----------------------------//
  24. #include"Config.H"


  25. ////////////////////////////////////////////////////////////////////////////////
  26. //                            移植修改(2处)                                   //
  27. ////////////////////////////////////////////////////////////////////////////////

  28. //----------------------------------------------------------------------------//
  29. // 编号 :1
  30. // 名称 :KEY
  31. // 功能 :键值。这些键值只针对特定的电路。
  32. //----------------------------------------------------------------------------//
  33. #define  KEY_NULL   (0x00)          // 表示无键按下。

  34. #define  KEY_SHORT_MAX_VALUE  (0x03)// 请把短按键中宏定义最大的值赋值到此处。

  35. // 短按键的宏定义的数值必须从1开始,最大到15。
  36. #define  KEY_ESC    (0x03)          // 对应硬件上的Key3,P3.3  短按
  37. #define  KEY_UP     (0x02)          // 对应硬件上的Key2,P3.1  短按
  38. #define  KEY_ENTER  (0x01)          // 对应硬件上的Key1,P3.0  短按

  39. #define  KEY_LONG    (0x10)
  40. #define  KEY_ESC_L   (KEY_ESC   | KEY_LONG) // 对应硬件上的Key3,P3.3  长按
  41. #define  KEY_UP_L    (KEY_UP    | KEY_LONG) // 对应硬件上的Key2,P3.1  长按
  42. #define  KEY_ENTER_L (KEY_ENTER | KEY_LONG) // 对应硬件上的Key1,P3.0  长按

  43. #define  KEY_ERR    (0xFF)          // 表示有键按下,但是键值错误

  44. //----------------------------------------------------------------------------//
  45. // 编号 :2
  46. // 名称 :KEY_xxxx_PRESS_MIN_TIME
  47. // 功能 :按键识别时间。按键时长处于20ms--1s之间的认为是短按,1s以外是长按,
  48. //      :不足20ms的是垃圾数据。
  49. //----------------------------------------------------------------------------//
  50. #define KEY_LONG_PRESS_MIN_TIME    100      // 最短长按时间,1s
  51. #define KEY_SHORT_PRESS_MIN_TIME   (2)      // 最短短按时间,20ms
  52. #define KEY_OFF_MIN_TIME           (3)      // 按键松开时,必须经过N个10ms才认为是完全松开。

  53. ////////////////////////////////////////////////////////////////////////////////
  54. //                               移植修改结束                                 //
  55. ////////////////////////////////////////////////////////////////////////////////
  56. //--------------------------------  类型声明  --------------------------------//
  57. //----------------------------------------------------------------------------//
  58. //类型名称:KeyScanType
  59. //类型功能:单片机扫描按键所需要的结构体。
  60. //成员详解:
  61. //  u8KeyErrFlg, 按键发生错误标志。TRUE = 无错误,FALSE = 产生了错误。

  62. //  u8KeyLast,  上一次扫描时的按键值。这里只是计录上一次扫描时按下的键。
  63. //               合法值为KEY_NULL、KEY_ERR、KEY_ESC、KEY_UP、KEY_ENTER
  64. //  u8KeyCurrent,  本次扫描时的按键值。这里只是计录本次扫描时按下的键。
  65. //               合法值为KEY_NULL、KEY_ERR、KEY_ESC、KEY_UP、KEY_ENTER
  66. //  u8KeyTimer, 按键时长定时器。
  67. //  u8KeyOffTimer, 按键松开时长定时器。
  68. //  u8KeyReg,   键值寄存器,按键动作结束后,如果未发生错误,则该变量中新的按键值。
  69. //               您的程序不应当使用本变量。
  70. //               合法值为KEY_NULL、KEY_ERR、
  71. //               KEY_ESC、KEY_UP、KEY_ENTER
  72. //               KEY_ESC_L、KEY_UP_L、KEY_ENTER_L
  73. //  u8KeyValue,  保存着键值,该变量供用户调用。该变量是u8KeyReg的一个复制版本。
  74. //               该变仅可查询,您不需要在使用后对该变量进行清零操作。
  75. //重要说明:
  76. //----------------------------------------------------------------------------//
  77. typedef struct
  78. {
  79.     PRIVATE
  80.     uint8  u8KeyErrFlg;
  81.     uint8  u8KeyLast;
  82.     uint8  u8KeyCurrent;
  83.     uint8  u8KeyTimer;
  84.     uint8  u8KeyOffTimer;
  85.     uint8  u8KeyReg;

  86.     PUBLIC
  87.     uint8  u8KeyValue;
  88. }KeyScanType;

  89. //------------------------------  全局变量声明  ------------------------------//

  90. //----------------------------------------------------------------------------//
  91. //变量名称:KeyScan
  92. //变量功能:按键扫描参数结构体。
  93. //作用域  :全局、对外完全可见
  94. //重要说明:仅能查询键值KeyScan.u8KeyValue;
  95. //        :您不应当试图改写KeyScan的所有成员。
  96. //----------------------------------------------------------------------------//
  97. extern KeyScanType KeyScan;

  98. //-------------------------------   宏定义   ---------------------------------//
  99. //----------------------------------------------------------------------------//
  100. //宏名    :
  101. //功能    :
  102. //重要说明:无
  103. //----------------------------------------------------------------------------//


  104. //-------------------------------    枚举    ---------------------------------//
  105. //----------------------------------------------------------------------------//
  106. //名称    :
  107. //功能    :
  108. //重要说明:无
  109. //----------------------------------------------------------------------------//




  110. //============================================================================//
  111. //                                 函数声明                                   //
  112. //============================================================================//
  113. extern void App_Init_Key(void);
  114. extern uint8 App_Get_Key_Value(void);

  115. extern void App_Detect_Key(void);

  116. //============================================================================//
  117. //                               函数声明结束                                 //
  118. //============================================================================//

  119. //------------------------------    文件开关    ------------------------------//
  120. // 防止文件包含时多次编本文件,与本文件开头处的 #ifndef 对应。
  121. #endif
  122. //----------------------------------------------------------------------------//


  123. //------------------------------    文件结束    ------------------------------//
复制代码
回复

使用道具 举报

ID:70650 发表于 2014-12-20 18:34 | 显示全部楼层
TypeRedefine.H文件:
  1. /*
  2. ********************************************************************************
  3. * 开发环境  : Keil4
  4. * 文件名    : TypeRedefine.H
  5. * 程序员    : 3htech
  6. * 开发时间  : 2012-06-04
  7. * 描述      : 类型重新定义。
  8. * 生存条件  : 自由存在。
  9. *-------------------------------------------------------------------------------
  10. * 修 改    :
  11. * 日 期    :
  12. * 描  述    :
  13. *-------------------------------------------------------------------------------
  14. ********************************************************************************
  15. */


  16. //------------------------------    文件开关    ------------------------------//
  17. // 防止文件包含时多次编本文件,与本文件结尾处的endif对应。
  18. #ifndef     _TYPEREDEFINE_H_
  19.     #define _TYPEREDEFINE_H_
  20. //----------------------------------------------------------------------------//




  21. //------------------------------ 系统头文件包含 ------------------------------//
  22. #include<stdio.H>       // 为了使用NULL的定义。

  23. //----------------------------- 自定义头文件包含 -----------------------------//
  24. //无
  25. //--------------------------------  类型声明  --------------------------------//
  26. //----------------------------------------------------------------------------//
  27. //类型名称:
  28. //类型功能:
  29. //成员详解:
  30. //重要说明:
  31. //----------------------------------------------------------------------------//


  32. //------------------------------  全局变量定义  ------------------------------//
  33. //无


  34. //--------------------------------------------------------------//
  35. //                     类型重新定义
  36. //名称:类型重新定义
  37. //功能:
  38. //      51系列单片机应用下的类型重新定义。
  39. //      使用的是8位单片机,因此char是8位,int为16位,long为32位
  40. //--------------------------------------------------------------//

  41. typedef  bit  bdata   uint1;    //  无符号1 位整型变量需要加前缀u1

  42. typedef unsigned char uint8;    // 无符号8 位整型,前缀u8
  43. typedef   signed char  int8;    // 有符号8 位整型,前缀i8

  44. typedef unsigned int  uint16;   // 无符号16位整型,前缀u16
  45. typedef   signed int   int16;   // 有符号16位整型,前缀i16

  46. typedef unsigned long uint32;   // 无符号32位整型,前缀u32
  47. typedef   signed long  int32;   // 有符号32位整型,前缀i32

  48. typedef  float         flt32;   // 单精度浮点数(32位长度),前缀f32



  49. //-------------------------------   宏定义   ---------------------------------//
  50. //----------------------------------------------------------------------------//
  51. //宏名    :TURE, FALSE
  52. //功能    :错误标志或操作完成标志。
  53. //重要说明:无
  54. //----------------------------------------------------------------------------//
  55. #ifndef TRUE
  56.     #define TRUE  0
  57. #endif

  58. #ifndef FALSE
  59.     #define FALSE 1
  60. #endif

  61. //----------------------------------------------------------------------------//
  62. //宏名    :PRIVATE, PUBLIC
  63. //功能    :仅仅显示表明哪些是私有变量,哪些可以自由访问。
  64. //重要说明:无
  65. //----------------------------------------------------------------------------//
  66. #ifndef PRIVATE
  67.     #define PRIVATE
  68. #endif

  69. #ifndef PUBLIC
  70.     #define PUBLIC
  71. #endif
  72. //------------------------------    文件开关    ------------------------------//
  73. // 防止文件包含时多次编本文件,与本文件开头处的 #ifndef 对应。
  74. #endif
  75. //----------------------------------------------------------------------------//


  76. //------------------------------    文件结束    ------------------------------//
复制代码
回复

使用道具 举报

ID:70650 发表于 2014-12-20 18:34 | 显示全部楼层
Config.H文件:
  1. /*
  2. ********************************************************************************
  3. * 开发环境  : Keil4
  4. * 文件名    : Config.H
  5. * 程序员    : 3htech
  6. * 开发时间  : 2012-06-06
  7. * 描述      : 所有头文件的总集合
  8. * 生存条件  : 自由存在。
  9. *-------------------------------------------------------------------------------
  10. * 修 改    :
  11. * 日 期    :
  12. * 描  述    :
  13. *-------------------------------------------------------------------------------
  14. ********************************************************************************
  15. */

  16. //------------------------------    文件开关    ------------------------------//
  17. // 防止文件包含时多次编本文件,与本文件结尾处的endif对应。
  18. #ifndef         _CONFIG_H_
  19.     #define     _CONFIG_H_
  20. //----------------------------------------------------------------------------//



  21. //------------------------------ 系统头文件包含 ------------------------------//
  22. #include<intrins.h>
  23. #include <stdio.H>
  24. #include <stdlib.H>
  25. #include <math.H>

  26. //----------------------------- 自定义头文件包含 -----------------------------//


  27. // 单片机头文件
  28. //=============================//
  29. #include "ATT703x.H"


  30. // 公共层
  31. //=============================//
  32. #include "TypeRedefine.H"



  33. // 应用层
  34. //=============================//




  35. // 芯片驱动
  36. //=============================//




  37. // 总线驱动
  38. //=============================//








  39. //------------------------------    文件开关    ------------------------------//
  40. // 防止文件包含时多次编本文件,与本文件开头处的 #ifndef 对应。
  41. #endif
  42. //----------------------------------------------------------------------------//


  43. //------------------------------    文件结束    ------------------------------//
复制代码
回复

使用道具 举报

ID:70769 发表于 2014-12-24 20:25 | 显示全部楼层
GOOD!!!
回复

使用道具 举报

ID:73757 发表于 2015-2-23 21:17 | 显示全部楼层
不错,下载来慢慢研究,谢谢!
回复

使用道具 举报

ID:87000 发表于 2015-7-27 18:20 | 显示全部楼层
  号东西呀!!!
不知道会不会用到了
回复

使用道具 举报

ID:66287 发表于 2018-2-9 15:43 | 显示全部楼层
不错,很有研究价值
回复

使用道具 举报

ID:379475 发表于 2018-8-8 17:10 | 显示全部楼层
不错   很值得研究
回复

使用道具 举报

ID:290712 发表于 2018-10-16 14:42 | 显示全部楼层
谢谢楼主分享!!
回复

使用道具 举报

ID:546 发表于 2018-11-5 15:44 | 显示全部楼层
向楼主学习,注译很清楚
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表