报警控制面板几乎是每个人日常生活的一部分,无论是在家里还是在工作中。本文介绍使用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)。
图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 列连接在一起。
图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 | 三态 | 三态 | 三态 | 低 |
图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)。
图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所示的段定义。
图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上的通用端口引脚,也可以轻松控制压电喇叭和磁簧开关。
全部0条评论
快来发表一下你的评论吧 !