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

📄 eg1920.asm

📁 这是几年前我写的
💻 ASM
📖 第 1 页 / 共 5 页
字号:
		JB	ACC.1, BitDrv_H
BitDrv_S:					      ; if 波特率!=9600,置波特率错误
;		INC	BaudErr34		    
BitDrv_H:
		LJMP	BitDrv_4
BitDrv_C:
		RL	A			    ; A = 2/3 BaudRate
		DEC	A
		CJNE	A, R_E, $+3
		JC	BitDrv_3
						    ; if 1/3 < X < 2/3,波特率错误,但位仍然有效
		JNB	bSelect3, BitDrv_M	      ; 未被选中的通道没有发言权
		JB	bStartBit3, BitDrv_E
		SJMP	BitDrv_3
BitDrv_M:		
		JNB	bStartBit4, BitDrv_3
BitDrv_E:		
		INC	BaudErr34
BitDrv_3:
		BitIn	b2, 3
		BitIn	b3, 4
BitDrv_4:
		JB	bTestBaud, BitDrv_D

		LJMP	BitDrv_8
BitDrv_D:					; if 有新的波特率要测试
		MOV	A, RegB
		XRL	A, #0CH
		ANL	A, #0CH
		JNZ	BitDrv_G

		JB	bStartBit3, BitDrv_G
		JB	bStartBit4, BitDrv_G
						; if 维持 1,且无通道正在工作,抛弃
		LJMP	BitDrv_8		
BitDrv_G:		
		MOV	A, #cBaudClock
		CLR	C
		SUBB	A, @RegC
		MOV	RegE, A			; E = 脉宽
BitDrv_5:
		MOV	A, RegE
		CJNE	A, BaudRate5, $+3
		JC	BitDrv_6

		SUBB	A, BaudRate5
		MOV	RegE, A

		BitTest	b2, 5
		BitTest	b3, 6

		SJMP	BitDrv_5
BitDrv_6:					; if 不够
		MOV	A, BaudRate5
		RR	A
		ANL	A, BaudRate5		  ; A = 1/3 BaudRate
		CJNE	A, R_E, $+3
		JNC	BitDrv_8		  ; if < 1/3, 抛弃
		
		RL	A			    ; A = 2/3 BaudRate
		DEC	A
		CJNE	A, R_E, $+3
		JC	BitDrv_7
						    ; if 1/3 < 2/3,波特率错误,但位仍然有效
		JNB	bSelect3, BitDrv_N	      ; 假设波特率极性不会同时变化,参考34的极性
		JB	bStartBit3, BitDrv_P
		SJMP	BitDrv_7
BitDrv_N:		
		JNB	bStartBit4, BitDrv_7
BitDrv_P:		
		JNB	bStartBit5, BitDrv_Q
		INC	BaudErr5
BitDrv_Q:		
		JNB	bStartBit6, BitDrv_7
		INC	BaudErr6
BitDrv_7:
		BitTest	b2, 5
		BitTEst	b3, 6
BitDrv_8:
		INC	BitBufEptr
		INC	BitBufEptr
		ANL	BitBufEptr, #cBitBufMask
		LJMP	BitDrv_0
BitDrv_9:
	ENDM
;----------------------------------------------- 提取新波特率
BaudDect MACRO
		JNB	bCheckBaud, BaudDect_9

		MOV	RegC, #sBitBuf
		MOV	RegF, #10H
		MOV	B, #0FFH
BaudDect_2:
		MOV	A, @RegC
		CPL	A
		INC	A
		ADD	A, #cBaudClock
		CJNE	A, #04H, $+3
		JC	BaudDect_3

		CJNE	A, B, $+3
		JNC	BaudDect_3

		MOV	B, A			; 提取当前缓冲区中最小位宽
BaudDect_3:
		INC	RegC
		INC	RegC
		DJNZ	RegF, BaudDect_2

		JNB	B.6, BaudDect_4		; 波特率匹配
		MOV	BaudRate5, #c600
		SJMP	BaudDect_8
BaudDect_4:
		JNB	B.5, BaudDect_5
		MOV	BaudRate5, #c1200
		SJMP	BaudDect_8
BaudDect_5:
		JNB	B.4, BaudDect_6
		MOV	BaudRate5, #c2400
		SJMP	BaudDect_8
BaudDect_6:
		JNB	B.3, BaudDect_7
		MOV	BaudRate5, #c4800
		SJMP	BaudDect_8
BaudDect_7:
		MOV	BaudRate5, #c9600
BaudDect_8:
		MOV	A, BaudRate3
		XRL	A, BaudRate5
		JZ	BaudDect_9
						; if 波特率可能变化
		SETB	bTestBaud		  ; 申请测试波特率
		CLR	A
		MOV	BaudErr34, A
		MOV	PolarErr3, A
		MOV	PolarErr4, A

		MOV	BaudErr5, A
		MOV	BaudErr6, A
		MOV	PolarErr5, A
		MOV	PolarErr6, A
		MOV	ByteCount56, A
BaudDect_9:
		CLR	bCheckBaud
	ENDM
;----------------------------------------------- 极性检测
PolarDect MACRO
		JNB	bTestBaud, PolarDect_4
						; if 正在测试波特率
		MOV	A, ByteCount56
		CJNE	A, #cByteCount56, $+3
		JC	PolarDect_3

		MOV	A, BaudErr5
		CJNE	A, BaudErr6, $+3
		JC	PolarDect_0

		MOV	A, BaudErr6
PolarDect_0:
		CJNE	A, BaudErr34, PolarDect_A
		SJMP	PolarDect_B
PolarDect_A:
		JNC	PolarDect_2
PolarDect_B:					  ; if 需要改变波特率
		MOV	A, BaudRate5
		MOV	BaudRate3, A
		SETB	bSetChange
		SetTenBitDelay
						    ; 连同极性一起修改
		MOV	A, PolarErr5
		CJNE	A, PolarErr6, $+3
		
		JC	PolarDect_1

		SETB	bSelect4
		CLR	bSelect3
		SJMP	PolarDect_2
PolarDect_1:
		SETB	bSelect3
		CLR	bSelect4
PolarDect_2:
		CLR	A
		MOV	BaudErr34, A
		MOV	BaudErr5, A
		MOV	BaudErr6, A
		MOV	PolarErr5, A
		MOV	PolarErr6, A
		MOV	ByteCount56, A
		CLR	bTestBaud
PolarDect_3:
		LJMP	PolarDect_9
PolarDect_4:					; else 检测极性
		MOV	A, PolarErr3
		CJNE	A, #cByteCount34*2, $+3
		JC	PolarDect_C

		MOV	A, PolarErr4
		JNZ	PolarDect_5

		SETB	bSelect4
		CLR	bSelect3
		SETB	bSysFree
		MOV	PolarErr3, #00H
		MOV	PolarErr4, #00H
		SJMP	PolarDect_9
PolarDect_C:
		MOV	A, PolarErr4
		CJNE	A, #cByteCount34*2, $+3
		JC	PolarDect_D

		MOV	A, PolarErr3
		JNZ	PolarDect_5

		SETB	bSelect3
		CLR	bSelect4
		SETB	bSysFree
		MOV	PolarErr3, #00H
		MOV	PolarErr4, #00H
		SJMP	PolarDect_9
PolarDect_D:
		MOV	A, BaudErr34
		CJNE	A, #cByteCount34/4, $+3
		JNC	PolarDect_7

		MOV	A, ByteCount34
		CJNE	A, #cByteCount34, $+3
		JC	PolarDect_9
PolarDect_5:
		MOV	A, PolarErr3
		CJNE	A, PolarErr4, $+3
		JC	PolarDect_6
						  ; if 4通道极性错误少
		MOV	A, PolarErr3
		CJNE	A, #cByteCount34/8+1, $+3
		JC	PolarDect_7		    ; if 3 通道错误不多,放弃

		JB	bSelect4, PolarDect_E
		SETB	bSetChange
		SETB	bSelect4		    ; 选择4通道
		CLR	bSelect3
PolarDect_E:
		MOV	A, PolarErr4
		CJNE	A, #cByteCount34/4, $+3
		JC	PolarDect_7
						    ; if 4通道极性错误 > #cByteCount34/4
		SETB	bCheckBaud		      ; 申请检测波特率
		SJMP	PolarDect_7
PolarDect_6:					  ; else if 3通道极性错误少
		JB	bSelect3, PolarDect_7

		MOV	A, PolarErr4
		CJNE	A, #cByteCount34/8+1, $+3
		JC	PolarDect_7		    ; if 4 通道错误不多,放弃

		JB	bSelect3, PolarDect_F
		SETB	bSelect3		    ; 选择3通道
		CLR	bSelect4
		SETB	bSetChange
PolarDect_F:
		MOV	A, PolarErr3
		CJNE	A, #cByteCount34/4, $+3
		JC	PolarDect_7
						    ; if 3通道极性错误 > #cByteCount34/4
		SETB	bCheckBaud		      ; 申请检测波特率
PolarDect_7:
		CLR	A
		MOV	PolarErr3, A
		MOV	PolarErr4, A
		MOV	ByteCount34, A

		XCH	A, BaudErr34
		CJNE	A, #cByteCount34/4, $+3
		JC	PolarDect_9
						  ; if 波特率错误 > #cByteCount34/4
		SETB	bCheckBaud		    ; 申请检测波特率
		SJMP	polarDect_9
PolarDect_9:
		MOV	A, ProErr1
		CJNE	A, #cProErr, $+3

		JC	PolarDect_99

		CPL	bSelect3
		CPL	bSelect4
		MOV	ProErr1, #00H
		SETB	bSetChange
PolarDect_99:
	ENDM
;----------------------------------------------- PELCO-D
; 入口:
; B = 当前指令字节
; X        FIFO 通道号
; State    b0-b4 = 状态, b7=1 协议正确, b6=1 地址匹配正确, b5=1 解码完成
; Command  b0-b4 = 指令
; Check,ProCmd1,ProCmd2 临时变量
; 出口:
; State.7, State.6, Command
PelcoD MACRO	X
		MOV	A, State&X
		ANL	A, #07H
		MOV	RegC, A
		RL	A
		ADD	A, RegC
		MOV	DPTR, #PelcoD_2&X
		JMP	@A+DPTR
PelcoD_2&X:
		LJMP	PelcoD_10&X
		LJMP	PelcoD_20&X
		LJMP	PelcoD_30&X
		LJMP	PelcoD_40&X
		LJMP	PelcoD_50&X
		LJMP	PelcoD_60&X
		LJMP	PelcoD_70&X
		LJMP	PelcoD_7&X
PelcoD_10&X:
		MOV	A, B
		CPL	A
		JZ	PelcoD_39&X

		LJMP	PelcoD_94&X
PelcoD_20&X:
		MOV	A, B
		MOV	Check&X, A
		XRL	A, Address
		JNZ	PelcoD_26&X

		MOV	Command&X, #cFree
		ORL	State&X, #40H
PelcoD_26&X:
		LJMP	PelcoD_8&X
PelcoD_30&X:
		MOV	A, B
		XCH	A, Check&X
		ADD	A, Check&X
		XCH	A, Check&X

		MOV	ProCmd1&X, A
;		JB	ACC.7, PelcoD_31&X
;		JB	ACC.6, PelcoD_31&X
;		JB	ACC.5, PelcoD_31&X

		JNB	ACC.0, PelcoD_32&X
		MOV	Command&X, #cFocusNear
		SJMP	PelcoD_39&X
PelcoD_32&X:
		JNB	ACC.1, PelcoD_34&X
		MOV	Command&X, #cIrisOpen
		SJMP	PelcoD_39&X
PelcoD_34&X:
		JNB	ACC.2, PelcoD_39&X
		MOV	Command&X, #cIrisClose
PelcoD_39&X:
		LJMP	PelcoD_8&X
PelcoD_40&X:
		MOV	A, B
		XCH	A, Check&X
		ADD	A, Check&X
		XCH	A, Check&X

		MOV	ProCmd2&X, A
		JB	ACC.0, PelcoD_4A&X

		JNB	ACC.7, PelcoD_41&X
		MOV	Command&X, #cFocusFar
		SJMP	PelcoD_49&X
PelcoD_41&X:
		JNB	ACC.6, PelcoD_42&X
		MOV	Command&X, #cZoomWide
		SJMP	PelcoD_49&X
PelcoD_42&X:
		JNB	ACC.5, PelcoD_43&X
		MOV	Command&X, #cZoomTele
		SJMP	PelcoD_49&X
PelcoD_43&X:
		JNB	ACC.4, PelcoD_44&X
		MOV	Command&X, #cDown
		JNB	ACC.2, PelcoD_435&X
		MOV	Command&X, #cDownLeft
		SJMP	PelcoD_49&X
PelcoD_435&X:
		JNB	ACC.1, PelcoD_49&X
		MOV	Command&X, #cDownRight
		SJMP	PelcoD_49&X
PelcoD_44&X:
		JNB	ACC.3, PelcoD_45&X
		MOV	Command&X, #cUp
		JNB	ACC.2, PelcoD_445&X
		MOV	Command&X, #cUpLeft
		SJMP	PelcoD_49&X
PelcoD_445&X:
		JNB	ACC.1, PelcoD_49&X
		MOV	Command&X, #cUpRight
		SJMP	PelcoD_49&X
PelcoD_45&X:
		JNB	ACC.2, PelcoD_46&X
		MOV	Command&X, #cLeft
		SJMP	PelcoD_49&X
PelcoD_46&X:
		JNB	ACC.1, PelcoD_49&X
		MOV	Command&X, #cRight
		SJMP	PelcoD_49&X
PelcoD_4A&X:
		CJNE	A, #09H, PelcoD_4C&X
		MOV	Command&X, #cAdd1On
		SJMP	PelcoD_49&X
PelcoD_4C&X:
		CJNE	A, #0BH, PelcoD_4D&X
		MOV	Command&X, #cAdd1Off
		SJMP	PelcoD_49&X
PelcoD_4D&X:
		MOV	Command&X, #cFree
PelcoD_49&X:
		LJMP	PelcoD_8&X
PelcoD_50&X:
		MOV	A, B
		XCH	A, Check&X
		ADD	A, Check&X
		XCH	A, Check&X
		SJMP	PelcoD_8&X
PelcoD_60&X:
		MOV	A, B
		XCH	A, Check&X
		ADD	A, Check&X
		XCH	A, Check&X

		CJNE	A, #02H, PelcoD_69&X

		MOV	A, Command&X
		CJNE	A, #cAdd1On, PelcoD_65&X

		MOV	Command&X, #cAdd2On
		SJMP	PelcoD_69&X
PelcoD_65&X:
		CJNE	A, #cAdd1Off, PelcoD_69&X
		MOV	Command&X, #cAdd2Off
PelcoD_69&X:
		SJMP	PelcoD_8&X
PelcoD_70&X:
		MOV	A, B
		XRL	A, Check&X
		JZ	PelcoD_95&X
PelcoD_94&X:
		ORL	State&X, #20H
		SJMP	PelcoD_7&X
PelcoD_95&X:
		ORL	State&X, #80H
		ORL	State&X, #20H
PelcoD_7&X:
		ANL	State&X, #0E0H
		SJMP	PelcoD_9&X
PelcoD_8&X:
		INC	State&X
PelcoD_9&X:
	ENDM
;----------------------------------------------- PELCO-P
; 入口:
; B = 当前指令字节
; X        FIFO 通道号
; State    b0-b4 = 状态, b7=1 协议正确, b6=1 地址匹配正确, b5=1 解码完成
; Command  b0-b4 = 指令
; Check,ProCmd1,ProCmd2 临时变量
; 出口:
; State.7, State.6, Command
PelcoP	MACRO	X
		MOV	A, State&X
		ANL	A, #07H
		MOV	RegC, A
		RL	A
		ADD	A, RegC
		MOV	DPTR, #PelcoP_2&X
		JMP	@A+DPTR
PelcoP_2&X:
		LJMP	PelcoP_10&X
		LJMP	PelcoP_20&X
		LJMP	PelcoP_30&X
		LJMP	PelcoP_40&X
		LJMP	PelcoP_50&X
		LJMP	PelcoP_60&X
		LJMP	PelcoP_70&X
		LJMP	PelcoP_80&X
PelcoP_10&X:		
		MOV	A, B
		CJNE	A, #0A0H, PelcoP_19&X
PelcoP_18&X:
		LJMP	PelcoP_8&X
PelcoP_19&X:
		LJMP	PelcoP_94&X
PelcoP_20&X:
		MOV	A, B
		MOV	Check&X, A
		XRL	A, Address
		JNZ	PelcoP_26&X

		ORL	State&X, #40H
		MOV	Command&X, #cFree
PelcoP_26&X:
		LJMP	PelcoP_8&X
PelcoP_30&X:
		MOV	A, B
		XRL	Check&X, A

		MOV	ProCmd1&X, A
;		JB	ACC.7, PelcoP_31
;		JB	ACC.6, PelcoP_31				
;		JB	ACC.4, PelcoP_31				

		JNB	ACC.3, PelcoP_32&X
		MOV	Command&X, #cIrisClose
		SJMP	PelcoP_39&X
PelcoP_31&X:
		LJMP	PelcoP_94&X
PelcoP_32&X:
		JNB	ACC.2, PelcoP_34&X
		MOV	Command&X, #cIrisOpen
		SJMP	PelcoP_39&X
PelcoP_34&X:
		JNB	ACC.1, PelcoP_36&X
		MOV	Command&X, #cFocusNear
		SJMP	PelcoP_39&X
PelcoP_36&X:
		JNB	ACC.0, PelcoP_39&X
		MOV	Command&X, #cFocusFar
PelcoP_39&X:
		LJMP	PelcoP_8&X
PelcoP_40&X:
		MOV	A, B
		XRL	Check&X, A

		MOV	ProCmd2&X, A
		JB	ACC.0, PelcoP_46&X

		JNB	ACC.6, PelcoP_41&X
		MOV	Command&X, #cZoomWide
		SJMP	PelcoP_49&X
PelcoP_41&X:
		JNB	ACC.5, PelcoP_42&X
		MOV	Command&X, #cZoomTele
		SJMP	PelcoP_49&X
PelcoP_42&X:
		JNB	ACC.4, PelcoP_43&X
		MOV	Command&X, #cDown
		JNB	ACC.2, PelcoP_425&X
		MOV	Command&X, #cDownLeft
		SJMP	PelcoP_49&X
PelcoP_425&X:
		JNB	ACC.1, PelcoP_49&X
		MOV	Command&X, #cDownRight
		SJMP	PelcoP_49&X
PelcoP_43&X:
		JNB	ACC.3, PelcoP_44&X
		MOV	Command&X, #cUp

		JNB	ACC.2, PelcoP_435&X
		MOV	Command&X, #cUpLeft
		SJMP	PelcoP_49&X
PelcoP_435&X:
		JNB	ACC.1, PelcoP_49&X
		MOV	Command&X, #cUpRight
		SJMP	PelcoP_49&X
PelcoP_44&X:
		JNB	ACC.2, PelcoP_45&X
		MOV	Command&X, #cLeft
		SJMP	PelcoP_49&X
PelcoP_45&X:
		JNB	ACC.1, PelcoP_46&X
		MOV	Command&X, #cRight
		SJMP	PelcoP_49&X
PelcoP_46&X:
		CJNE	A, #09H, PelcoP_47&X
		MOV	Command&X, #cAdd1On
		SJMP	PelcoP_49&X
PelcoP_47&X:
		CJNE	A, #0BH, PelcoP_49&X
		MOV	Command&X, #cAdd1Off
		SJMP	PelcoP_49&X
PelcoP_49&X:
		LJMP	PelcoP_8&X
PelcoP_50&X:
		MOV	A, B
		XRL	Check&X, A
		SJMP	PelcoP_8&X
PelcoP_60&X:
		MOV	A, B
		XRL	Check&X, A

		CJNE	A, #02H, PelcoP_69&X

		MOV	A, Command&X
		CJNE	A, #cAdd1On, PelcoP_65&X

		MOV	Command&X, #cAdd2On
		SJMP	PelcoP_69&X
PelcoP_65&X:
		CJNE	A, #cAdd1Off, PelcoP_69&X
		MOV	Command&X, #cAdd2Off
PelcoP_69&X:
		SJMP	PelcoP_8&X
PelcoP_70&X:
		MOV	A, B
		XRL	Check&X, A
		SJMP	PelcoP_8&X
PelcoP_80&X:
		MOV	A, B
		XRL	A, Check&X

⌨️ 快捷键说明

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