使用MAXQ2000进行安全系统控制

描述

报警控制面板几乎是每个人日常生活的一部分,无论是在家里还是在工作中。本文介绍使用MAXQ2000低功耗LCD微控制器的报警控制应用示例,该微控制器是在MAX-IDE开发环境中创建的。MAXQ2000可以方便地与安全应用中常用的外设接口,包括LCD显示器、PIN输入键盘、压电喇叭和蜂鸣器以及磁簧开关。

常见的报警控制面板包含多个输入设备,需要用户显示器。这些系统的常用组件包括:

接受用户输入的设备:4 x 4 开关键盘。

向用户显示输出的设备:LCD显示器。

输入设备:磁簧开关。

输出装置:压电喇叭。

这几个元件可以通过简单的应用和功能强大、灵活的MAXQ2000微控制器进行管理和控制。该应用可供下载,是使用MAX-IDE开发环境用MAXQ汇编语言编写的。该代码针对MAXQ2000评估板,使用以下附加硬件:

键盘:灰山 16 按钮(4 行 x 4 列)键盘 96BB2-006-F

压电喇叭:CEP-1172

磁簧开关:标准单回路型

设计目标

我们的示例应用程序执行以下任务:

监视磁簧开关以确定门/窗是打开还是关闭。

允许用户通过在键盘上输入 PIN 来布防或撤防系统。

在液晶屏上向用户显示状态信息。

通过发出压电喇叭的声音,提供按键和传感器打开/关闭事件的音频指示。

如果在系统布防时传感器打开,则连续发出喇叭声。

报警控制应用程序的行为由四种离散状态组成:关闭、打开、设置和警报(图 1)。

lcd

图1.警报控制应用程序在四种主要状态下运行:关闭、打开、设置和警报。

磁簧开关接口

在报警系统中,磁簧开关安装在两部分:磁铁和实际的磁簧开关。磁铁部分放置在门或窗的移动部分,而开关部分放置在框架上。当门或窗关闭时,磁铁关闭簧片开关,指示非报警状态。如果系统布防,门窗打开,簧片开关改变状态,允许MAXQ2000发出入侵警报。

干簧开关只需连接端口引脚P2000.5和P2.5即可连接至MAXQ3。当 P5.2 设置为/下拉 (PD = 1, PO = 0) 且 P5.3 设置为弱上拉输入 (PD = 0, PO = 1) 时,当磁簧开关闭合时,P5.3 将读取零,当磁簧开关打开时,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 键盘接口

键盘用于报警控制系统,用于安全输入PIN码、布防/撤防系统以及更改配置。此示例应用程序中使用的键盘由 16 个开关组成,以 4 x 4 网格形式组织。开关以行和列矩阵连接在一起(图2),因此按下键盘开关将一行连接到一列线。例如,按下“3”键将第 1 行和第 3 列连接在一起。

lcd

图2.键盘开关形成一个由四行四列组成的网格。

键盘提供八个接口引脚,键盘矩阵的每一行和每列一个引脚。键盘和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

 

对于此应用,评估板应配置如下。

拨码开关。

以下开关必须关闭:所有 SW1 交换机、SW3.1、SW3.7、SW3.8、SW6.1、SW6.4、SW6.5、SW6.6、SW6.7 和 SW6.8。

所有其他 DIP 开关可以处于任何状态。

运动员

以下跳线必须处于打开状态:JU5、JU6、JU8 和 JU9。

必须关闭以下跳线:JU1、JU2、JU3 和 JU11。

所有其他跳线可以处于任何状态。

按列扫描

键盘的行和列排列使得在任何时候都可以轻松读取四个开关的状态,无论是行还是列。要在一列中读取四个开关,首先必须将该列的行拉低,所有其他列三态(图 3)。接下来,必须在每行线上设置一个弱上拉。最后,四行线连接到端口引脚输入。当按下某一行上的开关时,该行的输入将为低电平,否则为高电平。

类似地,通过将该行线拉低并在所有四列上设置输入和弱上拉,可以读取连续四个开关的状态。行和列是可以互换的。

在我们的设置中,四行线(键盘引脚 1 到 4)都连接到同一个输入端口 (P6[3:0]),这使得同时读取它们更容易。因此,示例应用程序一次扫描一列交换机。连接到键盘的八个端口引脚线有四种设置状态,每种状态都允许读取四个开关。当正在读取的开关闭合时,所有输入线都读低,当开关打开时,所有输入线都读高。

 

P6.0 P6.1 P6.2 P6.3 P6.4 P6.5 P7.0 P7.1
1 输入 - 1 输入 - 4 输入 - 7 输入-* 三态 三态 三态
2 输入 - 2 输入 - 5 输入 - 8 输入 - 0 三态 三态 三态
3 输入 - 3 输入 - 6 输入 - 9 输入-# 三态 三态 三态
4 输入 - A 输入 - B 输入 - C 输入 - D 三态 三态 三态

 

lcd

图3.MAXQ2000将列1拉低,读取前四个键盘开关的状态。

中断驱动的状态机

这四列必须快速发送,以便任何按键在释放之前都有时间阅读。此外,为防止开关的弹跳触点注册多次按下,在注册之前必须按住键一定时间。通过将定时器驱动的中断例程作为应用程序的核心,可以同时完成这两个因素。这允许应用程序定期扫描四列中的每一列,并计算按下键的时间长度。

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

计时器的重新加载值控制中断触发的频率。此值必须足够短,以便识别所有按键。此外,为了确保密钥响应不会缓慢,重新加载值也必须足够长,以便它不会占用过多的处理时间。上面显示的值0FF00h(大约每2.4ms一次)是通过实验达到的。

一旦一组四个开关的列线被驱动为低电平,则可能需要一些时间才能通过按下的开关操作的连接将其输入线拉低。该时间受开关的导通电阻和同时按下多少列开关的影响。为了避免在将柱线拉低和读取四个开关之间延迟中断服务例程,给定状态的柱线在前一个状态下被驱动为低电平(图 4)。

lcd

图4.在四种按键扫描状态中,应用程序读取四个开关的状态,并准备读取接下来的四个开关。

由于MAXQ2000的中断向量(IV)可以即时设置,应用在中断向量寄存器中保存下一个状态值。每当计时器中断触发时,当前密钥扫描状态的处理程序例程都会将中断向量地址设置为下一个状态的处理程序例程。

 

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

其他四种状态的处理程序例程类似,只是在 A[13] 保持寄存器中先前收集的开关位中略微调整为 OR。状态例程使用三个工作累加器。

A[13] 保存通过键盘的电流传递上读取的所有开关状态的位数组。状态 4 读取完成后,此寄存器包含以下位,其中一位表示打开(释放)键开关,零位表示关闭(按下)键开关。

 


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 一个

 

去抖动开关

达到状态 4 并扫描所有键后,必须决定是否接受按下的任何键。处理去抖动的一种简单方法是为 16 个开关中的每一个保持一个计数器值。每次达到状态 4 并按下该键时,计数器都会递增。如果未按下该键,计数器将递减。当计数器达到某个值时,将注册按键。为了防止按住键重复(通常在计算机键盘上允许,但在小键盘上不允许),必须允许计数器递减到零(通过释放键),然后才能再次注册该键。

由于我们在单个寄存器中拥有所有 16 个键的状态,因此有一种更简单、内存密集度更低的去抖动解决方案。应用程序维护单个计数器值,每次位模式与上一次传递中读取的模式匹配时,该计数器值都会递增。

 

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

为了防止键重复,一旦位模式静态足够长,就可以接受,必须先接受不同的位模式(包括未按下任何键的空闲状态),然后才能再次接受第一个位模式。

处理同时按键

使用键盘输入设备时,可以同时按键。去抖动代码可确保如果在第一个键之后立即按下第二个键,则去抖间隔将重新开始,但在实践中要足够短,以免成为问题。

一旦位模式被接受,就可以通过使用累加器将所有 16 位单独旋转到进位中并依次检查每个位来执行每个按下键位的操作。以下代码仅响应第一个按下的键,但这可以很容易地更改。

 

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所示的段定义。

lcd

图5.LCD 显示屏包含 7 个半 <> 段字符。

首先,LCD显示屏必须初始化为静态驱动模式并启用。完成此操作后,可以通过适当设置段将字符写入显示器。

 

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

输入密码

在“已关闭”、“设置”和“警报”状态下,可以输入 PIN 以将警报控制器更改为另一种状态。输入每个字符时,A[10] 中保存的工作值将左移并使用新字符进行 OR,LCD 显示屏上的小数点向左移动以指示输入的字符数。出于安全原因,正在输入的 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

输入所有四个字符后,将根据硬编码值检查 PIN。如果输入的值与 PIN 匹配,则会发生相应的状态转换。

 

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

使用压电喇叭

在我们的应用中,一个小压电喇叭用于执行两个功能:(1) 在按下按键或输入错误 PIN 时提供音频反馈,以及 (2) 在系统布防时簧片开关打开时发出警报。

为了便于演示,MAXQ2000连接两个端口引脚,连接一个小的压电喇叭。端口引脚被差分驱动以增加对压电喇叭的电流驱动,驱动器代码中使用的环路计数决定了发出的音调的频率。

 

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

在实际的报警系统中,将使用更强的驱动电路来运行压电喇叭,并且喇叭将以其谐振频率驱动以增加音量。

结论

MAXQ2000通过专用的LCD控制器外设轻松直接地与LCD显示器接口。使用MAXQ2000提供的灵活的端口引脚配置,可以直接读取多路复用键盘。定时器中断驱动的状态机允许扫描矩阵中的所有密钥并进行去抖动,而对处理器开销的影响最小。最后,使用MAXQ2000上的通用端口引脚,也可以轻松控制压电喇叭和磁簧开关。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分