找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 13310|回復(fù): 12
打印 上一主題 下一主題
收起左側(cè)

一種基于定時(shí)中斷的按鍵檢測(cè)程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:70650 發(fā)表于 2014-12-20 18:31 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
該程序產(chǎn)生的背景
    話說2012年,小白菜要做一個(gè)三相電壓電流組合表,這個(gè)儀表需要進(jìn)行數(shù)據(jù)輸入(小白菜以前的項(xiàng)目也有輸入,但是小白菜沒有仔細(xì)的研究過),并且給出的時(shí)間很長,小白菜有時(shí)間來做一些“研究處理”。拿著以前寫的按鍵檢測(cè)程序,感覺漏洞百出,于是想著趁著有時(shí)間把這部分做出來,于是便用了一個(gè)星期(實(shí)際是5天,雙休思密達(dá))專門寫了這部分程序。
小白菜的應(yīng)用需求
小白菜的儀表僅需要單短擊(簡(jiǎn)稱單擊)和單長擊(簡(jiǎn)稱長擊),單短擊要在按鍵松開后才進(jìn)行識(shí)別,單長擊要在達(dá)到設(shè)定的時(shí)間閥值時(shí)進(jìn)行識(shí)別(這時(shí)按鍵未松開)。
不需要考慮的情況如下,不需要連擊(可以做為多次短擊)、不需要多鍵同時(shí)擊、暫時(shí)不需要考慮輸入數(shù)字時(shí)長按某鍵,數(shù)字快速自加或自減。
該檢測(cè)程序要滿目不依賴于任何一種單片機(jī),也不依賴按鍵連接方式,如獨(dú)立式,矩陣式(當(dāng)然你要用按鍵掃描芯片那就……你要用AD式鍵盤,我……好吧,你贏了~),能夠獨(dú)立存在。

按鍵過程分析
1 按鍵小思考
正常的按鍵過程(不考慮非法的按鍵狀態(tài))如圖2.1.1。
圖2.1.1 正常按鍵狀態(tài)示意圖
單擊和長擊只是時(shí)間上的區(qū)分而已,但是其識(shí)別時(shí)稍有區(qū)別,單擊是在按鍵松開時(shí)進(jìn)行識(shí)別的,長擊是在按鍵閉合時(shí)進(jìn)行識(shí)別的。見圖2.1.2。
圖2.1.2 長短擊按鍵狀態(tài)示意圖

2 各種可能出現(xiàn)的按鍵情況
合法情況不再贅述。下面把非法(僅在本應(yīng)用中非法)的情況列一下。
(1) 人為或干擾引起的單擊時(shí)間過短(主要為防干擾)。
(2) 單擊時(shí)間過長(與(1)對(duì)應(yīng),凡事有短就有長,要有度嘛~)。
(3) 按下了多個(gè)鍵(與我的應(yīng)用需要相悖,所以非法)。這里有可能是同時(shí)按的,也有可能是異步按下的。
(4) 快速多次按同一個(gè)鍵。這種情況可以歸結(jié)到(1)。
(5) 我覺得沒有了,元芳,你怎么看??
一種基于定時(shí)器按鍵檢測(cè)程序(已測(cè)試).rar (527.02 KB, 下載次數(shù): 260)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:70650 發(fā)表于 2014-12-20 18:32 | 只看該作者
AppStdin.C文件:
  1. /*
  2. ********************************************************************************
  3. * 開發(fā)環(huán)境  : Keil4
  4. * 文件名    : AppStdin.C
  5. * 程序員    : 3htech
  6. * 開發(fā)時(shí)間  : 20120806----
  7. * 描述      : 標(biāo)準(zhǔn)輸入處理,如按鍵。
  8. * 生存條件  :
  9. *-------------------------------------------------------------------------------
  10. * 修 改    :
  11. * 日 期    :
  12. * 描  述    :
  13. *-------------------------------------------------------------------------------
  14. ********************************************************************************
  15. */


  16. //------------------------------    程序開關(guān)    ------------------------------//
  17. //----------------------------------------------------------------------------//
  18. // 名稱 :
  19. // 功能 :
  20. //----------------------------------------------------------------------------//


  21. //------------------------------ 系統(tǒng)頭文件包含 ------------------------------//
  22. // 無

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

  25. //------------------------------  全局變量定義  ------------------------------//

  26. //----------------------------------------------------------------------------//
  27. //變量名稱:KeyScan
  28. //變量功能:按鍵掃描參數(shù)結(jié)構(gòu)體。
  29. //作用域  :全局、對(duì)外完全可見
  30. //重要說明:僅能查詢鍵值KeyScan.u8KeyValue;
  31. //        :您不應(yīng)當(dāng)試圖改寫KeyScan的所有成員。
  32. //----------------------------------------------------------------------------//
  33. KeyScanType KeyScan;

  34. //-------------------------------   宏定義   ---------------------------------//
  35. //----------------------------------------------------------------------------//
  36. //宏名    :
  37. //功能    :
  38. //重要說明:無
  39. //----------------------------------------------------------------------------//



  40. ////////////////////////////////////////////////////////////////////////////////
  41. //                            本文件專用函數(shù)定義                              //
  42. ////////////////////////////////////////////////////////////////////////////////
  43. //----------------------------------------------------------------------------//
  44. //                      按鍵相關(guān)變量清零函數(shù) (僅限本文件使用)
  45. //函數(shù)名稱:App_Key_Clear()
  46. //函數(shù)功能:清零按鍵相關(guān)變量。但不清按鍵寄存器KeyScan.u8KeyValue。
  47. //        :KeyScan.u8KeyValue變量在調(diào)用函數(shù)App_Get_Key_Value()之后自動(dòng)清零。
  48. //入口參數(shù):無
  49. //出口參數(shù):無
  50. //重要說明:無
  51. //編寫日期:20120806
  52. //----------------------------------------------------------------------------//
  53. //修改日期:
  54. //修改人員:
  55. //修改內(nèi)容:
  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. //                      獲取本次掃描時(shí)的按鍵鍵值函數(shù) (僅限本文件使用)
  66. //函數(shù)名稱:App_Get_Current_Key()
  67. //函數(shù)功能:獲取本次掃描時(shí)的按鍵鍵值。
  68. //入口參數(shù):無
  69. //出口參數(shù):返回本次掃描到的鍵值。
  70. //重要說明:無
  71. //編寫日期:20120807
  72. //----------------------------------------------------------------------------//
  73. //修改日期:
  74. //修改人員:
  75. //修改內(nèi)容:
  76. //----------------------------------------------------------------------------//
  77. static uint8 App_Get_Current_Key(void)
  78. {
  79.     uint8 u8Current;

  80.     // 獲取本次掃描的鍵值。硬件上鍵按下時(shí),口線為0,這里翻轉(zhuǎn)一下,即鍵按下時(shí)為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                            // 按鍵出錯(cuò)
  100.     {
  101.         u8Current = KEY_ERR;
  102.     }

  103.     return u8Current;
  104. }
  105. ////////////////////////////////////////////////////////////////////////////////
  106. //                          本文件專用函數(shù)定義結(jié)束                            //
  107. ////////////////////////////////////////////////////////////////////////////////







  108. //============================================================================//
  109. //                             對(duì)外服務(wù)函數(shù)定義                               //
  110. //============================================================================//


  111. //============================================================================//
  112. //                      按鍵初始化函數(shù) (對(duì)外提供服務(wù))
  113. //函數(shù)名稱:App_Init_Key()
  114. //函數(shù)功能:初始化按鍵檢測(cè)所需要的寄存器。
  115. //入口參數(shù):無
  116. //出口參數(shù):無
  117. //重要說明:必須在定時(shí)中斷服務(wù)函數(shù)執(zhí)行前調(diào)用完本函數(shù),使變量一個(gè)合法的初始值
  118. //        :開始運(yùn)行,以防止因?yàn)樽兞侩S機(jī)值而出現(xiàn)誤動(dòng)作的情況。!
  119. //編寫日期:
  120. //============================================================================//
  121. //修改日期:
  122. //修改人員:
  123. //修改內(nèi)容:
  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. //                      按鍵檢測(cè)函數(shù) (對(duì)外提供服務(wù))
  133. //函數(shù)名稱:App_Detect_Key()
  134. //函數(shù)功能:檢測(cè)按鍵。
  135. //入口參數(shù):無
  136. //出口參數(shù):無
  137. //重要說明:請(qǐng)參見按鍵流程圖和狀態(tài)轉(zhuǎn)換圖來讀本程序。本函數(shù)在中斷中調(diào)用。
  138. //        :若有鍵按下,鍵值保存在KeyScan.u8KeyReg變量中。您應(yīng)當(dāng)使用函數(shù)
  139. //        :App_Get_Key_Value()來讀取按鍵值,調(diào)用該函數(shù)后,u8KeyReg變量清零。
  140. //編寫日期:
  141. //============================================================================//
  142. //修改日期:
  143. //修改人員:
  144. //修改內(nèi)容:
  145. //============================================================================//
  146. extern void App_Detect_Key(void)
  147. {
  148.     // 獲取本次掃描時(shí)的鍵值
  149.     KeyScan.u8KeyCurrent = App_Get_Current_Key();

  150.     // 按鍵未發(fā)生錯(cuò)誤
  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.                 // 由于本函數(shù)在中斷中調(diào)用,并且絕大部分時(shí)間都無按鍵操作,所以這里使用
  163.                 // return直接返回,以加速系統(tǒng)響應(yīng)。
  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.                 // 時(shí)間記數(shù)器
  200.                 if(0xFF != KeyScan.u8KeyTimer)
  201.                 {
  202.                     KeyScan.u8KeyOffTimer = 0;
  203.                     KeyScan.u8KeyTimer++;
  204.                 }

  205.                 // 如果時(shí)間已經(jīng)過了長按鍵所要求的最短時(shí)間,則直接認(rèn)為是長按鍵,
  206.                 // 并且把u8KeyErrFlg = FALSE,這樣可以忽略后面的錯(cuò)誤情況的出現(xiàn)。
  207.                 if(KEY_LONG_PRESS_MIN_TIME <= KeyScan.u8KeyTimer)
  208.                 {
  209.                     KeyScan.u8KeyReg = KEY_LONG | KeyScan.u8KeyLast;
  210.                      KeyScan.u8KeyErrFlg = FALSE;
  211.                 }
  212.             }
  213.             // 兩次鍵值不相同,說明按鍵出錯(cuò)。
  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.     // 按鍵發(fā)生錯(cuò)誤
  227.     else
  228.     {
  229.         // 錯(cuò)誤的按鍵已經(jīng)松開
  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. //                      鍵值讀取函數(shù) (對(duì)外提供服務(wù))
  246. //函數(shù)名稱:App_Get_Key_Value()
  247. //函數(shù)功能:讀取按鍵值。用戶可查詢的變量KeyScan.u8KeyValue在本函數(shù)中進(jìn)行賦值操作。
  248. //        :您也可以直接使用KeyScan.u8KeyValue,但使用前一定要先調(diào)用本函數(shù)。
  249. //               合法值為KEY_NULL、KEY_ERR、
  250. //               KEY_ESC、KEY_UP、KEY_ENTER
  251. //               KEY_ESC_L、KEY_UP_L、KEY_ENTER_L
  252. //入口參數(shù):無
  253. //出口參數(shù):讀取到的按鍵值。
  254. //重要說明:該函數(shù)僅能在按鍵處理程序中調(diào)用一次。
  255. //編寫日期:20120808
  256. //============================================================================//
  257. //修改日期:
  258. //修改人員:
  259. //修改內(nèi)容:
  260. //============================================================================//
  261. extern uint8 App_Get_Key_Value(void)
  262. {
  263.     // 這段代碼不允許被打斷,以防止定時(shí)中斷函數(shù)對(duì)鍵值寄存器做賦值操作。
  264.     EA = 0;
  265.     KeyScan.u8KeyValue = KeyScan.u8KeyReg;
  266.     KeyScan.u8KeyReg = KEY_NULL;
  267.     EA = 1;

  268.     return KeyScan.u8KeyValue;
  269. }
  270. ////////////////////////////////////////////////////////////////////////////////
  271. //                           對(duì)外服務(wù)函數(shù)定義結(jié)束                             //
  272. ////////////////////////////////////////////////////////////////////////////////



  273. //------------------------------    文件結(jié)束    ------------------------------//s
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:70650 發(fā)表于 2014-12-20 18:32 | 只看該作者
AppStdin.H文件:
  1. /*
  2. ********************************************************************************
  3. * 開發(fā)環(huán)境  : Keil4
  4. * 文件名    : AppStdin.H
  5. * 程序員    : 3htech
  6. * 開發(fā)時(shí)間  : 20120806----
  7. * 描述      : 標(biāo)準(zhǔn)輸入處理,如按鍵。
  8. * 生存條件  :
  9. *-------------------------------------------------------------------------------
  10. * 修 改    :
  11. * 日 期    :
  12. * 描  述    :
  13. *-------------------------------------------------------------------------------
  14. ********************************************************************************
  15. */

  16. //------------------------------    文件開關(guān)    ------------------------------//
  17. // 防止文件包含時(shí)多次編本文件,與本文件結(jié)尾處的endif對(duì)應(yīng)。
  18. #ifndef         _APPSTDIN_H_
  19.     #define     _APPSTDIN_H_
  20. //----------------------------------------------------------------------------//



  21. //------------------------------ 系統(tǒng)頭文件包含 ------------------------------//
  22. // 無

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


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

  28. //----------------------------------------------------------------------------//
  29. // 編號(hào) :1
  30. // 名稱 :KEY
  31. // 功能 :鍵值。這些鍵值只針對(duì)特定的電路。
  32. //----------------------------------------------------------------------------//
  33. #define  KEY_NULL   (0x00)          // 表示無鍵按下。

  34. #define  KEY_SHORT_MAX_VALUE  (0x03)// 請(qǐng)把短按鍵中宏定義最大的值賦值到此處。

  35. // 短按鍵的宏定義的數(shù)值必須從1開始,最大到15。
  36. #define  KEY_ESC    (0x03)          // 對(duì)應(yīng)硬件上的Key3,P3.3  短按
  37. #define  KEY_UP     (0x02)          // 對(duì)應(yīng)硬件上的Key2,P3.1  短按
  38. #define  KEY_ENTER  (0x01)          // 對(duì)應(yīng)硬件上的Key1,P3.0  短按

  39. #define  KEY_LONG    (0x10)
  40. #define  KEY_ESC_L   (KEY_ESC   | KEY_LONG) // 對(duì)應(yīng)硬件上的Key3,P3.3  長按
  41. #define  KEY_UP_L    (KEY_UP    | KEY_LONG) // 對(duì)應(yīng)硬件上的Key2,P3.1  長按
  42. #define  KEY_ENTER_L (KEY_ENTER | KEY_LONG) // 對(duì)應(yīng)硬件上的Key1,P3.0  長按

  43. #define  KEY_ERR    (0xFF)          // 表示有鍵按下,但是鍵值錯(cuò)誤

  44. //----------------------------------------------------------------------------//
  45. // 編號(hào) :2
  46. // 名稱 :KEY_xxxx_PRESS_MIN_TIME
  47. // 功能 :按鍵識(shí)別時(shí)間。按鍵時(shí)長處于20ms--1s之間的認(rèn)為是短按,1s以外是長按,
  48. //      :不足20ms的是垃圾數(shù)據(jù)。
  49. //----------------------------------------------------------------------------//
  50. #define KEY_LONG_PRESS_MIN_TIME    100      // 最短長按時(shí)間,1s
  51. #define KEY_SHORT_PRESS_MIN_TIME   (2)      // 最短短按時(shí)間,20ms
  52. #define KEY_OFF_MIN_TIME           (3)      // 按鍵松開時(shí),必須經(jīng)過N個(gè)10ms才認(rèn)為是完全松開。

  53. ////////////////////////////////////////////////////////////////////////////////
  54. //                               移植修改結(jié)束                                 //
  55. ////////////////////////////////////////////////////////////////////////////////
  56. //--------------------------------  類型聲明  --------------------------------//
  57. //----------------------------------------------------------------------------//
  58. //類型名稱:KeyScanType
  59. //類型功能:?jiǎn)纹瑱C(jī)掃描按鍵所需要的結(jié)構(gòu)體。
  60. //成員詳解:
  61. //  u8KeyErrFlg, 按鍵發(fā)生錯(cuò)誤標(biāo)志。TRUE = 無錯(cuò)誤,F(xiàn)ALSE = 產(chǎn)生了錯(cuò)誤。

  62. //  u8KeyLast,  上一次掃描時(shí)的按鍵值。這里只是計(jì)錄上一次掃描時(shí)按下的鍵。
  63. //               合法值為KEY_NULL、KEY_ERR、KEY_ESC、KEY_UP、KEY_ENTER
  64. //  u8KeyCurrent,  本次掃描時(shí)的按鍵值。這里只是計(jì)錄本次掃描時(shí)按下的鍵。
  65. //               合法值為KEY_NULL、KEY_ERR、KEY_ESC、KEY_UP、KEY_ENTER
  66. //  u8KeyTimer, 按鍵時(shí)長定時(shí)器。
  67. //  u8KeyOffTimer, 按鍵松開時(shí)長定時(shí)器。
  68. //  u8KeyReg,   鍵值寄存器,按鍵動(dòng)作結(jié)束后,如果未發(fā)生錯(cuò)誤,則該變量中新的按鍵值。
  69. //               您的程序不應(yīng)當(dāng)使用本變量。
  70. //               合法值為KEY_NULL、KEY_ERR、
  71. //               KEY_ESC、KEY_UP、KEY_ENTER
  72. //               KEY_ESC_L、KEY_UP_L、KEY_ENTER_L
  73. //  u8KeyValue,  保存著鍵值,該變量供用戶調(diào)用。該變量是u8KeyReg的一個(gè)復(fù)制版本。
  74. //               該變僅可查詢,您不需要在使用后對(duì)該變量進(jìn)行清零操作。
  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. //變量功能:按鍵掃描參數(shù)結(jié)構(gòu)體。
  93. //作用域  :全局、對(duì)外完全可見
  94. //重要說明:僅能查詢鍵值KeyScan.u8KeyValue;
  95. //        :您不應(yīng)當(dāng)試圖改寫KeyScan的所有成員。
  96. //----------------------------------------------------------------------------//
  97. extern KeyScanType KeyScan;

  98. //-------------------------------   宏定義   ---------------------------------//
  99. //----------------------------------------------------------------------------//
  100. //宏名    :
  101. //功能    :
  102. //重要說明:無
  103. //----------------------------------------------------------------------------//


  104. //-------------------------------    枚舉    ---------------------------------//
  105. //----------------------------------------------------------------------------//
  106. //名稱    :
  107. //功能    :
  108. //重要說明:無
  109. //----------------------------------------------------------------------------//




  110. //============================================================================//
  111. //                                 函數(shù)聲明                                   //
  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. //                               函數(shù)聲明結(jié)束                                 //
  118. //============================================================================//

  119. //------------------------------    文件開關(guān)    ------------------------------//
  120. // 防止文件包含時(shí)多次編本文件,與本文件開頭處的 #ifndef 對(duì)應(yīng)。
  121. #endif
  122. //----------------------------------------------------------------------------//


  123. //------------------------------    文件結(jié)束    ------------------------------//
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

地板
ID:70650 發(fā)表于 2014-12-20 18:34 | 只看該作者
TypeRedefine.H文件:
  1. /*
  2. ********************************************************************************
  3. * 開發(fā)環(huán)境  : Keil4
  4. * 文件名    : TypeRedefine.H
  5. * 程序員    : 3htech
  6. * 開發(fā)時(shí)間  : 2012-06-04
  7. * 描述      : 類型重新定義。
  8. * 生存條件  : 自由存在。
  9. *-------------------------------------------------------------------------------
  10. * 修 改    :
  11. * 日 期    :
  12. * 描  述    :
  13. *-------------------------------------------------------------------------------
  14. ********************************************************************************
  15. */


  16. //------------------------------    文件開關(guān)    ------------------------------//
  17. // 防止文件包含時(shí)多次編本文件,與本文件結(jié)尾處的endif對(duì)應(yīng)。
  18. #ifndef     _TYPEREDEFINE_H_
  19.     #define _TYPEREDEFINE_H_
  20. //----------------------------------------------------------------------------//




  21. //------------------------------ 系統(tǒng)頭文件包含 ------------------------------//
  22. #include<stdio.H>       // 為了使用NULL的定義。

  23. //----------------------------- 自定義頭文件包含 -----------------------------//
  24. //無
  25. //--------------------------------  類型聲明  --------------------------------//
  26. //----------------------------------------------------------------------------//
  27. //類型名稱:
  28. //類型功能:
  29. //成員詳解:
  30. //重要說明:
  31. //----------------------------------------------------------------------------//


  32. //------------------------------  全局變量定義  ------------------------------//
  33. //無


  34. //--------------------------------------------------------------//
  35. //                     類型重新定義
  36. //名稱:類型重新定義
  37. //功能:
  38. //      51系列單片機(jī)應(yīng)用下的類型重新定義。
  39. //      使用的是8位單片機(jī),因此char是8位,int為16位,long為32位
  40. //--------------------------------------------------------------//

  41. typedef  bit  bdata   uint1;    //  無符號(hào)1 位整型變量需要加前綴u1

  42. typedef unsigned char uint8;    // 無符號(hào)8 位整型,前綴u8
  43. typedef   signed char  int8;    // 有符號(hào)8 位整型,前綴i8

  44. typedef unsigned int  uint16;   // 無符號(hào)16位整型,前綴u16
  45. typedef   signed int   int16;   // 有符號(hào)16位整型,前綴i16

  46. typedef unsigned long uint32;   // 無符號(hào)32位整型,前綴u32
  47. typedef   signed long  int32;   // 有符號(hào)32位整型,前綴i32

  48. typedef  float         flt32;   // 單精度浮點(diǎn)數(shù)(32位長度),前綴f32



  49. //-------------------------------   宏定義   ---------------------------------//
  50. //----------------------------------------------------------------------------//
  51. //宏名    :TURE, FALSE
  52. //功能    :錯(cuò)誤標(biāo)志或操作完成標(biāo)志。
  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. //------------------------------    文件開關(guān)    ------------------------------//
  73. // 防止文件包含時(shí)多次編本文件,與本文件開頭處的 #ifndef 對(duì)應(yīng)。
  74. #endif
  75. //----------------------------------------------------------------------------//


  76. //------------------------------    文件結(jié)束    ------------------------------//
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

5#
ID:70650 發(fā)表于 2014-12-20 18:34 | 只看該作者
Config.H文件:
  1. /*
  2. ********************************************************************************
  3. * 開發(fā)環(huán)境  : Keil4
  4. * 文件名    : Config.H
  5. * 程序員    : 3htech
  6. * 開發(fā)時(shí)間  : 2012-06-06
  7. * 描述      : 所有頭文件的總集合
  8. * 生存條件  : 自由存在。
  9. *-------------------------------------------------------------------------------
  10. * 修 改    :
  11. * 日 期    :
  12. * 描  述    :
  13. *-------------------------------------------------------------------------------
  14. ********************************************************************************
  15. */

  16. //------------------------------    文件開關(guān)    ------------------------------//
  17. // 防止文件包含時(shí)多次編本文件,與本文件結(jié)尾處的endif對(duì)應(yīng)。
  18. #ifndef         _CONFIG_H_
  19.     #define     _CONFIG_H_
  20. //----------------------------------------------------------------------------//



  21. //------------------------------ 系統(tǒng)頭文件包含 ------------------------------//
  22. #include<intrins.h>
  23. #include <stdio.H>
  24. #include <stdlib.H>
  25. #include <math.H>

  26. //----------------------------- 自定義頭文件包含 -----------------------------//


  27. // 單片機(jī)頭文件
  28. //=============================//
  29. #include "ATT703x.H"


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



  33. // 應(yīng)用層
  34. //=============================//




  35. // 芯片驅(qū)動(dòng)
  36. //=============================//




  37. // 總線驅(qū)動(dòng)
  38. //=============================//








  39. //------------------------------    文件開關(guān)    ------------------------------//
  40. // 防止文件包含時(shí)多次編本文件,與本文件開頭處的 #ifndef 對(duì)應(yīng)。
  41. #endif
  42. //----------------------------------------------------------------------------//


  43. //------------------------------    文件結(jié)束    ------------------------------//
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

6#
ID:70769 發(fā)表于 2014-12-24 20:25 | 只看該作者
GOOD!!!
回復(fù)

使用道具 舉報(bào)

7#
ID:73757 發(fā)表于 2015-2-23 21:17 | 只看該作者
不錯(cuò),下載來慢慢研究,謝謝!
回復(fù)

使用道具 舉報(bào)

8#
ID:87000 發(fā)表于 2015-7-27 18:20 | 只看該作者
  號(hào)東西呀。!
不知道會(huì)不會(huì)用到了
回復(fù)

使用道具 舉報(bào)

9#
ID:66287 發(fā)表于 2018-2-9 15:43 | 只看該作者
不錯(cuò),很有研究價(jià)值
回復(fù)

使用道具 舉報(bào)

10#
ID:379475 發(fā)表于 2018-8-8 17:10 | 只看該作者
不錯(cuò)   很值得研究
回復(fù)

使用道具 舉報(bào)

11#
ID:290712 發(fā)表于 2018-10-16 14:42 | 只看該作者
謝謝樓主分享。
回復(fù)

使用道具 舉報(bào)

12#
ID:546 發(fā)表于 2018-11-5 15:44 | 只看該作者
向樓主學(xué)習(xí),注譯很清楚
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表