📄 eg1920.asm
字号:
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 + -