📄 project(9.18).asm
字号:
SECADMIN2:
LCALL VECMOV ;调用向量移位子程序,根据匹配行号,将其后的向量
;向前移动一个位置,覆盖该向量,达到删除的目的
SJMP SECADMIN4
SECADMIN3:
LCALL DL100MS ;延时等待临界变量访问标志可用
LCALL DL100MS
SJMP SECADMIN1
SECADMIN4:
SETB CRIFLAG ;开临界区
SETB TR0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 匙膜逻辑关系分析模块 ;
;而分析的难点是匙膜的"与"关系,处理内容主要是"或"、"与"及"或与"三种逻辑关系。 ;
;ALF(C300H):标志本卡是否已经插入过,0--没,1--有 ;
;AJH(C350H):存储某锁位机‘与’关系已经插入过的像卡数目计数,是否到齐 ;
;R2:为形参,由MATEE提供被识别的行号作为实参 ;
;LAEND:为带出的逻辑关系标志实参,LAEND=0表示匙膜逻辑分析结束,结果正确; ;
;LAEND=1表示"与"关系匙膜未到齐,具体地说: ;
;就是已插入的被认为是匹配正确的匙膜数小于设定的"与"关系匙膜数 ; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LAP:
CLR TR0
PUSH B
PUSH 04H
PUSH 05H
PUSH 06H
MOV DPTR,#KEYQUA
; MOVX A,@DPTR
; MOV R3,A
MOV DPTR,#SEC ;取出参与分析的H、P和L值
MOV A,R2 ;匹配成功及时间有效得到的向量行号
MOV B,#DIMENVOL
MUL AB
ADD A,#49 ;定位该卡的房间号
JNC LAP1
INC B
LAP1:
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOVX A,@DPTR
MOV R4,A ;将该卡的房间号存入R4
INC DPTR
INC DPTR
LAP2:
MOVX A,@DPTR
MOV R5,A ;将共锁“与“关系向量的数目存入R5
INC DPTR
LAP3:
MOVX A,@DPTR
MOV R6,A ;将逻辑关系存入R6,1-‘或’,2-‘与’
CJNE R6,#01H,LAP4 ;是否为‘或‘关系
SJMP LAP7
LAP4: ;‘与’关系处理
MOV DPTR,#ALF
MOV A,R2
; MOV B,#2
; DIV AB
ADD A,DPL
MOV DPL,A
MOVX A,@DPTR
CJNE A,#1,LAP5 ;ALF中值为0表示该卡没插入过
SJMP LAP6
LAP5:
MOV DPTR,#AJH
MOV A,DPL
DEC R4
ADD A,R4
MOV DPL,A
MOVX A,@DPTR
MOV R1,A
INC R1
MOV A,R1
CLR C
SUBB A,R5
JZ LAP7
MOV DPTR,#ALF
MOV A,R2
; MOV B,#2
; DIV AB
ADD A,DPL
MOV DPL,A
MOV A,#1
MOVX @DPTR,A
MOV DPTR,#AJH
MOV A,R4
ADD A,DPL
MOV DPL,A
MOV A,R1
MOVX @DPTR,A
LAP6:
SETB LAEND
SJMP LAP10
LAP7:
MOV DPTR,#ALF
MOV A,#0
MOV R4,#84 ;ALF占80个单元、AJH占4个单元
LAP8:
MOVX @DPTR,A ;将ALF、AJH共84个单元清零
INC DPTR
DJNZ R4,LAP8
LAP9:
CLR LAEND ;关系匹配完成
LAP10:
POP 06H
POP 05H
POP 04H
POP B
SETB TR0
RET
;***********************************************************
;将图域一行像素(4字节)调入片内RAM子程序
;R1:为形参,用于计数GC的传送单元数目,同时也为GC的地址指针。
;返回时数值增4。
;***********************************************************
GCTOGBUF:
PUSH 00H
MOV P2,#0C0H
MOV 08H,0CH ;片内RAM 3x4工作数组(GDBUF)上移一行
MOV 09H,0DH
MOV 0AH,0EH
MOV 0BH,0FH
MOV 0CH,10H
MOV 0DH,11H
MOV 0EH,12H
MOV 0FH,13H
MOV R0,#10H ;从片外RAM来的三字节像素数据存入
GARR1:
MOVX A,@R1 ;工作数组的最后一行
MOV @R0,A
CJNE R0,#13H,GARR2 ;放满则退出,否则继续
INC R1
POP 00H
RET
GARR2:
INC R0
INC R1
AJMP GARR1
;****************************************************************
;GDBUF松弛数组(FLABBY)
;FLAARR:松弛数组,建立于片外RAM,首地址C200H。R0:GDBUF的地址指针。
;R1:FLAARR的地址指针。R2:一字节位的松弛计数器。
;运行结果:一个像素占一个字节。
;****************************************************************
FLABBY:
PUSH 00H
PUSH 01H
PUSH 02H
MOV R0,#08H
MOV R1,#0
MOV P2,#0C2H
FLABB1:
MOV R2,#0
MOV A,@R0
FLABB2:
MOV B,A
ANL A,#01H
MOVX @R1,A
MOV A,B
RR A
CJNE R2,#7,FLABB3
CJNE R0,#13H,FLABB4
POP 02H
POP 01H
POP 00H
RET
FLABB3:
INC R1
INC R2
AJMP FLABB2
FLABB4:
INC R0
INC R1
AJMP FLABB1
;****************************************************************
;中心线像素属性确认子程序 CALL BY LEVEL
;PERTY:数值特征变量,占用2DH单元,映射位地址6FH~68H
;R0:用于计数中心线元素地址。
;****************************************************************
PROPERTY:
PUSH 00H
MOV PERTY,#0
MOV P2,#0C2H
MOV R0,#20H
MOV B,R0
CJNE R0,#20H,PROPE6
PROPE1:
LCALL LEFTSTR
PROPE2:
LCALL SCETWO
MOV A,PERTY
CJNE A,#00H,PROPE4
MOV A,#0
SJMP PROPE5
PROPE3:
CJNE R0,#3FH,PROPE6
POP 00H
RET
PROPE4:
CJNE A,#0FFH,PROPE3
MOV A,#1
PROPE5:
MOVX @R0,A
AJMP PROPE3
PROPE6:
INC R0
MOV B,R0
PROPE7:
LCALL RIGHTSTR
CJNE R0,#3FH,PROPE1
CLR 6FH
CLR 68H
CLR 69H
AJMP PROPE2
;***************************************************************
;提取松弛数组子程序 CALL BY LEVEL
;***************************************************************
BYTBIT:
MOVX A,@R0
MOV C,ACC.0
MOV R0,B
RET
;***************************************************************
;左边缘像素右三点取值子程序 CALL BY LEVEL
;***************************************************************
LEFTSTR:
MOV A,R0 ;取右下角像素
ADD A,#33
MOV R0,A
LCALL BYTBIT
MOV 6FH,C
INC R0 ;取右像素
LCALL BYTBIT
MOV 68H,C
CLR C ;取右上角像素
MOV A,R0
SUBB A,#31
MOV R0,A
LCALL BYTBIT
MOV 69H,C
RET
;**************************************************************
;右边缘像素左三点取值子程序 CALL BY LEVEL
;**************************************************************
RIGHTSTR:
MOV A,R0 ;取左上角像素
CLR C
SUBB A,#33
MOV R0,A
LCALL BYTBIT
MOV 6BH,C
DEC R0 ;取左像素
LCALL BYTBIT
MOV 6CH,C
MOV A,R0 ;取左下角像素
ADD A,#31
MOV R0,A
LCALL BYTBIT
MOV 6DH,C
RET
;*************************************************
;中二点像素取值子程序 CALL BY LEVEL
;*************************************************
SCETWO:
MOV A,R0 ;取上像素
SUBB A,#32
MOV R0,A
LCALL BYTBIT
MOV 6AH,C
MOV A,R0 ;取下像素
ADD A,#32
MOV R0,A
LCALL BYTBIT
MOV 6EH,C
RET
;***********************************************************
;中心线压缩子程序 CALL BY LEVEL
;R0:用于计数GDBUF的地址。R1:用作松弛数组中心线元素地址指针。
;R2:用于一个字节的位计数。B:用于压缩过程中的工作单元。
;***********************************************************
CENCON:
PUSH 00H
PUSH 01H
PUSH 02H
CLR C
MOV R0,#0CH
MOV R1,#20H
MOV R2,#0
MOV B,#0
CENCON1:
MOVX A,@R1
RRC A
MOV A,B
RRC A
MOV B,A
CJNE R2,#7,CENCON2 ;8单元一位像素压缩为一个字节否?否,
MOV @R0,A ;则转CENCON2再压,已压完回送GDBUF
LJMP CENCON4
CENCON2:
INC R2
CENCON3:
INC R1
LJMP CENCON1
CENCON4:
CJNE R0,#0FH,CENCON5 ;全压缩完否?没有再压,压缩完退出
POP 02H
POP 01H
POP 00H
RET
CENCON5:
MOV R2,#0
MOV B,#0
INC R0
LJMP CENCON3
;***********************************************************
;GDBUF送GC子程序 CALL BY LEVEL
;R0:为GDBUF的中心线单元指针。R1:为GC地址指针形参。
;***********************************************************
GBUFTOGC:
PUSH 00H
MOV R0,#0CH
MOV P2,#0C0H
DEC R1
DEC R1
DEC R1
DEC R1
GBUF1:
MOV A,@R0
MOVX @R1,A
CJNE R0,#0FH,GBUF2
POP 00H
RET
GBUF2:
INC R0
INC R1
lJMP GBUF1
;***********************************************************
;松弛数组下移32个单元子程序 CALL BY LEVEL
;R0:为FLAAAR地址指针.R1:为GC地址指针.
;***********************************************************
PAARR:
PUSH 00H
PUSH 01H
MOV P2,#0C2H
MOV R0,#0
MOV R1,#20H
PAA1:
MOVX A,@R1
MOVX @R0,A
CJNE R1,#5FH,PAA2
POP 01H
POP 00H
RET
PAA2:
INC R0
INC R1
lJMP PAA1
;************************************************************************
;子基元匹配程序 CALL BY MATEE
;A,R5为带入实参.A为KK中的基元,R5为SEC中向量的基元。R0,R6为全局变量,
;R0为"子基元0距离匹配正确的总次数",R6为"子基元有效匹配的总次数"
;************************************************************************
CHILDELT:
PUSH 07H
MOV R7,#4
MOV B,A
CHILDELT1:
MOV A,B
XRL A,R5 ;异或
ANL A,#03H ;只取最低2位
JNZ CHILDELT2A ;判最低2位是否一致
INC R0 ;一致,两个全局变量增1
INC R6
SJMP CHILDELT2
CHILDELT2A:
INC R6 ;不一致,只有R6增1
CHILDELT2:
MOV A,B ;两个基元都各向右移动2位,判断下一个子基元
RR A
RR A
MOV B,A
MOV A,R5
RR A
RR A
MOV R5,A
DJNZ R7,CHILDELT1 ;判4个子基元都判断完否
POP 07H
RET
;*****************************************************************
;单元移位子程序 CALL BY MATEE
;R0,R1为带入实参。R0为发生"前<后"情况时的前地址,R1为后地址;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -