⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eg1920.asm

📁 这是几年前我写的
💻 ASM
📖 第 1 页 / 共 5 页
字号:
		XRL	A, #0AFH
		JZ	PelcoP_95&X

		XRL	A, #0FH			; PelcoP 的变种
		JZ	PelcoP_95&X
PelcoP_94&X:
		ORL	State&X, #20H
		SJMP	PelcoP_7&X
PelcoP_95&X:
		ORL	State&X, #80H
		ORL	State&X, #20H
PelcoP_7&X:
		ANL	State&X, #0E0H
		SJMP	PelcoP_9&X
PelcoP_8&X:
		INC	State&X
PelcoP_9&X:
	ENDM
;----------------------------------------------- 三星协议
; 入口:
; B = 当前指令字节
; X        FIFO 通道号
; State    b0-b4 = 状态, b7=1 协议正确, b6=1 地址匹配正确, b5=1 解码完成
; Command  b0-b4 = 指令
; Check,ProCmd1,ProCmd2 临时变量
; 出口:
; State.7, State.6, Command
SamSung	MACRO	X
		MOV	A, State&X
		ANL	A, #0FH
		MOV	RegC, A
		RL	A
		ADD	A, RegC
		MOV	DPTR, #SamSung_2&X
		JMP	@A+DPTR
SamSung_2&X:
		LJMP	SamSung_10&X
		LJMP	SamSung_20&X
		LJMP	SamSung_30&X
		LJMP	SamSung_40&X
		LJMP	SamSung_50&X
		LJMP	SamSung_60&X
		LJMP	SamSung_70&X
		LJMP	SamSung_80&X
		LJMP	SamSung_90&X
SamSung_10&X:
		MOV	A, B
		CJNE	A, #0A0H, SamSung_19&X
SamSung_18&X:
		LJMP	SamSung_8&X
SamSung_19&X:
		LJMP	SamSung_94&X
SamSung_20&X:
		MOV	A, B
		MOV	Check&X, A
		LJMP	SamSung_8&X
SamSung_30&X:
		MOV	A, B
		XCH	A, Check&X
		ADD	A, Check&X
		XCH	A, Check&X

		XRL	A, Address
		JNZ	SamSung_36&X

		ORL	State&X, #40H
		MOV	Command&X, #cFree
		LJMP	SamSung_8&X
SamSung_36&X:
		LJMP	SamSung_8&X
SamSung_40&X:
SamSung_70&X:
SamSung_80&X:
		MOV	A, B
		XCH	A, Check&X
		ADD	A, Check&X
		XCH	A, Check&X

		LJMP	SamSung_8&X
SamSung_50&X:
		MOV	A, B
		XCH	A, Check&X
		ADD	A, Check&X
		XCH	A, Check&X

		MOV	ProCmd1&X, A
		JNB	ACC.0, SamSung_52&X
		MOV	Command&X, #cFocusFar
		SJMP	SamSung_59&X
SamSung_52&X:
		JNB	ACC.1, SamSung_53&X
		MOV	Command&X, #cFocusNear
		SJMP	SamSung_59&X
SamSung_53&X:
		JNB	ACC.3, SamSung_54&X
		MOV	Command&X, #cIrisOpen
		SJMP	SamSung_59&X
SamSung_54&X:
		JNB	ACC.4, SamSung_55&X
		MOV	Command&X, #cIrisClose
		SJMP	SamSung_59&X
SamSung_55&X:
		JNB	ACC.5, SamSung_56&X
		MOV	Command&X, #cZoomTele
		SJMP	SamSung_59&X
SamSung_56&X:
		JNB	ACC.6, SamSung_59&X
		MOV	Command&X, #cZoomWide
SamSung_59&X:
		LJMP	SamSung_8&X
SamSung_60&X:
		MOV	A, B
		XCH	A, Check&X
		ADD	A, Check&X
		XCH	A, Check&X

		MOV	ProCmd2&X, A
		JNB	ACC.0, SamSung_62&X
		MOV	Command&X, #cLeft

		JNB	ACC.2, SamSung_625&X
		MOV	Command&X, #cUpLeft
SamSung_625&X:
		JNB	ACC.3, SamSung_69&X
		MOV	Command&X, #cDownLeft
		SJMP	SamSung_69&X
SamSung_62&X:
		JNB	ACC.1, SamSung_63&X
		MOV	Command&X, #cRight

		JNB	ACC.2, SamSung_635&X
		MOV	Command&X, #cUpRight
SamSung_635&X:
		JNB	ACC.3, SamSung_69&X
		MOV	Command&X, #cUpLeft
		SJMP	SamSung_69&X
SamSung_63&X:
		JNB	ACC.2, SamSung_64&X
		MOV	Command&X, #cUp
		SJMP	SamSung_69&X
SamSung_64&X:
		JNB	ACC.3, SamSung_67&X
		MOV	Command&X, #cDown
		SJMP	SamSung_69&X
SamSung_67&X:
		MOV	A, ProCmd1&X
		ORL	A, ProCmd2&X
		JNZ	SamSung_69&X

		MOV	Command&X, #cFree
SamSung_69&X:
		LJMP	SamSung_8&X
SamSung_90&X:
		MOV	A, B
		ADD	A, #0A0H
		ADD	A, Check&X
		XRL	A, #9FH
		JZ	SamSung_95&X
SamSung_94&X:
		ORL	State&X, #20H
		SJMP	SamSung_7&X
SamSung_95&X:
		ORL	State&X, #80H
		ORL	State&X, #20H
SamSung_7&X:
		ANL	State&X, #0E0H
		SJMP	SamSung_9&X
SamSung_8&X:
		INC	State&X
SamSung_9&X:
	ENDM
;----------------------------------------------- 自定义协议
; 入口:
; sTemp&X = 当前指令串
; X        FIFO 通道号
; 出口:
; CmdRun  = 指令
CustPro MACRO X
		MOV	A, CustLenMax
		CJNE	A, CmdStrLen&X, $+3
		JC	CustPro_1&X

		MOV	A, CmdStrLen&X
		CJNE	A, CustLenMin, $+3
		JC	CustPro_1&X
						; if 长度符合
		MOV	RegG, #sTemp&X
		LCALL	SearchTab
		CJNE	A, #0FFH, CustPro_3&X
CustPro_1&X:					  ; if 未找到匹配串
		MOV	CmdRun, #cFree+80H	    ; 作停止指令
		SJMP	CustPro_9&X
CustPro_3&X:					  ; if 找到匹配串
		MOV	DPTR, #DefTab
		MOVC	A, @A+DPTR
		ORL	A, #80H
		MOV	CmdRun, A		    ; 执行对应指令

		MOV	LedCmd2, #cLedFlash
		CLR	bTestBaud
		MOV	BaudErr34, #00H
		MOV	PolarErr3, #00H
		MOV	PolarErr4, #00H
		DEC	ProErr&X
		ANL	ProErr&X, #0F8H
		JNB	bNoStopCmd, CustPro_9&X

		MOV	VarDelaySw, #cDelaySw1
		MOV	VarDelayCam, #cDelayCam1 
CustPro_9&X:
;		CLR	bXHi8
	ENDM
;----------------------------------------------- 协议控制
ProtocolCtrl MACRO	X
		MOV	RegC, #sTemp&X
		MOV	A, @RegC
		JNB	ACC.7, ProtocolCtrl_1&X
ProtocolCtrl_0&X:
		LJMP	ProtocolCtrl_99&X
ProtocolCtrl_1&X:
		MOV	A, State&X
		ANL	A, #00101111B
		MOV	RegE, A
		GetStr	X, R_E, B
		JZ	ProtocolCtrl_0&X
						; B = 当前指令
		MOV	A, Protocol&X
		ANL	A, #07H
		MOV	RegC, A
		RL	A
		ADD	A, RegC
		MOV	DPTR, #ProtocolCtrl_2&X
		JMP	@A+DPTR
ProtocolCtrl_2&X:
		LJMP	ProtocolCtrl_10&X
		LJMP	ProtocolCtrl_20&X
		LJMP	ProtocolCtrl_30&X
		LJMP	ProtocolCtrl_40&X
		LJMP	ProtocolCtrl_50&X
		LJMP	ProtocolCtrl_60&X
		LJMP	ProtocolCtrl_70&X
		LJMP	ProtocolCtrl_80&X
ProtocolCtrl_10&X:
		PelcoD	X
		LJMP	ProtocolCtrl_9&X
ProtocolCtrl_20&X:
		PelcoP	X
		LJMP	ProtocolCtrl_9&X
ProtocolCtrl_30&X:
		SamSung	X
		LJMP	ProtocolCtrl_9&X
ProtocolCtrl_40&X:
ProtocolCtrl_50&X:
ProtocolCtrl_60&X:
ProtocolCtrl_70&X:
ProtocolCtrl_80&X:
		LJMP	ProtocolCtrl_99&X
ProtocolCtrl_9&X:
		MOV	A, State&X
		JNB	ACC.5, ProtocolCtrl_99&X
		JNB	ACC.7, ProtocolCtrl_97&X
						; if 解码正确
;		MOV	VarDelaySw, #cDelaySw0
;		MOV	VarDelayCam, #cDelayCam0
		CLR	bTestBaud
		MOV	BaudErr34, #00H
		MOV	PolarErr3, #00H
		MOV	PolarErr4, #00H
		CLR	bProErr&X
		MOV	A, ProErr&X
		JZ	ProtocolCtrl_93&X

		DEC	ProErr&X
		ANL	ProErr&X, #0FCH
ProtocolCtrl_93&X:
		MOV	A, State&X
		JNB	ACC.6, ProtocolCtrl_94&X
						  ; if 地址正确
		MOV	A, Command&X
		ORL	A, #80H
		MOV	CmdRun, A
		MOV	LedCmd2, #cLedFlash
;		MOV	State&X, #00H
		SJMP	ProtocolCtrl_99&X
ProtocolCtrl_94&X:
		MOV	LedCmd2, #cLedBreak
;		MOV	State&X, #00H
		SJMP	ProtocolCtrl_99&X
ProtocolCtrl_97&X:				; else 解码错误
		MOV	LedCmd2, #cLedBlink
		SETB	bProErr&X
;		MOV	State&X, #00H
ProtocolCtrl_99&X:
	ENDM
;----------------------------------------------- 检测协议
ProDect	MACRO	X

		MOV	A, Protocol&X
		CJNE	A, #cPelcoD, ProDect_2&X

		MOV	A, CmdStrLen&X
		CJNE	A, #07H, ProDect_A&X

		SJMP	ProDect_9&X
ProDect_2&X:
		CJNE	A, #cPelcoP, ProDect_3&X

		MOV	A, CmdStrLen&X
		CJNE	A, #08H, ProDect_A&X

		SJMP	ProDect_9&X
ProDect_3&X:
		CJNE	A, #cSamSung, ProDect_4&X

		MOV	A, CmdStrLen&X
		CJNE	A, #09H, ProDect_A&X

		SJMP	ProDect_9&X
ProDect_4&X:
		LJMP	ProDect_9&X
ProDect_A&X:
		CJNE	A, #07H, ProDect_B&X
		MOV	Protocol&X, #cPelcoD
		SJMP	ProDect_8&X
ProDect_B&X:
		CJNE	A, #08H, ProDect_C&X
		MOV	Protocol&X, #cPelcoP
		SJMP	ProDect_8&X
ProDect_C&X:
		CJNE	A, #09H, ProDect_D&X
		MOV	Protocol&X, #cSamSung
		SJMP	ProDect_8&X
ProDect_D&X:
		SETB	bProErr&X
		SJMP	ProDect_9&X
ProDect_8&X:
		SETB	bSetChange
ProDect_9&X:
	ENDM
;----------------------------------------------- 协议学习
ProDefine MACRO
		MOV	RegC, #sTemp3
		MOV	A, @RegC
		JB	ACC.6, ProDefine_1
ProDefine_0:
		LJMP	ProDefine_9
ProDefine_1:
		MOV	TestDelay, #cTestDefine
		CLR	ACC.6
		MOV	@RegC, A
		MOV	String1, #sTemp1
		MOV	String2, #sTemp3
		LCALL	StrCmp
		JNZ	ProDefine_3
						; if 串1 == 串3
		INC	StrCount1
		MOV	A, StrCount1
		CJNE	A, #cStrCount, $+3
		JC	ProDefine_0

		MOV	String1, #sTemp1
		MOV	A, CustomLen
		JNZ	ProDefine_S
						  ; if 是首串
		MOV	A, StrCount2
		CJNE	A, #cStrCount/3, $+3
		JNC	ProDefine_T
ProDefine_S:
		MOV	A, StrCount2
		CJNE	A, #cStrCount/2, $+3
		JC	ProDefine_A
ProDefine_T:
		MOV	String2, #sTemp2
		SJMP	ProDefine_6
ProDefine_A:
		MOV	String2, #00H
		SJMP	ProDefine_6
ProDefine_3:					; else 
		MOV	String1, #sTemp2
		MOV	String2, #sTemp3
		LCALL	StrCmp
		JNZ	ProDefine_4
						  ; if 串2 == 串3
		INC	StrCount2
		MOV	A, StrCount2
		CJNE	A, #cStrCount, $+3
		JC	ProDefine_0

		MOV	String1, #sTemp2
		MOV	A, CustomLen
		JNZ	ProDefine_U
						    ; if 是首串
		MOV	A, StrCount2
		CJNE	A, #cStrCount/3, $+3
		JNC	ProDefine_V
ProDefine_U:
		MOV	A, StrCount1
		CJNE	A, #cStrCount/2, $+3
		JC	ProDefine_B
ProDefine_V:
		MOV	String2, #sTemp1
		SJMP	ProDefine_6
ProDefine_B:
		MOV	String2, #00H
		SJMP	ProDefine_6
ProDefine_4:					; else
		MOV	RegC, #sTemp3
		MOV	A, @RegC
		CJNE	A, #03H, $+3
		JC	ProDefine_P		  ; if 长度 < 3, 抛弃
						  
		CPL	bTmpPtr
		JB	bTmpPtr, ProDefine_5
						  ; if 轮到修改 sTemp1
		MOV	String1, #sTemp1
		MOV	String2, #sTemp3
		LCALL	StrCopy			    ; sTemp1 = sTemp3
		MOV	StrCount1, #00H
ProDefine_P:
		MOV	RegC, #sTemp3
		MOV	@RegC, #00H
		LJMP	ProDefine_9
ProDefine_5:					  ; else 轮到修改 sTemp2
		MOV	String1, #sTemp2
		MOV	String2, #sTemp3
		LCALL	StrCopy			    ; sTemp2 = sTemp3
		MOV	StrCount2, #00H
		MOV	RegC, #sTemp3
		MOV	@RegC, #00H
		LJMP	ProDefine_9
ProDefine_6:					; if 重复计数已到
;		SETB	bXHi8
		CLR	bTestBaud
		CLR	A
		MOV	BaudErr34, A
		MOV	PolarErr3, A
		MOV	PolarErr4, A
		MOV	ProErr1, A
		MOV	ProErr2, A

		MOV	StrCount1, A
		MOV	StrCount2, A
		ANL	CustomLen, #0FH
		MOV	A, CustomLen
		JNZ	ProDefine_C
						  ; if 是首串, 直接存入 EEPROM
		MOV	A, String2
		JNZ	ProDefine_G
						    ; if 没有停止串
		MOV	RegC, #00H
		MOV	R_H, #01H
		CLR	A
		CLR	bSame
		LCALL	XrWrite			      ; 置 0
		INC	CustomLen
		MOV	RegC, String1
		SJMP	ProDefine_H
ProDefine_G:					    ; else 
		MOV	RegC, String2
		MOV	R_H, #10H
		MOV	A, CustomLen
		SWAP	A
		CLR	bSame
		LCALL	XrWrite			      ; 停止串存入EEPROM
		INC	CustomLen
ProDefine_H:
		LJMP	ProDefine_7
ProDefine_C:
		CJNE	A, #02H, ProDefine_J
						  ; else if 是次首串
		SETB	bLineLock
		MOV	RegG, String1
		LCALL	SearchTab		    ; 在 EEPROM 中先找 String1
		MOV	RegH, A			    ; H 暂存位置
		CPL	A
		JZ	ProDefine_K
						    ; if 找到
		MOV	A, String2
		JZ	ProDefine_L
						      ; if String2 有效
		MOV	RegG, String2
		LCALL	SearchTab			; 再找 String2
		CJNE	A, #0FFH, ProDefine_L
							; if 没找到, 则 String1 是停止串
		MOV	A, RegH
		JZ	ProDefine_J
							  ; if 刚才首串存储错误
		MOV	A, #00H				    
		MOV	RegH, #10H
		MOV	RegC, #sTemp3
		CLR	bSame
		LCALL	XrRead				    ; 读出 0 号串

		MOV	RegC, #sTemp3
		MOV	R_H, #10H
		MOV	A, #10H				    ; 存入 1 号串位置
		CLR	bSame
		LCALL	XrWrite

		MOV	RegC, String1
		MOV	R_H, #10H
		MOV	A, #00H				    ; String1 存入 0 号串位置
		CLR	bSame
		LCALL	XrWrite
		SJMP	ProDefine_J
ProDefine_L:					      ; else
		MOV	A, #01H				; 执行向上指令
		SJMP	ProDefine_8
ProDefine_K:					    ; else String1 未找到
		MOV	A, String2
		JZ	ProDefine_J
						      ; if String2 有效
		MOV	RegG, String2
		LCALL	SearchTab			; 再找 String2
		CJNE	A, #0FFH, ProDefine_M
							; if 没找到
		SJMP	ProDefine_9			  ; 抛弃该串
ProDefine_M:						; else String2 是停止串
		JZ	ProDefine_J
							  ; if 刚才首串存储错误
		MOV	A, #00H				    
		MOV	RegH, #10H
		MOV	RegC, #sTemp3
		CLR	bSame
		LCALL	XrRead				    ; 读出 0 号串

		MOV	RegC, #sTemp3
		MOV	R_H, #10H
		MOV	A, #10H				    ; 存入 1 号串位置
		CLR	bSame
		LCALL	XrWrite

		MOV	RegC, String2
		MOV	R_H, #10H
		MOV	A, #00H				    ; String2 存入 0 号串位置
		CLR	bSame
		LCALL	XrWrite
ProDefine_J:					  ; else
		MOV	RegG, String1
		LCALL	SearchTab		    ; 在 EEPROM 中先查找一遍
		CJNE	A, #0FFH, ProDefine_E
						    ; if EEPROM 中没找到 String1
		MOV	RegC, String1		      ; 把 String1 写入EEPROM
		SJMP	ProDefine_7
ProDefine_E:					    ; else
		JNZ	ProDefine_8
						      ; if 是停止指令
		MOV	A, String2
		JZ	ProDefine_9
							; if String2 还有一条指令
		MOV	RegG, String2
		LCALL	SearchTab			  ; 在 EEPROM 中查找一遍
		CJNE	A, #0FFH, ProDefine_F
							  ; if EEPROM 中没找到 String2
		MOV	RegC, String2			    ; 把 String2 写入EEPROM
		SJMP	ProDefine_7
ProDefine_F:					          ; else
		SJMP	ProDefine_8			    ; 执行该指令
ProDefine_7:
		MOV	R_H, #10H
		MOV	A, CustomLen
		SWAP	A
		CLR	bSame
		LCALL	XrWrite			      ; 存入EEPROM

		INC	CustomLen
		MOV	A, CustomLen
		ANL	A, #0F0H
		JNZ	ProDefine_D

		MOV	RegC, #0FFH
		MOV	R_H, #01H
		MOV	A, CustomLen
		SWAP	A
		CLR	bSame
		LCALL	XrWrite			      ; 置结尾标记
ProDefine_D:
;		CLR	bXHi8

		MOV	A, CustomLen
		DEC	A
ProDefine_8:
		MOV	DPTR, #DefTab
		MOVC	A, @A+DPTR
		ORL	A, #80H
		MOV	CmdRun, A		  ; 执行对应指令
ProDefine_9:		
	ENDM
;----------------------------------------------- 指令串长度提取
GetCmdStrLen	MACRO	X

		MOV	A, TenBitDelay&X
		JNZ	GetCmdStrLen_3&X
						; if 串延时到
		MOV	TenBitDelay&X, #0FFH
		MOV	A, CmdLenCount&X
		JZ	GetCmdStrLen_3&X

		MOV	CmdStrLen&X, A		  ; 置串长度
		MOV	CmdLenCount&X, #00H
		MOV	State&X, #00H		  ; 清解码状态
		INC	ProErr&X		  ; 串接收计数
		JB	bDefine, GetCmdStrLen_4&X
						  ; if 未正在定义协议

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -