MAXQ2000 点击型号查看芯片规格书
警报控制面板几乎是每个人日常生活的一部分,无论是在家里还是在工作中。本文描述了一个使用MAXQ2000低功耗LCD微控制器的示例报警控制应用程序,该应用程序是在MAX-IDE开发环境下创建的。MAXQ2000可以很容易地连接到安全应用中通常使用的外设,包括LCD显示器,PIN输入键盘,压电喇叭和蜂鸣器以及磁簧开关。
常见的报警控制面板包含多个输入设备,需要用户显示。这些系统的常用组件包括:
接收用户输入的设备:一个4 × 4的开关键盘。
一种向用户显示输出的设备:液晶显示器。
输入装置:磁簧开关。
输出装置:压电喇叭。
这几个组件可以通过一个简单的应用程序和功能强大、灵活的MAXQ2000微控制器进行管理和控制。这个应用程序(可下载)是使用MAX-IDE开发环境用MAXQ汇编语言编写的。该代码针对MAXQ2000评估套件板,使用以下附加硬件:
键盘:格雷希尔16按钮(4行乘4列)键盘96BB2-006-F
压电喇叭:CEP-1172
磁簧开关:标准单回路型
我们的示例应用程序执行以下任务:
监视磁簧开关以确定门/窗是否打开或关闭。
允许用户通过在键盘上输入密码来武装或解除系统。
在LCD上显示状态信息给用户。
通过敲击压电喇叭提供按键和传感器打开/关闭事件的音频指示。
在系统启动时,如果传感器打开,则持续鸣响喇叭。
报警控制应用程序的行为由四个离散状态组成:CLOSED、OPEN、SET和ALERT(图1)。
图1所示、报警控制应用程序在四种主要状态下运行:关闭,打开,设置和警报
在报警系统中,磁簧开关安装在两部分:磁铁和实际簧片开关。磁铁部分放置在门或窗的移动部分上,开关部分放置在框架上。当门或窗关闭时,磁铁关闭簧片开关,表示非报警状态。如果系统是武装的,窗户或门被打开,簧片开关改变状态,允许MAXQ2000发出入侵警报。
簧片开关通过端口引脚P5.2和P5.3连接到MAXQ2000。当P5.2设置为主动低下拉(PD = 1, PO = 0), P5.3设置为弱上拉输入(PD = 0, PO = 1)时,P5.3在簧片开关闭合时读零,在簧片开关打开时读一。
移动PD5.2, #1;驱动簧片开关一侧LOW移动PO5.2, #0移动PD5.3, #0;设置弱引体向上,另一侧移动PO5.3, #1…ml_close_check:移动C, PI5.3跳NC, ml_close_l;Switch关闭,继续在此状态下调用ShortBeep call ShortPause call ShortBeep call ShortPause call ShortBeep call ShortPause call ShortBeep call ShortPause call ShortPause jump ML_Open;开关处于打开状态,切换到open状态
键盘在报警控制系统中用于安全的PIN输入,武装/解除系统,以及改变配置。在这个示例应用程序中使用的键盘由16个开关组成,组织在一个4 x 4的网格中。这些开关被捆绑在一个行和列矩阵中(图2),这样按下键盘开关就可以将一行线连接到一条列线。例如,按“3”键将第1行和第3列连接在一起。
图2、键盘开关形成四行四列的网格
键盘提供8个接口引脚,每个引脚对应键盘矩阵的每一行和每一列。键盘和MAXQ2000 EV套件连接如图所示。
销 | 连接 | 港销 | JU2销 |
1 | 第1行 | P6.0 | 54 |
2 | 第二行 | P6.1 | 52 |
3. | 第三行 | P6.2 | 50 |
4 | 行4 | P6.3 | 48 |
5 | 坳1 | P6.4 | 46 |
6 | Col 2 | P6.5 | 44 |
7 | 坳3 | P7.0 | 42 |
8 | 坳4 | P7.1 | 40 |
对于这种应用,EV kit板的配置如下。
指拨开关。
以下开关必须处于“OFF”状态:所有SW1、SW3.1、SW3.7、SW3.8、SW6.1、SW6.4、SW6.5、SW6.6、SW6.7和SW6.8。
所有其他拨码开关可以处于任何状态。
跳投
以下跳线必须为OPEN: JU5, JU6, JU8和JU9。
以下跳线必须关闭:JU1, JU2, JU3和JU11。
所有其他跳线可以处于任何状态。
键盘的行和列排列使得在任何时候都可以轻松地以行或列为基础读取四个开关的状态。要读取一列中的四个开关,首先必须将该列的行拉低,并将所有其他列都设置为三状态(图3)。接下来,必须在每一行上设置弱上拉。最后,四行线连接到端口引脚输入。当该行上的开关按下时,该行的输入将为低,否则为高。
类似地,可以通过将行线拉低并在所有四列上设置输入和弱上拉来读取一行中四个开关的状态。行和列是可互换的。
在我们的设置中,四行线(键盘引脚1到4)都连接到相同的输入端口(P6[3:0]),这使得同时读取它们更容易。出于这个原因,示例应用程序一次扫描一列交换机。连接到键盘的8个端口引脚线有4种设置状态,每一种都允许读取4个开关。当被读取的开关闭合时,所有输入线读为低电平,当开关打开时读为高电平。
状态 | 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 0FF00hStartTimer:移动IIR.3, #1;启用中断模块3移动IMR.3, #1移动T2V0, #RELOAD移动T2R0, #0h移动T2C0, #0h移动Acc, T2CFG0;设置定时器0从HFClk/128开始运行,#08Fh或#070h移动T2CFG0, Acc移动T2CNA0.3, #1;启动定时器0移动T2CNA0.7, #1;使能定时器0中断ret
计时器的重新加载值控制中断触发的频率。这个值必须足够短,以便识别所有的按键。此外,为了确保键响应不缓慢,重载值也必须足够长,这样它就不会占用过多的处理时间。通过实验得到了上面显示的值0FF00h(大约每2.4ms一次)。
一旦一组4个开关的列线被驱动为低电平,可能需要一段时间才能使通过压下开关运行的连接将其输入线拉低。这个时间受开关的导通电阻和一次压下多少列开关的影响。为了避免不得不在将列线拉低和重新启动四个开关之间延迟中断服务程序,给定状态的列线在前一个状态中被驱动为低电平(图4)。
图4、在四种键扫描状态中,应用程序读取四个开关的状态,并准备读取下一个开关
由于MAXQ2000的中断向量(IV)可以动态设置,因此应用程序在中断向量寄存器中保存下一状态值。每当计时器中断触发时,当前键扫描状态的处理程序例程将中断向量地址设置为下一个状态的处理程序例程。
org 0000hMain: call InitializeLCD move PD6, #010h;对于状态1移动PO6, #00Fh;所有状态移动PD7, #000h;对于状态1移动PO7, #000h;对于所有状态移动IV, #State1调用StartTimer移动IC, #1;启用全局中断跳转$State1: push PSF push Acc move Acc, PI6和#000Fh;抓取最低四位仅sla4移动A[13], Acc移动PD6, #020h;对于状态2移动PD7, #000h移动T2V0, #RELOAD;设置重载值移动T2CNB0.1, #0;清除中断标志move T2CNB0.3, #0 move IV, #State2 pop Acc pop PSF reti
其他四种状态的处理程序例程类似,只是在a[13]保持寄存器中先前收集的开关位中稍微调整为OR。状态例程使用了三个工作累加器。
A[13]保存着通过键盘的电流读取到的所有开关状态的位数组。在状态4读取完成后,该寄存器包含以下位,其中1位表示打开(释放)键开关,0位表示关闭(按下)键开关。
位 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个键的状态,因此有一种更简单、内存消耗更少的解绑定解决方案。应用程序维护一个计数器值,每当位模式与前一遍读取的模式匹配时,该计数器值就递增。
状态4:push PSF push Acc move Acc, PI6和#000Fh;抓取低4位或A[13] cmp A[15]跳转E, State4_End;cmp A[14] jump E, State4_Match move LC[0], #DEBOUNCE move A[14], Acc;复位当前位数组
为了防止密钥重复,一旦一个位模式静态的时间长到足以被接受,在第一个位模式再次被接受之前,必须接受另一个位模式(其中包括没有键被按下的空闲状态)。
当使用小键盘输入设备时,可以同时按下键。脱脱代码确保如果在第一个键之后按下第二个键,脱脱间隔将重新开始,但在实践中要足够短,因此这不是问题。
一旦接受了位模式,每个按下键位的动作可以通过使用累加器将所有16位单独旋转到进位并依次检查每个位来进行。下面的代码只响应第一个按下的键,但这很容易更改。
stat4_match: djnz LC[0], stat4_end move A[15], Acc;重置最后一个脱出模式rrc跳NC, State4_KeyA rrc跳NC, State4_KeyB rrc跳NC, State4_KeyC rrc跳NC, State4_KeyD rrc跳NC, State4_Key3 rrc跳NC, State4_Key6 rrc跳NC, State4_Key9 rrc跳NC, State4_Key2 rrc跳NC, State4_Key5 rrc跳NC, State4_Key8 rrc跳NC, State4_Key0 rrc跳NC, State4_Key1 rrc跳NC, State4_Key4 rrc跳NC, State4_Key7 rrc跳NC, State4_KeyStar跳State4_End
MAXQ2000 EV套件中包含的LCD显示器具有如图5所示的分段定义。
图5、液晶显示器包含4个半7段字符
首先,LCD显示器必须初始化为静态驱动模式并启用。一旦这样做了,字符可以通过设置适当的段写入到显示器。
InitializeLCD:移动LCRA, #03E0h;xxx0001111100000;00 - DUTY:静电;0111 - FRM:帧频率;1 - LCCS: HFClk / 128;1 - LRIG:地面VADJ;00000 - LRA: RADJ = max move LCFG, #0F3h;1111 xx11;1111 - PCF:所有段启用;1 - OPM:正常运行;1 - DPE:显示启用移动LCD0, #00h;清除所有片段:移动LCD1, #00h移动LCD2, #00h移动LCD3, #00h移动LCD4, #00h ret
在CLOSED、SET和ALERT状态下,可以输入PIN码将报警控制器切换到另一状态。每输入一个字符,保存在A[10]中的工作值就会随着新字符的输入而向左移动,同时LCD显示屏上的小数点也会向左移动,表示输入的字符数。出于安全原因,输入的PIN不会显示在显示器上。
State4_Key0:移动Acc, #0000h跳转State4_ShiftState4_Key1:移动Acc, #0001h跳转State4_ShiftState4_Key2:移动Acc, #0002h跳转State4_Shift....stat4_shift:移动A[12],移动A, A[10];不允许输入PIN码的标志;在当前状态跳跃E, stat4_nokey移动Acc, A[11];键数cmp# 04;如果已经在4(应该已经清除)跳E, State4_NoKey添加#1移动A[11], Acc移动Acc, A[10] sla4或A[12]移动A[10], Acc
一旦输入了所有四个字符,PIN就会根据硬编码的值进行检查。如果输入的值与PIN匹配,则发生适当的状态转换。
PIN_VALUE = 03870h;只是一个随机数;;“关闭”状态codeML_Closed:移动A[10], #00000h;重置PIN值move A[11], #0;重置输入的PIN字符数,移动LCD3, #LCD_CHAR_C移动LCD2, #LCD_CHAR_L移动LCD1, #LCD_CHAR_5移动LCD0, #LCD_CHAR_DML_Closed_L:移动Acc, A[11] cmp #4;输入4个字符?跳跃NE, ml_close_check移动Acc, A[10] cmp #PIN_VALUE;销匹配?跳跃E, ML_Set调用LongBeep;PIN不正确时发出蜂鸣声,重置移动A[10], #0000h移动A[11], #0移动LCD3.7, #0ML_Closed_Check:移动C, PI5.3;检查簧片开关跳变NC, ml_close_l;关闭,保持当前状态调用ShortBeep;短蜂鸣声信号转换呼叫ShortPause call ShortBeep call ShortPause call ShortBeep call ShortPause call ShortBeep call ShortPause call ShortBeep call ShortPause jump ML_Open;开关打开,进入OPEN状态
在我们的应用中,一个小的压电喇叭用于执行两个功能:(1)当按键被按下或输入错误的PIN时提供音频反馈,(2)当系统武装时簧片开关打开时发出警报。
为了演示,可以将一个小型压电喇叭连接在两个端口引脚之间