📄 project(9.18).asm
字号:
MOV A,SBUF ;接收66个字节的数据
MOV DPH,23H ;将数据暂存在C400H-C441H单元
MOV DPL,22H
MOVX @DPTR,A
MOV R7,CHECK ;校验码计算
XRL A,R7
MOV R7,A
MOV CHECK,R7
INC DPTR
MOV 23H,DPH
MOV 22H,DPL
MOV A,SBUF
MOV SBUF,A
JNB TI,$
CLR TI
MOV R6,COUNT
DJNZ R6,R18
LJMP R13 ;转发送校验码
R15: ;销卡处理
MOV A,SBUF ;接收RoomID,保存在27单元
MOV 27H,A
MOV SBUF,A
JNB TI,$
CLR TI
JNB RI,$
CLR RI
MOV A,SBUF ;接收CardID,保存在28H单元
MOV 28H,A
;调用销卡结帐程序
R16:
JNB CRIFLAG,R17 ;判临界区访问标志可用否?
CLR CRIFLAG ;关临界区
LCALL DELIIC
SETB CRIFLAG ;开临界区
SJMP T11A
R17:
LCALL DL100MS
SJMP R16
R18:
MOV COUNT,R6
AJMP INT_END
T11A:
; MOV SBUF,#0FCH ;销卡成功,回送FCH
SETB SM2 ;恢复SM2
AJMP INT_END
T11:
MOV CHECK,#00H ;异或校验字,存放24H单元
MOV COUNT,#DIMENVOL ;接收字节计数器值存放于R0
MOV 23H,#0C4H ;设置接收数据指针DPH
MOV 22H,#00H ;DPL
MOV SBUF,#0FCH ;数据发布成功,回送FCH
JNB TI,$
CLR TI
WRTEEPROM:
JNB CRIFLAG,WRTEEPROM1;判临界区访问标志可用否?
CLR CRIFLAG ;关临界区
MOV DPTR,#KEYQUA ;EEPROM首地址C800H存放样本计数值KEYQUA
MOVX A,@DPTR
MOV R0,A
INC A
MOV DPTR,#KEYQUA ;EEPROM首地址C800H存放样本计数值KEYQUA
MOVX @DPTR,A ;存放更新后的KEYQUA值
LCALL WRDELAY
;R0为样本的行号(以此确定该样本的地址)
LCALL WEEPROM ;调用写EEPROM延时
SETB SM2 ;恢复SM2
SETB CRIFLAG ;开临界区
SJMP INT_END
WRTEEPROM1:
LCALL DL100MS ;延时等待临界区访问标志可用
SJMP WRTEEPROM
INT_END:
POP 06H
POP 07H
POP 05H
POP 04H
POP 03H
POP ACC
; POP PSW ;恢复PSW,使用寄存器0
SETB EA ;开中断
MOV IP,#10H ;设置串口中断为最高优先级
SETB TR0
RETI
;///////////////////////////////////////////////////////////////////////////////
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 图域整定模块,GA-->GB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIFFEREN:
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
MOV R0,#40H ;建立片内RAM 2x4数组首地址
MOV R2,#00H ;GA合成次数 计数器
MOV R3,#00H ;GA地址缓冲器
MOV R4,#0C0H
MOV DPTR,#0C000H ;建立GA的初始地址
DIFF1:
MOVX A,@DPTR ;从扩展RAM取GA两行到片内RAM
MOVX @R0,A
CJNE R0,#47H,DIFF2
MOV R0,40H ;两行像素进行"或"关系合成
MOV A,44H
ORL A,R0
MOV 40H,A
MOV R0,41H
MOV A,45H
ORL A,R0
MOV 41H,A
MOV R0,42H
MOV A,46H
ORL A,R0
MOV 42H,A
MOV R0,43H
MOV A,47H
ORL A,R0
MOV 43H,A
PUSH DPH ; DPH=0C0H,DPL=48H ......
PUSH DPL
MOV R1,#40H
MOV DPH,R4
MOV DPL,R3
SJMP DIFF4 ;合成完毕后转去送回GA
DIFF2:
INC R0
DIFF3:
INC DPTR
SJMP DIFF1
DIFF4:
MOVX A,@R1 ;片内RAM 2x4工作数组内容回送GA
MOVX @DPTR,A
CJNE R1,#43H,DIFF5
INC DPTR
MOV R4,DPH
MOV R3,DPL
POP DPL ;DPH=0C0H,DPL=07H
POP DPH
CJNE R2,#7FH,DIFF6 ;128行合成完毕否?完毕则返回,未完则转DIFF6继续
POP 04H
POP 03H
POP 02H
POP 01H
POP 00H
RET
DIFF5:
INC R1
INC DPTR
SJMP DIFF4
DIFF6:
INC R2
MOV R0,#40H
SJMP DIFF3
;图像规范化模块,GB-->GC
GSTAN:
CLR TR0
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 06H
MOV R0,#0
MOV R1,#31*4 ;建立第一个被整定位的单元地址
MOV R2,#0
MOV R3,#0
MOV R4,#0
MOV R5,#1 ;建立仅有一个1的逻辑工作向量
MOV R6,#0FEH ;建立仅有一个0的逻辑工作向量
MOV P2,#0C0H ;确定GB各单元的高8位地址码
GSTAN1:
MOVX A,@R1 ;用逻辑运算方式在GB中提取有效像素位
ANL A,R5 ;具体算法见论文
JZ GSTAN2
MOVX A,@R0
ORL A,R5
SJMP GSTAN3
GSTAN2:
MOVX A,@R0
ANL A,R6
GSTAN3:
MOVX @R0,A ;将提取的有效像素放入GC的规定位
CJNE R2,#31,GSTAN4 ;一列整定完毕否?(R2=31?)未完继续
SJMP GSTAN5 ;整定完转去换列
GSTAN4:
INC R2
INC R1 ;增加4个字节,换到同列下一个被整定位的单元
INC R1
INC R1
INC R1
INC R0 ;目的地址相应增加4个字节
INC R0
INC R0
INC R0
SJMP GSTAN1
GSTAN5:
CJNE R3,#7,GSTAN6 ;8列整定完否?未完换小列
SJMP GSTAN7 ;整完,转判是否全部整完
GSTAN6:
MOV R2,#0 ;换小列
INC R3
MOV A,R1 ;修正待整定的有效像素位的单元地址
SUBB A,#4*(32+32/8-1)-1; X2<-X2 -(N+N/K-1)
MOV R1,A
MOV A,R0 ;修正目的区域地址
SUBB A,#4*(32-1) ; X3<-X3 -(N-1)
MOV R0,A
SJMP GSTAN9
GSTAN7:
CJNE R4,#3,GSTAN8 ;未全部整定完换大列
SJMP GSTAN11 ;否则转返回
GSTAN8:
MOV R2,#0
MOV R3,#0
INC R4
MOV A,R1
SUBB A,#(4*32/8)-1 ;X2<-X2 -N/K
MOV R1,A
MOV A,R0
SUBB A,#4*(32-1) ;X3<-X3 -(N-1)
MOV R0,A
GSTAN9:
MOV A,R6 ;R5(X5)和R6(/X5)分别循环左移一位
RL A
MOV R6,A
MOV A,R5
RL A
MOV R5,A
CJNE R5,#1,GSTAN10 ;R5=00000001?整完一个字节?
INC R1 ;跨到左边隔壁单元
INC R0
GSTAN10:
AJMP GSTAN1
GSTAN11:
POP 06H
POP 05H
POP 04H
POP 03H
POP 02H
POP 01H
POP 00H
SETB TR0
RET
;*********************************************************
;图像去躁子程序
;R1:先用于图域GC末尾加一行0处理的地址指针;后用于全图域
;处理的地址指针。
;*********************************************************
LEVEL:
PUSH 01H
PUSH ACC
PUSH B
MOV R1,#80H ;GC的范围0C000H~0C07FH
MOV P2,#0C0H ;增加全为0的一行(4个字节C080H~C083H)
MOV A,#0
LEVEL1:
MOVX @R1,A
CJNE R1,#83H,LEVEL2
AJMP LEVEL3
LEVEL2:
INC R1
AJMP LEVEL1
LEVEL3:
MOV R1,#08H ;将GDBUF(内部RAM 08H~13H)清0
LEVEL30:
MOV @R1,A
CJNE R1,#13H,LEVEL31
AJMP LEVEL32
LEVEL31:
INC R1
AJMP LEVEL30
LEVEL32:
MOV R1,#0
LCALL GCTOGBUF
LEVEL4:
LCALL GCTOGBUF
LCALL FLABBY
LCALL PROPERTY
LCALL CENCON
DEC R1 ;在GCTOGBUF中,R1地址指针因读数据向前
DEC R1 ;移动4个字节,现要将去躁后的数据写回
DEC R1 ;原地址,故要向后移动4个字节
DEC R1
LCALL GBUFTOGC
INC R1
INC R1
INC R1
INC R1
CJNE R1,#131,LEVEL5 ;(32*32/8)+4=132 (0~131)
POP B
POP ACC
POP 01H
RET
LEVEL5:
INC R1
LCALL PAARR
AJMP LEVEL4
;***********************************************************************
;特征提取模块
;ROWST:行点色标志。ROWST=0,表示前一点为白点,反之为黑色
;C250H,C251H,C252H,C253H这4个工作单元为列点色标志,c250H(31--24列),
;c251H(23--16列),c252H(15--8列),c253H(7--0列).
;32行行穿透次数直接存入KK中的C200H--C21FH单元。32列列穿透次数暂存在
;以C254H开始的32个单元,提完特征后再选奇数列存入KK中的的C220H--C22FH单元
;GC(C000H--C07FH),片外工作数组(C250H--?),KK(C200H--C22FH)
;***********************************************************************
TAK:
CLR TR0
PUSH 00H
PUSH 01H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 06H
PUSH 07H
MOV P2,#0C2H ;建立片外工作数组& KK首地址高8位
MOV R7,#32 ;32个临时列穿透计数单元
MOV R0,#54H ;建立片外工作数组首地址低8位
MOV R1,#00H ;建立KK中行穿透计数单元首地址低8位(行穿透:C200H~C21FH)
MOV A,#0
TAK1:
MOVX @R0,A ;工作数组,KK清0
MOVX @R1,A
INC R0
INC R1
DJNZ R7,TAK1
MOV R0,#50H
MOV A,#0FFH
TAK1A:
MOVX @R0,A ;对4个列点色标志字节置1
INC R0
CJNE R0,#54H,TAK1A
MOV R0,#7FH ;建立GC首地址低8位,从最后一个单元开始提取特征,32*4-1=127
MOV R5,#50H ;建立片外工作数组首地址低8位
MOV R4,#00H ;建立KK中行穿透次数计数单元首地址低8位
MOV R3,#54H ;连续白点计数单元首地址低8位
MOV R6,#80H ;R6用来提位,初始为10000000
SETB ROWST ;白点标志置1,上跳沿计数
TAK2:
MOV P2,#0C0H ;建立图域GC首地址高8位
MOVX A,@R0 ;从GC提取一个字节
ANL A,R6 ;提取该字节要判断的位
MOV P2,#0C2H ;在跳转之前,修改页地址
JZ TAK4 ;是白点则转TAK4
JB ROWST,TAK3 ;本点为黑点,判同行的前一点是否为黑点,若为黑点,转TAK3
SETB ROWST ;同行:白/黑,同行前一点为白点,则置黑点标志
MOV A,R4 ;由白变黑,该行穿透次数加1
MOV R1,A
MOVX A,@R1 ;KK[R4]<-KK[R4]+1,一个字节的行跳沿次数达到4次的
MOV B,A ;只记做3次
ANL A,#03H
SUBB A,#03H ;若已达到3次,则不作修改,直接跳到TAK3
JZ TAK3
MOV A,B ;否则照常+1
INC A
MOVX @R1,A
TAK3: ;同行:黑/黑
MOV A,R5 ;判同列的前一点(该点是上一行中同列的点,若上一点为白点,
MOV R1,A
MOVX A,@R1 ;现在这行的点又为黑点,既完成了一个跳沿)是否为白点?
ANL A,R6 ;(R5)=50H/51H/52H/53H 列点色标志
; 53H 52H 51H 50H
JNZ TAK5 ; 31----24 23----16 15----8 7----0
; ........ ........ ........ ........
; ........ ........ ........ ........
;上一点为白点
MOVX A,@R1 ;现在的点是黑点,用1在列点色标志相应位标记
ORL A,R6
MOVX @R1,A
MOV A,R3 ;该列的穿透次数加1,
MOV R1,A
MOVX A,@R1
MOV B,A ;一列的每8个像素跳沿次数达到4次的只记做3次
ANL A,#03H
SUBB A,#03H
JZ TAK5
MOV A,B
INC A
MOVX @R1,A
SJMP TAK5
TAK4:
CLR ROWST ;置相应位为白点标志0
MOV A,R6
CPL A
MOV B,A
MOV A,R5
MOV R1,A
MOVX A,@R1
ANL A,B
MOVX @R1,A
TAK5:
INC R3 ;列穿透计数单元地址+1
MOV A,R6 ;调整R6的提位位
CLR C
RRC A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -