在本教程中,我們將學(xué)習(xí)如何使用另一個IO 引腳作為輸入并控制額外的 LED。在不浪費太多時間的情況下,讓我們評估一下我們需要什么樣的硬件設(shè)置。
硬件設(shè)置和要求
由于需要將開關(guān)用作輸入,我們首先需要的是一個按鈕。我們還需要一個額外的 LED 來由該按鈕控制。除了這兩個之外,我們還需要一個電阻器來限制 LED 電流,以及一個用于下拉按鈕的附加電阻器。這將在示意圖部分進一步說明。我們需要的組件 -
一個按鈕(任何種類的瞬時開關(guān),特別是觸覺開關(guān))
LED的任何顏色
4.7k 下拉電阻
100R電阻
更不用說,除了上述組件,我們還需要基于N76E003 微控制器的開發(fā)板以及Nu-Link 編程器。此外,還需要面包板和連接線來連接所有組件,如下所示。
N76E003 LED和按鈕接口電路
正如我們在下面的示意圖中看到的,開發(fā)板內(nèi)部的測試 LED 連接在端口 1.4上,另外一個 LED 連接在端口 1.5上。電阻 R3 用于限制 LED 電流。
在引腳 1.6 中,連接了一個名為 SW 的按鈕。每當(dāng)按下按鈕時,引腳將變?yōu)楦唠娖健7駝t會被 4.7K的下拉電阻R1 拉低。
該引腳也是編程器訪問的與程序相關(guān)的引腳。它用于發(fā)送程序數(shù)據(jù)。但是,我們將看到選擇這些引腳的原因,并獲得有關(guān)N76E003 引腳映射的公平信息。
N76E003 引腳圖
N76E003的引腳圖如下圖所示——
正如我們所看到的,每個引腳都有多種功能,可以用于不同的目的。讓我們舉個例子。引腳 1.7 可用作中斷、模擬輸入或通用輸入輸出操作。因此,如果任何引腳用作 I/O 引腳,則相應(yīng)的功能將不可用。
因此,用作 LED 輸出引腳的引腳 1.5 將失去 PWM 和其他功能。但這不是問題,因為該項目不需要其他功能。之所以選擇引腳 1.5 作為輸出,引腳 1.6 作為輸入,是因為 GND 和 VDD 引腳最近可用,便于連接。
但是,在這個微控制器的 20 個引腳中,有 18 個引腳可以用作 GPIO 引腳。引腳 2.0 專用于復(fù)位輸入,不能用作輸出。除此引腳外,所有引腳均可配置為下述模式。
根據(jù)數(shù)據(jù)表,PxM1.n 和 PxM2.n 是兩個寄存器,用于確定 I/O 端口的控制操作。現(xiàn)在,開始寫入和讀取 GPIO 端口是完全不同的事情。因為寫入端口控制寄存器會改變端口的鎖存狀態(tài),而讀取端口會獲得邏輯狀態(tài)的狀態(tài)。但要讀取端口,必須將其設(shè)置為輸入模式。
N76E003 的簡單 GPIO 控制程序
本教程使用的完整程序可以在本頁底部找到,代碼解釋如下。
將引腳設(shè)置為輸入
讓我們先從輸入開始。如前所述,要讀取端口的狀態(tài),需要將其設(shè)置為輸入。因此,由于我們選擇了 P1.6 作為我們的輸入開關(guān)引腳,我們通過下面的代碼片段行來表示它。
#define SW P16
需要將相同的引腳設(shè)置為輸入。因此,在設(shè)置功能上,使用下面的行將引腳設(shè)置為輸入。
無效設(shè)置(無效){
P14_準(zhǔn)模式;
P15_準(zhǔn)模式;
P16_輸入模式;
}
這一行P16_Input_Mode; 在“BSP include library”的Function_define.h頭文件中定義,將pin位設(shè)置為P1M1|=SET_BIT6; P1M2&=~SET_BIT6。SET_BIT6也在同一個頭文件中定義為 -
#define SET_BIT6 0x40
將引腳設(shè)置為輸出
與輸入引腳相同,板載測試 LED 和外部 LED1 使用的輸出引腳也在代碼的第一部分中定義了各自的引腳。
#define Test_LED P14
#define LED1 P15
這些引腳使用以下行在設(shè)置函數(shù)中設(shè)置為輸出。
無效設(shè)置(無效){
P14_Quasi_Mode; // 輸出
P15_準(zhǔn)模式;// 輸出
P16_輸入模式;
}
這些行也在Function_define.h頭文件中定義,它將引腳位設(shè)置為P1M1&=~SET_BIT4; P1M2&=~SET_BIT4。SET_BIT6也在同一個頭文件中定義為 -
#define SET_BIT4 0x10
無限循環(huán)
一個硬件,如果連接到電源并且工作正常,應(yīng)該連續(xù)輸出,應(yīng)用程序永遠不會停止。它無限次地做同樣的事情。無限while循環(huán)的功能來了。while 循環(huán)內(nèi)的應(yīng)用程序無限運行。
而(1){
Test_LED = 0;
sw_delay(150);
測試_LED = 1;
sw_delay(150);
如果(SW == 1){
LED1 = 0;
}
其他 {
LED1 = 1;
}
}
}
上面的 while 循環(huán)根據(jù)sw_delay值使 LED 閃爍,并檢查 SW 的狀態(tài)。如果開關(guān)被按下,P1.6 為高電平,因此當(dāng)按下時,讀取狀態(tài)為 1。在這種情況下,當(dāng)開關(guān)被按下并且端口 P1.6 保持高電平時, LED1 將發(fā)光。
對 N76E003 進行編程并驗證輸出
在我們的 N76E003 入門教程中,我們已經(jīng)學(xué)習(xí)了如何對 N76E003 進行編程,因此我們將在這里重復(fù)相同的步驟來對我們的電路板進行編程。代碼編譯成功,返回0個warning和0個Errors,使用Keil默認(rèn)的刷機方式刷機。
如上圖所示,當(dāng)我按下按鈕時,我們的外部 LED 會亮起。
#include "N76E003.h"
#include "SFR_Macro.h"
#include "函數(shù)定義.h"
#include "Common.h"
#include "延遲.h"
#define Test_LED P14
#define LED1 P15
#define SW P16
無效設(shè)置(無效);
無效 sw_delay (int ms);
無效的主要(無效){
設(shè)置();
而(1){ Test_LED = 0;
sw_delay(150);
測試_LED = 1;
sw_delay(150);
如果(SW == 1){
LED1 = 0;
}
別的 {
LED1 = 1;
}
}
}
// 基于軟件的延遲。時間不準(zhǔn)確。
無效 sw_delay (int ms){
整數(shù)a,b;
對于(a=0;a<1296;a++){
對于 (b=0; b
}
//這是應(yīng)用程序運行前的設(shè)置文件
無效設(shè)置(無效){
P14_準(zhǔn)模式;
P15_準(zhǔn)模式;
P16_輸入模式;
}
-
led
+關(guān)注
關(guān)注
242文章
23362瀏覽量
663244 -
LED閃爍
+關(guān)注
關(guān)注
0文章
29瀏覽量
9874 -
IO引腳
+關(guān)注
關(guān)注
0文章
10瀏覽量
9445
發(fā)布評論請先 登錄
相關(guān)推薦
stm32g030j6m6串口如何燒錄程序,NRST引腳能否在作為輸入IO使用時不復(fù)位?
無線io輸入控制模塊
FPGA Cyclone IV擴展IO作為輸入時的電平判斷
FPGA的擴展IO引腳作為輸入直接采集信號?
請問在運行時配置PIC 32中選擇的IO引腳作為輸入和輸出的最佳方式是什么?
DM642的GP0作為通用IO時,是可以做為輸入和輸出,還是只能作為輸入?
把IO口作為外部中斷輸入有幾個步驟
介紹下IO口作為輸入的使用
stm32f1的io口作為輸出的使用方法
STM32的引腳可以作為普通IO口使用嗎
使用Adafruit IO作為MQTT控制Raspberry Pi GPIO的AC設(shè)備
![使用Adafruit <b class='flag-5'>IO</b><b class='flag-5'>作為</b>MQTT<b class='flag-5'>控制</b>Raspberry Pi GPIO的AC設(shè)備](https://file.elecfans.com/web2/M00/66/72/poYBAGMQbOiARbUtAAEGtMapGzc982.png)
評論