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