<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                * 導師視頻講解:[**去聽課**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=8) >[success] **技術支持說明:** >**1**.一般以自主學習為主 > **2**.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/zigbee) > **3**.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> 接著上節課的內容,切換到按鍵的工程,如圖所示。 ![](https://img.kancloud.cn/34/8f/348f54bae51d61f9ad384ef7e7598c65_456x438.png =200x) <br/> ## **按鈕原理簡介** 配套的ZigBee開發板均配備有按鍵,其原理圖如圖所示。 ![](https://img.kancloud.cn/a2/1b/a21b31bbb8ef80a9a6499718b90c876e_512x582.png =250x) >[danger] 如您缺少硬件原理相關知識導致未能看懂本圖,需先補充相關知識 圖中K5是一個按鈕,R11是一枚100KΩ的上拉電阻,P0_1是CC2530的一個IO口,相關原理如下: (1)當按鈕沒有按下時,P0_1通過上拉電阻R11接到3v3,所以P0_1的輸入電平為高電平。 (2)當按鍵按下時,P0_1接地,所以P0_1的輸入電平為低電平。 由以上分析可知,可以檢測P0_1的輸入電平狀態來檢測按鈕是否被按下。 <br/> ## **P0\_1相關寄存器** 與LED實驗類似,要檢測P0\_1的輸入電平狀態,就必須要先配置一下相關寄存器。P0\_1的相關寄存器建下表。 ### | 寄存器 | 說明 | | --- | --- | | P0 | 8位寄存器,8個位分別與P0\_0~P0\_7一一對應,分別用于設置或讀取這8個IO口的電平狀態 | | P0SEL | 8位寄存器,8個位分別與P0\_0~P0\_7一一對應,分別配置這8個IO口的功能。如果IO口對應的位為0,表示該IO口用于通用輸入/輸出;如果為1,表示用于特定的功能 | | P0DIR | 8位寄存器,8個位分別與P0\_0~P0\_7一一對應,分別配置這8個IO口的通信方向。如果IO口對應的位為0,表示該IO口處于輸入信號模式;如果為1,表示處于輸出信號模式 | | P0INP | 8位寄存器,8個位分別與P0\_0~P0\_7一一對應,分別配置這8個IO口的輸入模式。如果IO口對應的位為0,表示該IO口為上拉/下拉輸入模式;如果為1,表示三態模式 | | P2INP\[7:5\] | P2INP寄存器的第5、6和7位分別用于配置端0、1和2的上拉或下拉模式,如果為0,表示上拉模式;如果為1,表示下拉模式 | <br/> #### **上拉與下拉輸入** 相關寄存器中涉及到上拉和下拉輸入,對其簡單講解一下。通俗地講,上拉是指在默認的狀態下給IO口輸入高電平,與之相反,下拉就是低電平。根據上文的按鍵原理圖可知,這是一個上拉輸入模式。按鍵原理示意圖如圖所示。 ![](https://img.kancloud.cn/8a/fe/8afe532dbcb328f8e3de0ee743b48905_704x468.png =600x) ### 當按鍵沒有被按下時,CC2530與3.3v電源連接,其引腳的輸入電平為高電平(對應信號1)。當按鈕被按下時,CC2530與GND連接,其引腳的輸入電平為低電平(對應信號0)。 <br/> #### **寄存器配置** 通過以上分析,相關寄存器的配置代碼如下: ### ``` P0SEL &= ~(1<<1);//把P0SEL寄存器的第1位設置為0,即讓P0_1用作通用IO口 P0DIR &= ~(1<<1);//把P0DIR寄存器的第1位設置為0,即讓讓P0_1處于輸入信號模式 P0INP &= ~(1<<1);//把P0INP寄存器的第1位設置為0,即讓P0_1處于上拉/下拉輸入模式 P2INP &= ~(1<<5);//把P2INP寄存器的第5位設置為0,即讓端口0處于上拉輸入模式 ``` <br/> ## **編寫按鍵代碼** 編寫代碼實現每按一下按鍵就翻轉一下LED的開關狀態,打開Key文件夾中的key.c文件,可以看到如下示例代碼: ### ``` //2. 51單片機入門/2. GPIO實驗/Workspace/code/key/key.c #include "ioCC2530.h" #include <stdio.h> #include <stdint.h> #define DEBUG //#define xDEBUG #ifdef DEBUG #define DEBUG_LOG(...) printf(__VA_ARGS__) #else #define DEBUG_LOG(...) #endif #define LED P0_4 #define LED_ON 1 #define LED_OFF 0 /** * @brief 按鈕及其狀態的定義。其中,P0_1是在頭文件ioCC2530.h,可以檢測其值來判斷P0_1引腳的電平狀態 */ #define BUTTON P0_1 #define BUTTON_NORMAL 1//按鈕的默認狀態 #define BUTTON_DOWN 0//按鈕被按下 static void delayMs(uint16_t nMs); static void initLed(void); static void initButton(void); void?main()??{?? initLed();//初始化LED ????initButton();//初始化按鍵 ? ????while(1)?{ ????????if?(BUTTON?!=?BUTTON_DOWN)//如果按鍵沒有被按下 continue;//結束本次while循環 ????????else?{ /* 以下為對按鍵的機械抖動的處理處理代碼 */ delayMs(10);//延后10毫秒 if?(BUTTON?!=?BUTTON_DOWN)//再次檢測按鈕的狀態,如果按鍵沒有被按下 continue;//結束本次while循環 }?? ?????? ????????while?(BUTTON?==?BUTTON_DOWN);//等待BUTTON?!=?BUTTON_DOWN,即等待按鍵松開 ???????? ????????DEBUG_LOG("Key?Pressed!\r\n");?? ????????LED?=?(LED?==?LED_ON)??LED_OFF?:?LED_ON;//翻轉LED的狀態 } } static void delayMs(uint16_t nMs) { uint16_t i,j; for (i = 0; i < nMs; i++) for (j = 0; j < 535; j++); } static void initLed() { P0SEL &= ~(1<<4); P0DIR |= (1<<4); } /* * @fn initButton * * @brief 初始化Button,完成P0_1相關寄存器的配置 */ static void initButton() { P0SEL &= ~(1<<1);//把P0SEL寄存器的第1位設置為0,即讓P0_1用作通用IO口 P0DIR &= ~(1<<1);//把P0DIR寄存器的第1位設置為0,即讓讓P0_1處于輸入信號模式 P0INP &= ~(1<<1);//把P0INP寄存器的第1位設置為0,即讓P0_1處于上拉/下拉輸入模式 P2INP &= ~(1<<5);//把P2INP寄存器的第5位設置為0,即讓端口0處于上拉輸入模式 } ``` <br/> #### **處理機械按鍵抖動** 上述代碼包含了按鍵抖動的處理,對其簡單講解一下。由于按鍵內部采用了彈簧,所以當按鍵被按下或松開的時候,會產生一定的震動,這種震動可以稱為機械抖動。這種機械抖動會導致電平的抖動,如圖所示。 ![](https://img.kancloud.cn/58/ae/58ae4a38afad2fe5ddf33ded2e021b26_582x324.png =200x) 圖中的中的橫坐標是電平,縱坐標是時間,展示了按鈕從按下到松開這個過程的電平變化。按鍵被按下時產生的抖動稱為前沿抖動,松開時產生的是后沿抖動。這個抖動時間一般持續5~10ms。因此在代碼上當檢測到按鈕被按下后,需要延后10ms后再檢測一次按鈕是否真的被按下。 <br/> #### **使用調試模式** 在程序開發調試過程中,可設置一個調試模式。在調試模式下可以輸出相關的調試信息來了解程序運行狀態。然而在程序開發完成后,可以關閉調試模式,停止輸出調試信息。 ### DEBUG\_LOG是一個宏定義,其定義在上述代碼的開端處。 * 當代碼定義了 DEBUG 這個宏時,表示當前模式是調試模式,此時DEBUG\_LOG和printf是一致的。 * 而沒有定義DEBUG 這個宏時,表示關閉調試模式,此時DEBUG\_LOG什么都不做。所以,當需要關閉調試模式時,可以把DEBUG更改為xDEBUG,表示關閉調試模式。 <br/> ## **仿真調試** 1. 把開發板通過仿真器連接到電腦上。 2. 按一下仿真器的復位按鍵。 ![](https://img.kancloud.cn/a6/65/a66518b91448e99ee3e1594218f21591_1710x612.png =200x) ### 3. 打開本實驗代碼,打開調試模式,編譯鏈接通過后,點擊“下載仿真”按鈕全速運行程序,每當有按鍵按下時Terminal I/O中就會輸出相應的信息,如圖所示。 ![](https://img.kancloud.cn/03/38/03381fce1d48e5c5c0057963f798d1a4_830x274.png =600x) <br/> <br/> ## **商務合作** 如有以下需求,可掃碼添加管理員好友,注明“**商務合作**” * 項目定制開發,技術范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等; * 入駐平臺,成為講師; * 接項目賺外快; * 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非合作**勿擾**,此處**非**技術支持
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看