報警控制面板幾乎是每個人日常生活的一部分,無論是在家里還是在工作中。本文介紹使用MAXQ2000低功耗LCD微控制器的報警控制應(yīng)用示例,該微控制器是在MAX-IDE開發(fā)環(huán)境中創(chuàng)建的。MAXQ2000可以方便地與安全應(yīng)用中常用的外設(shè)接口,包括LCD顯示器、PIN輸入鍵盤、壓電喇叭和蜂鳴器以及磁簧開關(guān)。
常見的報警控制面板包含多個輸入設(shè)備,需要用戶顯示器。這些系統(tǒng)的常用組件包括:
接受用戶輸入的設(shè)備:4 x 4 開關(guān)鍵盤。
向用戶顯示輸出的設(shè)備:LCD顯示器。
輸入設(shè)備:磁簧開關(guān)。
輸出裝置:壓電喇叭。
這幾個元件可以通過簡單的應(yīng)用和功能強大、靈活的MAXQ2000微控制器進行管理和控制。該應(yīng)用可供下載,是使用MAX-IDE開發(fā)環(huán)境用MAXQ匯編語言編寫的。該代碼針對MAXQ2000評估板,使用以下附加硬件:
鍵盤:灰山 16 按鈕(4 行 x 4 列)鍵盤 96BB2-006-F
壓電喇叭:CEP-1172
磁簧開關(guān):標(biāo)準(zhǔn)單回路型
設(shè)計目標(biāo)
我們的示例應(yīng)用程序執(zhí)行以下任務(wù):
監(jiān)視磁簧開關(guān)以確定門/窗是打開還是關(guān)閉。
允許用戶通過在鍵盤上輸入 PIN 來布防或撤防系統(tǒng)。
在液晶屏上向用戶顯示狀態(tài)信息。
通過發(fā)出壓電喇叭的聲音,提供按鍵和傳感器打開/關(guān)閉事件的音頻指示。
如果在系統(tǒng)布防時傳感器打開,則連續(xù)發(fā)出喇叭聲。
報警控制應(yīng)用程序的行為由四種離散狀態(tài)組成:關(guān)閉、打開、設(shè)置和警報(圖 1)。
圖1.警報控制應(yīng)用程序在四種主要狀態(tài)下運行:關(guān)閉、打開、設(shè)置和警報。
磁簧開關(guān)接口
在報警系統(tǒng)中,磁簧開關(guān)安裝在兩部分:磁鐵和實際的磁簧開關(guān)。磁鐵部分放置在門或窗的移動部分,而開關(guān)部分放置在框架上。當(dāng)門或窗關(guān)閉時,磁鐵關(guān)閉簧片開關(guān),指示非報警狀態(tài)。如果系統(tǒng)布防,門窗打開,簧片開關(guān)改變狀態(tài),允許MAXQ2000發(fā)出入侵警報。
干簧開關(guān)只需連接端口引腳P2000.5和P2.5即可連接至MAXQ3。當(dāng) P5.2 設(shè)置為/下拉 (PD = 1, PO = 0) 且 P5.3 設(shè)置為弱上拉輸入 (PD = 0, PO = 1) 時,當(dāng)磁簧開關(guān)閉合時,P5.3 將讀取零,當(dāng)磁簧開關(guān)打開時,P<>.<> 將讀取 <>。
move PD5.2, #1 ; Drive one side of reed switch LOW move PO5.2, #0 move PD5.3, #0 ; Set weak pullup high on other side move PO5.3, #1 ... ML_Closed_Check: move C, PI5.3 jump NC, ML_Closed_L ; Switch is closed, continue in this state call ShortBeep call ShortPause call ShortBeep call ShortPause call ShortBeep call ShortPause call ShortBeep call ShortPause jump ML_Open ; Switch is open, transition to OPEN state
與 4 x 4 鍵盤接口
鍵盤用于報警控制系統(tǒng),用于安全輸入PIN碼、布防/撤防系統(tǒng)以及更改配置。此示例應(yīng)用程序中使用的鍵盤由 16 個開關(guān)組成,以 4 x 4 網(wǎng)格形式組織。開關(guān)以行和列矩陣連接在一起(圖2),因此按下鍵盤開關(guān)將一行連接到一列線。例如,按下“3”鍵將第 1 行和第 3 列連接在一起。
圖2.鍵盤開關(guān)形成一個由四行四列組成的網(wǎng)格。
鍵盤提供八個接口引腳,鍵盤矩陣的每一行和每列一個引腳。鍵盤和MAXQ2000評估板如圖所示連接。
針 | 連接 | 端口銷 | JU2 引腳 |
1 | 第 1 行 | P6.0 | 54 |
2 | 第 2 行 | P6.1 | 52 |
3 | 第 3 行 | P6.2 | 50 |
4 | 第 4 行 | P6.3 | 48 |
5 | 科爾 1 | P6.4 | 46 |
6 | 科爾 2 | P6.5 | 44 |
7 | 科爾 3 | P7.0 | 42 |
8 | 科爾 4 | P7.1 | 40 |
對于此應(yīng)用,評估板應(yīng)配置如下。
撥碼開關(guān)。
以下開關(guān)必須關(guān)閉:所有 SW1 交換機、SW3.1、SW3.7、SW3.8、SW6.1、SW6.4、SW6.5、SW6.6、SW6.7 和 SW6.8。
所有其他 DIP 開關(guān)可以處于任何狀態(tài)。
運動員
以下跳線必須處于打開狀態(tài):JU5、JU6、JU8 和 JU9。
必須關(guān)閉以下跳線:JU1、JU2、JU3 和 JU11。
所有其他跳線可以處于任何狀態(tài)。
按列掃描
鍵盤的行和列排列使得在任何時候都可以輕松讀取四個開關(guān)的狀態(tài),無論是行還是列。要在一列中讀取四個開關(guān),首先必須將該列的行拉低,所有其他列三態(tài)(圖 3)。接下來,必須在每行線上設(shè)置一個弱上拉。最后,四行線連接到端口引腳輸入。當(dāng)按下某一行上的開關(guān)時,該行的輸入將為低電平,否則為高電平。
類似地,通過將該行線拉低并在所有四列上設(shè)置輸入和弱上拉,可以讀取連續(xù)四個開關(guān)的狀態(tài)。行和列是可以互換的。
在我們的設(shè)置中,四行線(鍵盤引腳 1 到 4)都連接到同一個輸入端口 (P6[3:0]),這使得同時讀取它們更容易。因此,示例應(yīng)用程序一次掃描一列交換機。連接到鍵盤的八個端口引腳線有四種設(shè)置狀態(tài),每種狀態(tài)都允許讀取四個開關(guān)。當(dāng)正在讀取的開關(guān)閉合時,所有輸入線都讀低,當(dāng)開關(guān)打開時,所有輸入線都讀高。
州 | P6.0 | P6.1 | P6.2 | P6.3 | P6.4 | P6.5 | P7.0 | P7.1 |
1 | 輸入 - 1 | 輸入 - 4 | 輸入 - 7 | 輸入-* | 低 | 三態(tài) | 三態(tài) | 三態(tài) |
2 | 輸入 - 2 | 輸入 - 5 | 輸入 - 8 | 輸入 - 0 | 三態(tài) | 低 | 三態(tài) | 三態(tài) |
3 | 輸入 - 3 | 輸入 - 6 | 輸入 - 9 | 輸入-# | 三態(tài) | 三態(tài) | 低 | 三態(tài) |
4 | 輸入 - A | 輸入 - B | 輸入 - C | 輸入 - D | 三態(tài) | 三態(tài) | 三態(tài) | 低 |
圖3.MAXQ2000將列1拉低,讀取前四個鍵盤開關(guān)的狀態(tài)。
中斷驅(qū)動的狀態(tài)機
這四列必須快速發(fā)送,以便任何按鍵在釋放之前都有時間閱讀。此外,為防止開關(guān)的彈跳觸點注冊多次按下,在注冊之前必須按住鍵一定時間。通過將定時器驅(qū)動的中斷例程作為應(yīng)用程序的核心,可以同時完成這兩個因素。這允許應(yīng)用程序定期掃描四列中的每一列,并計算按下鍵的時間長度。
RELOAD equ 0FF00h StartTimer: move IIR.3, #1 ; Enable interrupts for module 3 move IMR.3, #1 move T2V0, #RELOAD move T2R0, #0h move T2C0, #0h move Acc, T2CFG0 ; Set timer 0 to run from HFClk/128 and #08Fh or #070h move T2CFG0, Acc move T2CNA0.3, #1 ; Start timer 0 move T2CNA0.7, #1 ; Enable timer 0 interrupts ret
計時器的重新加載值控制中斷觸發(fā)的頻率。此值必須足夠短,以便識別所有按鍵。此外,為了確保密鑰響應(yīng)不會緩慢,重新加載值也必須足夠長,以便它不會占用過多的處理時間。上面顯示的值0FF00h(大約每2.4ms一次)是通過實驗達到的。
一旦一組四個開關(guān)的列線被驅(qū)動為低電平,則可能需要一些時間才能通過按下的開關(guān)操作的連接將其輸入線拉低。該時間受開關(guān)的導(dǎo)通電阻和同時按下多少列開關(guān)的影響。為了避免在將柱線拉低和讀取四個開關(guān)之間延遲中斷服務(wù)例程,給定狀態(tài)的柱線在前一個狀態(tài)下被驅(qū)動為低電平(圖 4)。
圖4.在四種按鍵掃描狀態(tài)中,應(yīng)用程序讀取四個開關(guān)的狀態(tài),并準(zhǔn)備讀取接下來的四個開關(guān)。
由于MAXQ2000的中斷向量(IV)可以即時設(shè)置,應(yīng)用在中斷向量寄存器中保存下一個狀態(tài)值。每當(dāng)計時器中斷觸發(fā)時,當(dāng)前密鑰掃描狀態(tài)的處理程序例程都會將中斷向量地址設(shè)置為下一個狀態(tài)的處理程序例程。
org 0000h Main: call InitializeLCD move PD6, #010h ; For state 1 move PO6, #00Fh ; For all states move PD7, #000h ; For state 1 move PO7, #000h ; For all states move IV, #State1 call StartTimer move IC, #1 ; Enable global interrupts jump $ State1: push PSF push Acc move Acc, PI6 and #000Fh ; Grab lowest four bits only sla4 move A[13], Acc move PD6, #020h ; For state 2 move PD7, #000h move T2V0, #RELOAD ; Set reload value move T2CNB0.1, #0 ; Clear interrupt flags move T2CNB0.3, #0 move IV, #State2 pop Acc pop PSF reti
其他四種狀態(tài)的處理程序例程類似,只是在 A[13] 保持寄存器中先前收集的開關(guān)位中略微調(diào)整為 OR。狀態(tài)例程使用三個工作累加器。
A[13] 保存通過鍵盤的電流傳遞上讀取的所有開關(guān)狀態(tài)的位數(shù)組。狀態(tài) 4 讀取完成后,此寄存器包含以下位,其中一位表示打開(釋放)鍵開關(guān),零位表示關(guān)閉(按下)鍵開關(guān)。
位 15 |
位 14 |
位 13 |
位 12 |
位 11 |
位 10 |
位 9 |
位 8 |
位 7 |
位 6 |
位 5 |
位 4 |
位 3 |
位 2 |
位 1 |
位 0 |
* | 7 | 4 | 1 | 2 | 5 | 8 | 0 | 3 | 6 | 9 | # | D | C | B | 一個 |
去抖動開關(guān)
達到狀態(tài) 4 并掃描所有鍵后,必須決定是否接受按下的任何鍵。處理去抖動的一種簡單方法是為 16 個開關(guān)中的每一個保持一個計數(shù)器值。每次達到狀態(tài) 4 并按下該鍵時,計數(shù)器都會遞增。如果未按下該鍵,計數(shù)器將遞減。當(dāng)計數(shù)器達到某個值時,將注冊按鍵。為了防止按住鍵重復(fù)(通常在計算機鍵盤上允許,但在小鍵盤上不允許),必須允許計數(shù)器遞減到零(通過釋放鍵),然后才能再次注冊該鍵。
由于我們在單個寄存器中擁有所有 16 個鍵的狀態(tài),因此有一種更簡單、內(nèi)存密集度更低的去抖動解決方案。應(yīng)用程序維護單個計數(shù)器值,每次位模式與上一次傳遞中讀取的模式匹配時,該計數(shù)器值都會遞增。
State4: push PSF push Acc move Acc, PI6 and #000Fh ; Grab low four bits only or A[13] cmp A[15] jump E, State4_End ; Ignore the last debounced pattern cmp A[14] jump E, State4_Match move LC[0], #DEBOUNCE move A[14], Acc ; Reset current bit array
為了防止鍵重復(fù),一旦位模式靜態(tài)足夠長,就可以接受,必須先接受不同的位模式(包括未按下任何鍵的空閑狀態(tài)),然后才能再次接受第一個位模式。
處理同時按鍵
使用鍵盤輸入設(shè)備時,可以同時按鍵。去抖動代碼可確保如果在第一個鍵之后立即按下第二個鍵,則去抖間隔將重新開始,但在實踐中要足夠短,以免成為問題。
一旦位模式被接受,就可以通過使用累加器將所有 16 位單獨旋轉(zhuǎn)到進位中并依次檢查每個位來執(zhí)行每個按下鍵位的操作。以下代碼僅響應(yīng)第一個按下的鍵,但這可以很容易地更改。
State4_Match: djnz LC[0], State4_End move A[15], Acc ; Reset last debounced pattern rrc jump NC, State4_KeyA rrc jump NC, State4_KeyB rrc jump NC, State4_KeyC rrc jump NC, State4_KeyD rrc jump NC, State4_Key3 rrc jump NC, State4_Key6 rrc jump NC, State4_Key9 rrc jump NC, State4_KeyPound rrc jump NC, State4_Key2 rrc jump NC, State4_Key5 rrc jump NC, State4_Key8 rrc jump NC, State4_Key0 rrc jump NC, State4_Key1 rrc jump NC, State4_Key4 rrc jump NC, State4_Key7 rrc jump NC, State4_KeyStar jump State4_End
與液晶顯示器接口
MAXQ2000評估板附帶的LCD顯示屏具有如圖5所示的段定義。
圖5.LCD 顯示屏包含 7 個半 <> 段字符。
首先,LCD顯示屏必須初始化為靜態(tài)驅(qū)動模式并啟用。完成此操作后,可以通過適當(dāng)設(shè)置段將字符寫入顯示器。
InitializeLCD: move LCRA, #03E0h ; xxx0001111100000 ; 00 - DUTY : Static ; 0111 - FRM : Frame freq ; 1 - LCCS : HFClk / 128 ; 1 - LRIG : Ground VADJ ; 00000 - LRA : RADJ = max move LCFG, #0F3h ; 1111xx11 ; 1111 - PCF : All segments enabled ; 1 - OPM : Normal operation ; 1 - DPE : Display enabled move LCD0, #00h ; Clear all segments move LCD1, #00h move LCD2, #00h move LCD3, #00h move LCD4, #00h ret
輸入密碼
在“已關(guān)閉”、“設(shè)置”和“警報”狀態(tài)下,可以輸入 PIN 以將警報控制器更改為另一種狀態(tài)。輸入每個字符時,A[10] 中保存的工作值將左移并使用新字符進行 OR,LCD 顯示屏上的小數(shù)點向左移動以指示輸入的字符數(shù)。出于安全原因,正在輸入的 PIN 不會顯示在顯示屏上。
State4_Key0: move Acc, #0000h jump State4_Shift State4_Key1: move Acc, #0001h jump State4_Shift State4_Key2: move Acc, #0002h jump State4_Shift .... State4_Shift: move A[12], Acc move Acc, A[10] cmp #0FFFFh ; flag indicating no PIN entry allowed ; in current state jump E, State4_NoKey move Acc, A[11] ; key count cmp #04 ; if already at 4 (should have been cleared) jump E, State4_NoKey add #1 move A[11], Acc move Acc, A[10] sla4 or A[12] move A[10], Acc
輸入所有四個字符后,將根據(jù)硬編碼值檢查 PIN。如果輸入的值與 PIN 匹配,則會發(fā)生相應(yīng)的狀態(tài)轉(zhuǎn)換。
PIN_VALUE equ 03870h ; Just a random number ;; "Closed" state code ML_Closed: move A[10], #00000h ; Reset PIN value move A[11], #0 ; Reset number of PIN chars entered move LCD3, #LCD_CHAR_C move LCD2, #LCD_CHAR_L move LCD1, #LCD_CHAR_5 move LCD0, #LCD_CHAR_D ML_Closed_L: move Acc, A[11] cmp #4 ; 4 characters entered? jump NE, ML_Closed_Check move Acc, A[10] cmp #PIN_VALUE ; PIN matches? jump E, ML_Set call LongBeep ; Beep on incorrect PIN and reset move A[10], #0000h move A[11], #0 move LCD3.7, #0 ML_Closed_Check: move C, PI5.3 ; Check reed switch jump NC, ML_Closed_L ; Closed, stay in current state call ShortBeep ; 4 short beeps signal transition call ShortPause call ShortBeep call ShortPause call ShortBeep call ShortPause call ShortBeep call ShortPause jump ML_Open ; Switch opened, go to OPEN state
使用壓電喇叭
在我們的應(yīng)用中,一個小壓電喇叭用于執(zhí)行兩個功能:(1) 在按下按鍵或輸入錯誤 PIN 時提供音頻反饋,以及 (2) 在系統(tǒng)布防時簧片開關(guān)打開時發(fā)出警報。
為了便于演示,MAXQ2000連接兩個端口引腳,連接一個小的壓電喇叭。端口引腳被差分驅(qū)動以增加對壓電喇叭的電流驅(qū)動,驅(qū)動器代碼中使用的環(huán)路計數(shù)決定了發(fā)出的音調(diào)的頻率。
ShortBeep: move LC[1], #100 ; Number of cycles SB_L1: move PO5.6, #0 move PO5.7, #1 move Acc, #2000 ; Count for forward polarity period SB_L2: sub #1 jump NZ, SB_L2 move PO5.6, #1 move PO5.7, #0 move Acc, #2000 ; Count for reverse polarity period SB_L3: sub #1 jump NZ, SB_L3 djnz LC[1], SB_L1 ret
在實際的報警系統(tǒng)中,將使用更強的驅(qū)動電路來運行壓電喇叭,并且喇叭將以其諧振頻率驅(qū)動以增加音量。
結(jié)論
MAXQ2000通過專用的LCD控制器外設(shè)輕松直接地與LCD顯示器接口。使用MAXQ2000提供的靈活的端口引腳配置,可以直接讀取多路復(fù)用鍵盤。定時器中斷驅(qū)動的狀態(tài)機允許掃描矩陣中的所有密鑰并進行去抖動,而對處理器開銷的影響最小。最后,使用MAXQ2000上的通用端口引腳,也可以輕松控制壓電喇叭和磁簧開關(guān)。
-
控制器
+關(guān)注
關(guān)注
112文章
16376瀏覽量
178229 -
lcd
+關(guān)注
關(guān)注
34文章
4426瀏覽量
167580 -
計數(shù)器
+關(guān)注
關(guān)注
32文章
2256瀏覽量
94614
發(fā)布評論請先 登錄
相關(guān)推薦
評論