📄 project(9.18).asm
字号:
MOV R6,A
JNC TAK2
RRC A ;一个字节已处理完
MOV R6,A
SETB ROWST ;行点色标志置1,使不影响同行下一个字节上跳沿计数
MOV A,R4 ;每个字节的行穿透次数占行计数单元的2位,
MOV R1,A ;一个字节已处理完,行计数单元的低2位要清0,
MOVX A,@R1 ;故要循环右移2位,为同行下个字节跳沿计数作准备
RR A
RR A
MOVX @R1,A
DEC R0 ;修正待提特征的字节单元的地址
INC R5 ;修正列点色标志单元的地址
CJNE R5,#54H,TAK2
MOV R5,#50H ;完成一行
MOV R3,#54H
INC R4
;每处理完8行,要对54H开始的32个列穿透计数单元,都循环左移2位,
;为每列的下一8位保持列计数单元的低2位为0,且要对列点色标志(50H~54H)置1
;不影响下8行的跳沿计数
TAK6:
MOV A,R0
INC A ;回到上一行的最后一个单元
MOV B,#32 ;置除数
DIV AB
MOV A,B ;B中放余数,若为0,则(R0)=96/64/32/0,
JNZ TAK9 ;要对32个列穿透计数单元进行循环右移2位的操作
MOV R7,#32
MOV R1,#54H
TAK7:
MOVX A,@R1
RR A
RR A
MOVX @R1,A
INC R1
DJNZ R7,TAK7
MOV R1,#50H ;对50H,51H,52H,53H四个列点色标志置1
MOV A,#0FFH
TAK8:
MOVX @R1,A
INC R1
CJNE R1,#54H,TAK8
TAK9:
CJNE R0,#0FFH,TAK90 ;判GC中数据都处理完否?
SJMP TAK91
TAK90:
LJMP TAK2
;将54H开始的32列列穿透计数单元内容加到KK中
TAK91:
MOV R7,#32
MOV P2,#0C2H
MOV R0,#20H ;KK中列穿透计数单元首地址低8位
MOV R1,#54H
TAK10:
MOVX A,@R1
MOVX @R0,A
INC R1
INC R0
DJNZ R7,TAK10
;只取奇数列的列穿透单元,并存放于从c220H开始的16个连续单元中
MOV R7,#16
MOV R1,#20H
MOV R0,#20H
TAK11:
MOVX A,@R1
MOVX @R0,A
INC R1
INC R1
INC R0
DJNZ R7,TAK11
POP 07H
POP 06H
POP 05H
POP 04H
POP 03H
POP 01H
POP 00H
SETB TR0
RET
;中断采样程序,一次硬采样4组,再软采样4组
INTOP:
SETB SENDPOWER ;开采样电源
PUSH ACC
PUSH 01H
MOV R1,#20 ;延时5MS
DJNZ R1,$
LCALL RDATA ;硬采样4组数据
MOV R1,#20 ;延时5MS
DJNZ R1,$
CLR P3.4 ;软采样脉冲
NOP
SETB P3.4
NOP
CLR P3.4
LCALL RDATA ;软采样4组数据
POP 01H
POP ACC
RETI
;每次采集4组数据,存放在外部RAM 0C000H-0C1FFH单元中,共占512个单元
RDATA:
MOV DPTR,#GD1PORT
MOVX A,@DPTR
MOVX @R0,A
CJNE R0,#0FFH,IN1
MOV P2,#0C1H
IN1:
INC R0
MOV DPTR,#GD2PORT
MOVX A,@DPTR
MOVX @R0,A
CJNE R0,#0FFH,IN2
MOV P2,#0C1H
IN2:
INC R0
MOV DPTR,#GD3PORT
MOVX A,@DPTR
MOVX @R0,A
CJNE R0,#0FFH,IN3
MOV P2,#0C1H
IN3:
INC R0
MOV DPTR,#GD4PORT
MOVX A,@DPTR
MOVX @R0,A
CJNE R0,#0FFH,IN4
MOV P2,#0C1H
IN4:
INC R0
INC R6
RET
;********************************************************
;匙膜识别模块子程序
;RF:输出标志信息实参。RF=0,匹配失败;RF=1,匹配成功。
;R2:为带出实参,是被识别的行号。
;********************************************************
MATEE:
CLR TR0
PUSH 00H
PUSH 01H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 06H
PUSH 07H
MOV DPTR,#KEYQUA ;KEYQUA用来存放SEC中的元素数目
MOVX A,@DPTR
MOV R3,A
CLR RF
MOV R2,#0 ;行号变量
MOV R4,#0 ;列号变量
CLR C
SUBB A,#0 ;判SEC是否非空
JNZ MATEE1A ;是则转去置匹配失败并退出
LJMP MATEE11
;KK中各基元与SEC中各向量的相应基元比较,匹配成功次数送TEMP=0C002H开始的偶数单元。
;相应向量的行号送0C003H开始的奇数单元。
MATEE1A:
MOV DPTR,#0C002H
MOV R1,#0 ;基元匹配成功次数 计数变量
MATEE1:
LCALL SECKBP
CLR C
SUBB A,R5
JNZ MATEE2
INC R1 ;基元匹配成功次数加1
MATEE2:
INC R4 ;修改列号
CJNE R4,#48,MATEE1
MOV A,R1
MOVX @DPTR,A ;基元匹配成功次数送偶数单元
INC DPTR ;到相应的行号存储单元
MOV A,R2
MOVX @DPTR,A ;相应向量的行号送奇数单元
INC DPTR
MOV R1,#0 ;计数单元清0
MOV R4,#0 ;列号重置为0
INC R2 ;修改行号
MOV A,R2
CJNE A,03H,MATEE1 ;判断是否到最后一个向量?否,换下一个向量处理
;对0C002H开始偶数单元存储的各向量匹配成功次数进行由大到小的排序,行号也需跟随匹配
;次数一起移动。采用直接插入排序算法,0C000H存"哨兵"数据,0C001H为"哨兵"行号.
;R0为前地址指针,R1为后地址指针
PUSH 03H
CJNE R3,#02H,MATEE3A ;判断有多少个与SEC中各向量计算的匹配成功
MATEE3A:
JC MATEE5A ;次数,若<2个则跳过排序过程
DEC R3 ;N个数据需比较N-1次
MOV P2,#0C0H
MOV R0,#02H ;假定SEC中至少有一个向量
MOV R1,#04H
MATEE3:
MOVX A,@R0 ;取前地址的内容
MOV B,A
MOVX A,@R1 ;取后地址的内容
CJNE A,0F0H,MATEE4 ;F0H为B寄存器的地址
MATEE4:
JC MATEE5 ;前>后,正常,不做操作
;前<后
MOV DPTR,#0C000H ;"哨兵"数据
MOVX @DPTR,A ;L.r[0]=L.r[i]
INC DPTR
INC R1
MOVX A,@R1 ;"哨兵"行号
MOVX @DPTR,A
DEC R1
LCALL DATAMOV ;调用单元移动子程序
PUSH 00H
MOV R0,A ;将待插元素及绑定行号插入所得位置
MOV DPTR,#0C000H
MOVX A,@DPTR
MOVX @R0,A
INC DPTR
INC R0
MOVX A,@DPTR
MOVX @R0,A
POP 00H
MATEE5:
INC R0
INC R0
INC R1
INC R1
DJNZ R3,MATEE3 ;判排序是否完成?
MATEE5A:
POP 03H
;进入匹配过程
MOV R1,#0 ;与若干个向量的一级匹配率不小于60%的计数变量
MOV R4,#0 ;列号变量
MOV R0,#0 ;"子基元0距离匹配正确的总次数"
MOV R6,#0 ;"子基元有效匹配的总次数"
MOV DPTR,#0C002H ;定位到第一个向量的数据位
MOVX A,@DPTR
CLR C
SUBB A,#48 ;判最大匹配成功次数是否等于48?
JNZ MATEE6A
LJMP MATEE7B ;是,直接找到匹配向量,转MATEE7B
MATEE6A:
MOVX A,@DPTR ;读入相应向量的数据位
MOV B,#10
MUL AB
MOV R6,#48
LCALL DIVIDE
CJNE A,#05H,MATEE6B ;判是否超过一级匹配率
SJMP MATEE6C
MATEE6B:
JC MATEE7 ;小于一级匹配率,提前跳出
MATEE6C:
INC R1 ;大于或等于一级匹配率,计数变量增1
INC DPTR ;指向本向量的绑定行号
INC DPTR ;指向下一向量的数据位置
DJNZ R3,MATEE6A
MATEE7:
CJNE R1,#00H,MATEE7A
LJMP MATEE11 ;采集特征与LKEY中各向量的一级匹配率都不过60%则拒识该卡
MATEE7A:
CJNE R1,#01H,MATEE7C
MATEE7B:
MOV DPTR,#0C003H
MOVX A,@DPTR
MOV R2,A
SJMP MATEE9A ;只与一个向量的一级匹配率超过60%,则找到匹配向量
MATEE7C: ;与若干个向量的一级匹配率都超过60%,则进入二级匹配
MOV R0,#0
MOV R6,#0
MOV DPTR,#0C000H ;哨兵单元的匹配成功次数清0
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#0C003H ;定位到第一个向量的绑定行号地址
MATEE8:
PUSH DPH
PUSH DPL
MOVX A,@DPTR
MOV R2,A ;给定行号
MOV DPTR,#SEC ;定位相应向量的Kη的单元地址
MOV A,R2
MOV B,#DIMENVOL ;给定66维向量的所占字节数
MUL AB
ADD A,#53
JNC MATEE8A
INC B
MATEE8A:
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOVX A,@DPTR
MOV R7,A ;调Kη入R7
;二级匹配,若有多个匹配比率值都超过二级匹配率,则在超过了二级匹配率的匹配值中选择最大的
;将相应的行号赋给R2带出,即为匹配向量的行号
MATEE8B:
LCALL SECKBP ;进入二级匹配,将KK中的基元与SEC中向量相应基元进行子基元匹配
LCALL CHILDELT
INC R4
CJNE R4,#48,MATEE8B
;48个基元比较完,同时完成一个向量
MOV A,R0 ;再次计算ε=R0/R6*100%
MOV B,#10
MUL AB
;MOV R6,#192
LCALL DIVIDE
CJNE A,07H,MATEE8C ;判ε<Kη否?
MATEE8C:
JC MATEE8E
MOV DPTR,#0C000H ;现有匹配值>哨兵单元匹配值,覆盖哨兵单元
MOVX A,@DPTR ;匹配值
CJNE A,00H,MATEE8D
SJMP MATEE8E
MATEE8D:
JNC MATEE8E
MOV A,R0
MOVX @DPTR,A ;将较大的匹配值写入哨兵单元
INC DPTR
MOV A,R2 ;将相应的行号写入哨兵单元
MOVX @DPTR,A
MATEE8E:
POP DPL
POP DPH
MOV R4,#0 ;列号清0
MOV R0,#0 ;R0,R6清0
MOV R6,#0
INC DPTR ;指向下一个向量的匹配成功次数 位置
INC DPTR ;指向下一个向量的绑定行号 位置
DJNZ R1,MATEE8
MATEE9:
MOV DPTR,#0C001H
MOVX A,@DPTR ;将匹配向量的行号赋给R2带出
MOV R2,A
MATEE9A:
SETB RF
MATEE10:
POP 07H
POP 06H
POP 05H
POP 04H
POP 03H
POP 01H
POP 00H
SETB TR0
RET
MATEE11: ;LCALL REFUSEMUS ;播放拒识音乐
SJMP MATEE10
;******************************************************
;动态数组管理模块:
;带入参数:TF,持卡时间有效标志
;
;匹配成功进入本模块:
;像卡逻辑关系处理
;1.持卡时间有效-->开锁-->刷新相应向量的48维特征向量
;2.持卡时间无效-->删除该向量,调整SEC空间,且对临界变量
; "KEYQUA"减1
;******************************************************
SECADMIN:
CLR TR0
SECADMIN1:
;SETB TF
JNB TF,SECADMIN2 ;判像卡有效否?
;逻辑关系处理
LCALL LAP ;进行匙膜逻辑分析,匙膜逻辑分析结果为2,即AND
;CLR LAEND
JNB LAEND,LOGICEND
LJMP MAIN ;关系处理尚未完成,转MAIN,等待下张卡继续插入
LOGICEND:
LCALL OPENLOCK ;开锁;
JNB CRIFLAG,SECADMIN3 ;判断临界区EEPROM访问标志可用否?
CLR CRIFLAG ;关临界区
LCALL REFRESH ;将KK替换SEC中找到的向量的48维特征,完成像卡自学习
SJMP SECADMIN4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -