文档库 最新最全的文档下载
当前位置:文档库 › 门铃报警系统

门铃报警系统

.MODEL TINY
PUBLIC SCAN_KEY
PUBLIC CMD_8279,DATA_8279
PCIBAR3 EQU 1CH ;8位I/O空间基地址(它就是实验仪的基地址,也为DMA & 32 BIT RAM板卡上的8237提供基地址)
VENDOR_ID EQU 10EBH ;厂商ID号
DEVICE_ID EQU 8376 ;设备ID号

.STACK 100
.DATA
KEYCOUNT DB ?
COUNT DB 00H
ZHUHU DW 1111H,1112H,1211H,1212H,1311H,1312H,1411H,1412H
DIZHI DW 1101H,1102H,1201H,1202H,1301H,1302H,1401H,1402H
MIMA DB 4 DUP(?) ;存放输入的密码
NUM DW ?
NUM1 DW 4 DUP(?)
XZ DB ? ;存放铃声模式选择1、2或是3,4,5,6(事先默认为1)
LED_TAB DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH
CMD_8279 DW 00B1H ;8279命令字、状态字地址
DATA_8279 DW 00B0H ;8279读写数据口的地址
COM_8255 DW 00F3H ;控制口偏移量
PA_ADD DW 00F0H ;PA口偏移量
PB_ADD DW 00F1H ;PB口偏移量
PC_ADD DW 00F2H ;PC口偏移量
CORRECT1 DB '门牌号为: $'
CORRECT DB '密码正确,开门 $'
WRONG1 DB '用户不存在$'
CORRECT3 DB '用户存在门牌号为:$'
WRONG DB '密码错误报警$'
XIUGAI DB '的密码已修改$'
IO_BIT8_BASEADDRESS DW ?
MSG0 DB 'BIOS不支持访问PCI $'
MSG1 DB '找不到STAR PCI9052板卡 $'
MSG2 DB '读8位I/O空间基地址时出错$'

.CODE

START:
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
NOP
CALL INITPCI
CALL MODIFYADDRESS ;根据PCI提供的基地址,将偏移地址转化为实地址
CALL INIT8279 ;初始化子程序
CALL INIT8255
MOV DX,PC_ADD
MOV AL,0FFH ;报警低电平有效,为防止刚开始就报警,PC口全部置高电平
OUT DX,AL
MOV KEYCOUNT,0
MOV DI,0
START1:
CALL IFEXIT
JZ START2
JMP EXIT
START2:
CALL SCAN_KEY ;键扫描
JNC START1 ;没有按键
XCHG AL,KEYCOUNT ;有按键,则将按键的个数赋给AL,用AL来保存键值个数
INC AL
CMP AL,9;判断所需要的数码管是否写满
JNZ BIJIAO
MOV KEYCOUNT,0 ;计数器写满后,KEYCOUNT重新置0
CALL INIT8279_1
JMP START1
BIJIAO:
XCHG AL,KEYCOUNT
CALL KEY_NUM ;键值转换为键号
CMP AL,09H
JA START3
CALL XIANSHI
START3:
CMP AL,0CH
JNZ START4
CALL CHANGE ;若为C表示要修改地址密码
START4:
CMP AL,0FH ;为F,表示住户密码开门
JNZ START5
CALL INPUT
START5:
CMP AL,0EH ;为E,表示来访者输入门

牌信息催动铃声
JNZ START6
CALL INPUT1
START6:
CMP AL,0DH ;表示清除命令
JNZ START7
MOV COUNT,00H
CALL CLEAR
START7:
JMP START1



XIANSHI PROC NEAR
MOV MIMA[DI],AL ;在0到9之间则数保存至MIMA中
INC DI
LEA BX,LED_TAB ;字码表
XLAT
CALL WRITE_DATA ;将al值写入8279_DATA
RET
XIANSHI ENDP

INPUT PROC NEAR ;住户选择自己家密码来开门
CALL QUSHU
MOV SI,0
MOV CX,8
JIANCE: ;检测所输入的密码是存在
MOV BX,ZHUHU[SI]
CMP BX,AX
JZ SEND
ADD SI,2
CMP SI,16 ;若已经检测了八个,没有找到,则所输入的密码不存在
LOOP JIANCE
BAOJING:
LEA DX,WRONG1 ;错误系统则显示错误
MOV AH,09H
INT 21H
LEA DX,WRONG
MOV AH,09H
INT 21H
CALL JINGLING
CALL CLEAR
JMP JIESHU
SEND:
CALL CLEAR
MOV BX,DIZHI[SI] ;输出该用户家地址
MOV CX,4
LEA DX,CORRECT1
MOV AH,09H
INT 21H
SHOW:
ROL BX,4
MOV AL,BL
AND AL,0FH
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
DEC CX
JNZ SHOW
LEA DX,CORRECT
MOV AH,09H
INT 21H
JIESHU:
RET
INPUT ENDP

INPUT1 PROC NEAR ;来访者按门牌号来启动铃声,以提醒主人
CALL QUSHU
MOV SI,0
MOV CX,8
JIANCE2:
MOV BX,DIZHI[SI]
CMP BX,AX
JZ SEND1
ADD SI,2
CMP SI,16
LOOP JIANCE2
LEA DX,WRONG1 ;错误系统则显示错误
MOV AH,09H
INT 21H
JMP JIESHU1
SEND1:
LEA DX,CORRECT3 ;系统显示
MOV AH,09H
INT 21H
CALL LINGSHENG ;门牌输入正确则进入铃声选择模式
MOV BX,DIZHI[SI] ;向中央控制室发送地址信息
MOV CX,4
SHOW1:
ROL BX,4
MOV AL,BL
AND AL,0FH
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
DEC CX
JNZ SHOW1
JIESHU1:
RET
INPUT1 ENDP

QUSHU PROC NEAR
MOV AL,MIMA
MOV BL,AL
ROL BL,4
MOV AL,MIMA+1
ADD BL,AL
MOV AH,BL
MOV AL,MIMA+2
MOV BL,AL
ROL BL,4
MOV AL,MIMA+3
ADD AL,BL
MOV NUM,AX
RET
QUSHU ENDP

CHANGE PROC NEAR ;密码修改
CHANGE1:
CALL XUANZE
MOV SI,0
CMP AL,00H
JNZ XH
JMP XH1
XH:
INC SI
DEC AL
JNZ XH
XH1:
CALL QUSHU
MOV ZHUHU[SI],AX
MOV BX,DIZHI[SI]
MOV CX,4
SHOW2:
ROL B

X,4
MOV AL,BL
AND AL,0FH
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
DEC CX
JNZ SHOW2
LEA DX,XIUGAI
MOV AH,09H
INT 21H
RET
CHANGE ENDP

XUANZE PROC NEAR ;住户家号码选择
YONGHU:
MOV DX,PA_ADD
IN AL,DX
YONGHU1:
TEST AL,01H
JNZ YONGHU2
MOV AL,00H
JMP JIESHU2
YONGHU2:
TEST AL,02H
JNZ YONGHU3
MOV AL,02H
JMP JIESHU2
YONGHU3:
TEST AL,04H
JNZ YONGHU4
MOV AL,04H
JMP JIESHU2
YONGHU4:
TEST AL,08H
JNZ YONGHU5
MOV AL,06H
JMP JIESHU2
YONGHU5:
TEST AL,10H
JNZ YONGHU6
MOV AL,08H
JMP JIESHU2
YONGHU6:
TEST AL,20H
JNZ YONGHU7
MOV AL,0AH
JMP JIESHU2
YONGHU7:
TEST AL,40H
JNZ YONGHU8
MOV AL,0CH
JMP JIESHU2
YONGHU8:
TEST AL,80H
JNZ YONGHU
MOV AL,0EH

JIESHU2:
RET
XUANZE ENDP


LINGSHENG PROC NEAR ;铃声选择
LINGSHENG:
MOV DX,PA_ADD
IN AL,DX
LINGSHENG1:
TEST AL,01H
JNZ LINGSHENG2
CALL MENLING1
RET
LINGSHENG2:
TEST AL,02H
JNZ LINGSHENG3
CALL MENLING2
RET
LINGSHENG3:
TEST AL,04H
JNZ LINGSHENG4
CALL MENLING3
RET
LINGSHENG4:
TEST AL,08H
JNZ LINGSHENG5
CALL MENLING4
RET
LINGSHENG5:
TEST AL,10H
JNZ LINGSHENG6
CALL MENLING5
RET
LINGSHENG6:
TEST AL,20H
JNZ TUI
CALL MENLING6
RET
TUI:
TEST AL,40H
JNZ LINGSHENG
CALL CLEAR1
RET
LINGSHENG ENDP


JINGLING PROC NEAR
CMP COUNT,03H
JZ JINGLING1
MOV CX,05H
L0: MOV DX,PC_ADD
MOV AL,00H
OUT DX,AL
CALL DL10MS
MOV AL,0FFH
OUT DX,AL
CALL DL100MS
LOOP L0
INC COUNT
RET
JINGLING ENDP

JINGLING1 PROC NEAR
MOV CX,100H
L7: MOV DX,PC_ADD
MOV AL,00H
OUT DX,AL
CALL DL10MS
MOV AL,0FFH
OUT DX,AL
CALL DL100MS
LOOP L7
RET
JINGLING1 ENDP

MENLING1 PROC NEAR
MOV CX,100H
L1: MOV DX,PC_ADD
MOV AL,00H
OUT DX,AL
CALL DL10MS
MOV AL,0FFH
OUT DX,AL
CALL DL100MS
MOV DX,PA_ADD
IN AL,DX
CMP AL,0FFH
JZ ABC
LOOP L1
ABC: MOV DX,PC_ADD
MOV AL,01111111B
OUT DX,AL
CALL DL500MS
CALL DL500MS
MOV AL,11111111B
OUT DX,AL

RET
MENLING1 E

NDP

MENLING2 PROC NEAR
MOV CX,100H
L2: MOV DX,PC_ADD
MOV AL,00H
OUT DX,AL
CALL DL10MS
MOV AL,0FFH
OUT DX,AL
CALL DL500MS
MOV DX,PA_ADD
IN AL,DX
CMP AL,0FFH
JZ ABC1
LOOP L2
ABC1: MOV DX,PC_ADD
MOV AL,01111111B
OUT DX,AL
CALL DL500MS
CALL DL500MS
MOV AL,11111111B
OUT DX,AL
RET
MENLING2 ENDP

MENLING3 PROC
MOV CX,100H
L3: MOV DX,PC_ADD
MOV AL,00H
OUT DX,AL
CALL DL100MS
MOV AL,0FFH
OUT DX,AL
CALL DL500MS
MOV DX,PA_ADD
IN AL,DX
CMP AL,0FFH
JZ ABC2
LOOP L3
ABC2: MOV DX,PC_ADD
MOV AL,01111111B
OUT DX,AL
CALL DL500MS
CALL DL500MS
MOV AL,11111111B
OUT DX,AL
RET
MENLING3 ENDP

MENLING4 PROC NEAR
MOV CX,100H
L4: MOV DX,PC_ADD
MOV AL,00H
OUT DX,AL
CALL DL100MS
MOV AL,0FFH
OUT DX,AL
CALL DL10MS
MOV DX,PA_ADD
IN AL,DX
CMP AL,0FFH
JZ ABC3
LOOP L4
ABC3: MOV DX,PC_ADD
MOV AL,00H
OUT DX,AL
CALL DL500MS
CALL DL500MS
MOV AL,11111111B
OUT DX,AL
RET
MENLING4 ENDP

MENLING5 PROC NEAR
MOV CX,100H
L5: MOV DX,PC_ADD
MOV AL,00H
OUT DX,AL
CALL DL500MS
MOV AL,0FFH
OUT DX,AL
CALL DL100MS
MOV DX,PA_ADD
IN AL,DX
CMP AL,0FFH
JZ ABC4
LOOP L5
ABC4: MOV DX,PC_ADD
MOV AL,01111111B
OUT DX,AL
CALL DL500MS
CALL DL500MS
MOV AL,11111111B
OUT DX,AL
RET
MENLING5 ENDP

MENLING6 PROC
MOV CX,100H
L6: MOV DX,PC_ADD
MOV AL,00H
OUT DX,AL
CALL DL500MS
MOV AL,0FFH
OUT DX,AL
CALL DL100MS
MOV DX,PA_ADD
IN AL,DX
CMP AL,0FFH
JZ ABC5
LOOP L6
ABC5: MOV DX,PC_ADD
MOV AL,01111111B
OUT DX,AL
CALL DL500MS
CALL DL500MS
MOV AL,11111111B
OUT DX,AL
RET
MENLING6 ENDP


;8279初始化
INIT8279 PROC NEAR
MOV DX,CMD_8279 ;CMD_8279为写命令地址、读状地址
MOV AL,34H ;001命令字特征为,后几位表示20,可编程时钟设置,设置分频系数(20分频),通过N级计数器,有软件编程,从clk分频获取内部所需要的100KHZ,在经分频获取键盘扫描的逐行扫描频率及显示扫描时间
OUT DX,AL
MOV AL,10H ;00010000,前三位0表示键盘及显示方式设置命令字,D4D3为10表示8*8字符显示右入口,末三位为0表示编码扫描键盘,双键锁定
OUT DX,AL
CALL

INIT8279_1
RET
INIT8279 ENDP

INIT8279_1 PROC NEAR
CALL CLEAR
MOV AL,90H ;1001000,100表示写显示RAM命令字,用该命令字来设置将要写入的显示RAM的地址,即0000,D4为自动增量位,为1表示每次写入后地址自动加一指向下一次写入地址
OUT DX,AL
RET
INIT8279_1 ENDP

CLEAR1 PROC NEAR ;清除显示
MOV AH,00 ;清屏
MOV AL,03H ;星研提供的软中断,用于读光标位置,dh=行,dl=列
INT 10H
MOV DI,00H
MOV KEYCOUNT,00H
RET
CLEAR1 ENDP

CLEAR PROC NEAR
MOV DX,CMD_8279
MOV AL,0DEH ; 11011110,D4D3D2设定清除显示RAM的方式,为111,表示允许清除显示器,D1为1表示清除先进先出状态(包括中断),D0为1表示总清
OUT DX,AL
CESHI: IN AL,DX
TEST AL,80H ;1000000,D7为1表示由于清显示或者总清命令尚未完成其清理操作,显示器RAM尚不能使用
JNZ CESHI ; 显示RAM清除完毕吗?
CALL CLEAR1
RET
CLEAR ENDP

SCAN_KEY PROC NEAR
MOV DX,CMD_8279
IN AL,DX ;读状态
READ_FIFO:
AND AL,7 ;00000111,D2D1D0表示先进先出中的字符数
JZ NO_KEY ;是否有键按下
READ:
MOV AL,40H ;01000000读FIFO或传感器RAM命令,D4自动加1标志,D3无关位,后三位为RAM地址位
OUT DX,AL
MOV DX,DATA_8279
IN AL,DX
STC ;有键
SCAN_KEY1: RET
NO_KEY:
CLC ;无键按下,清CF
JMP SCAN_KEY1
SCAN_KEY ENDP

KEY_NUM PROC NEAR
AND AL,3FH ;对于数据,D7D6分别为控制和移位,D5D4D3来自扫描线,表示行,后三位来自回复线表示列
RET
KEY_NUM ENDP

WRITE_DATA PROC NEAR
PUSH DX
MOV DX,DATA_8279
OUT DX,AL
POP DX
RET
WRITE_DATA ENDP

INIT8255 PROC NEAR
MOV DX,COM_8255 ;写8255A方式控制字
MOV Al,90H ;PA输入,PC输出
OUT DX,AL
INIT8255 ENDP

DL10MS PROC NEAR
PUSH AX
PUSH DX
MOV DX,250 ;延时250MS
MOV AH,0FFH ;星研公司提供的软中断
INT 21H
POP DX
POP AX
RET
DL10MS ENDP
DL100MS PROC NEAR
PUSH AX
PUSH DX
MOV DX,100 ;延时100MS
MOV AH,0FFH ;星研公司提供的软中断
INT 21H
POP DX
POP AX
RET
DL100MS ENDP
DL500MS PROC NEAR
PUSH AX
PUSH DX
MOV DX,500 ;延时500MS
MOV AH,0FFH ;星研公司提供的软中断
INT 21H
POP DX
POP AX
RET
DL500MS ENDP

INITPCI PROC NEAR
MOV AH,00H
MOV AL,03H
INT 10H ;清屏
MOV AH,0B1H
MOV AL,01H
INT 1AH
CMP AH,0
JZ INITPCI2
LEA DX,MSG0
INITPCI1: MOV AH,09H
INT 21H
JMP EXIT
INITPCI2: MOV AH,0B1H
MOV AL,02H
MOV CX,DEVICE_ID
MOV DX,VENDOR_ID
MOV DI,0
INT 1AH
JNC INITPCI3 ;是否存在STAR PCI9052板卡
LEA DX,MSG1
JMP INITPCI1
IN

ITPCI3: MOV DI,PCIBAR3
MOV AH,0B1H
MOV AL,09H
INT 1AH ;读取该卡PCI9052基地址
JNC INITPCI4
LEA DX,MSG2
JMP INITPCI1
INITPCI4: AND CX,0FFFCH
MOV IO_BIT8_BASEADDRESS,CX
RET
INITPCI ENDP

IFEXIT PROC NEAR
PUSH AX
PUSH DX
MOV AH,06H
MOV DL,0FFH
INT 21H
POP DX
POP AX
RET
IFEXIT ENDP

MODIFYADDRESS PROC NEAR
ADD CMD_8279,CX
ADD DATA_8279,CX
ADD COM_8255,CX
ADD PC_ADD,CX
ADD PA_ADD,CX
RET
MODIFYADDRESS ENDP

EXIT:
MOV AH,4CH
INT 21H
END START




相关文档
相关文档 最新文档