📄 eg1920.asm
字号:
LedDrv_44&X:
CPL pLed&X
LedDrv_49&X:
SJMP LedDrv_9&X
LedDrv_50&X: ; LedBreak
MOV A, DelayLed&X
JZ LedDrv_51&X
CPL A
JNZ LedDrv_59&X
LedDrv_51&X:
JB pLed&X, LedDrv_52&X
MOV DelayLed&X, #cLedBreakOff
SJMP LedDrv_54&X
LedDrv_52&X:
MOV DelayLed&X, #cLedBreakOn
LedDrv_54&X:
CPL pLed&X
LedDrv_59&X:
SJMP LedDrv_9&X
LedDrv_60&X: ; LedShot
MOV A, DelayLed&X
JNZ LedDrv_62&X
MOV LedCmd&X, #cLedOff
SETB pLed&X
SJMP LedDrv_69&X
LedDrv_62&X:
CPL A
JNZ LedDrv_64&X
MOV DelayLed&X, #cLedShotOn
LedDrv_64&X:
CLR pLed&X
LedDrv_69&X:
SJMP LedDrv_9&X
LedDrv_70&X:
LedDrv_80&X:
LedDrv_9&X:
ENDM
;----------------------------------------------- 设置TenBit延时
SetTenBitDelay MACRO
LOCAL SetTenBitDelay_2,SetTenBitDelay_3,SetTenBitDelay_4,SetTenBitDelay_5,SetTenBitDelay_9
MOV A, BaudRate3
CJNE A, #c9600, SetTenBitDelay_2
MOV TenBitLen1, #cTenBit9600
SJMP SetTenBitDelay_9
SetTenBitDelay_2:
CJNE A, #c4800, SetTenBitDelay_3
MOV TenBitLen1, #cTenBit4800
SJMP SetTenBitDelay_9
SetTenBitDelay_3:
CJNE A, #c2400, SetTenBitDelay_4
MOV TenBitLen1, #cTenBit2400
SJMP SetTenBitDelay_9
SetTenBitDelay_4:
CJNE A, #c1200, SetTenBitDelay_5
MOV TenBitLen1, #cTenBit1200
SJMP SetTenBitDelay_9
SetTenBitDelay_5:
CJNE A, #c600, SetTenBitDelay_9
MOV TenBitLen1, #cTenBit600
SetTenBitDelay_9:
ENDM
;----------------------------------------------- 采样数据存入循环缓冲(10)
PushDat MACRO
ANL iR_D, #cBitBufMask ; 32字节缓冲
ORL iR_D, #0C0H
MOV A, BaudClock
MOV @iRegD, A
INC iRegD
MOV BaudClock, #cBaudClock
MOV A, Line
MOV @iRegD, A
INC iRegD
ENDM
;----------------------------------------------- 转发
ReSend MACRO
JNB bTxOK1, ReSend_9
MOV RegC, #sTemp3
MOV A, @RegC
JZ ReSend_9
MOV String1, #sTemp3
MOV String2, #sTemp1
LCALL StrCopy ; sTemp3 = sTemp1
MOV ReSendPtr, #01H
INC RegC
MOV A, @RegC
MOV SBUF, A
CLR bTxOK1
SETB p485OE
ReSend_9:
ENDM
;----------------------------------------------- 延时驱动
TimeDelay MACRO Timer
LOCAL TimeDelay_9
MOV A, Timer
JZ TimeDelay_9
CPL A
JZ TimeDelay_9
DEC Timer
TimeDelay_9:
ENDM
;----------------------------------------------- 延时
XrOptDelay MACRO
NOP
NOP
NOP
NOP
NOP
NOP
ENDM
;-----------------------------------------------
MemoryReport
;*********************************************** 中断矢量表
ORG 0000H
LJMP Init ; 主程序入口
ORG 0003H
LJMP Int0Proc ; INT0
ORG 000BH
LJMP T0Int ; T0
ORG 0013H
LJMP Int1Proc ; INT1
ORG 001BH
LJMP Init ; T1
ORG 0023H
LJMP Serial ; Serial 标准串行口输入
ORG 002BH
LJMP Init ; T2
;*********************************************** 初始化
ORG 0030H
Init:
MOV IE, #00H
MOV P1, #0FFH
MOV P3, #0FFH
MOV P2, #0FFH
;----------------------------------------------- X5045
CLR pXCK
SETB pXSI
SETB pXCE
MOV XrDelay, #cXrDelay
CLR pXWP
MOV IrState, #00H
;----------------------------------------------- 系统硬件
MOV TMOD, #00100010B ; T0, T1均为自动再装载方式
MOV TH0, #fTH0
MOV TH1, #fTH1 ;
MOV TL0, TH0
MOV TL1, TH1
CLR SM0
SETB SM1 ; 串口方式 1 (N, 8, 1)
SETB REN ; 允许串口接收
ORL PCON, #80H ; 置 SMOD, 波特率加倍
SETB IT0 ; 置 INT0 为下跳沿中断
SETB IT1 ; 置 INT1 为下跳沿中断
CLR RS0
CLR RS1 ; 选择 0 组寄存器
;----------------------------------------------- 全程变量
MOV SP, #Stack ; 堆栈指针
MOV Time400us, #00H ; 0.4ms 时钟驱动
MOV Time10ms, #cTime10ms
MOV Time100ms, #cTime100ms
MOV Time10s, #cTime10s
CLR bSetChange
CLR bSysFree
;----------------------------------------------- 硬串行口 (接收PC)
CLR p485OE
SETB bTxOK1
SETB bReSend
CLR b485In
;----------------------------------------------- 软串口
MOV Line, #03H
MOV BaudRate3, #c9600
SETB bSelect3
CLR bStartBit3
CLR bSelect4
CLR bStartBit4
CLR bStartBit5
CLR bStartBit6
MOV BaudClock, #cBaudClock
MOV iRegD, #sBitBuf
MOV BitBufEptr, #sBitBuf+30
CLR bTestBaud
CLR bCheckBaud
MOV BaudErr34, #00H
MOV BaudErr5, #00H
MOV BaudErr6, #00H
MOV PolarErr3, #00H
MOV PolarErr4, #00H
MOV PolarErr5, #00H
MOV PolarErr6, #00H
MOV ByteCount34, #00H
MOV ByteCount56, #00H
CLR bProErr1
CLR bProErr2
;----------------------------------------------- 8字节输入优先型FiFo
; MOV FinOpt1, #00H
; SETB bFinEmpty1
; CLR bFinOver1
;
; MOV FinOpt2, #00H
; SETB bFinEmpty2
; CLR bFinOver2
;----------------------------------------------- 协议解释
MOV CmdRun, #cFree+80H
MOV State1, #00H
MOV State2, #00H
MOV TenBitLen1, #cTenBit9600
MOV TenBitDelay1, #00H
MOV CmdStrLen1, #07H
MOV CmdLenCount1, #00H
MOV TenBitLen2, #cTenBit4800
MOV TenBitDelay2, #00H
MOV CmdStrLen2, #07H
MOV CmdLenCount2, #00H
MOV Protocol1, #cPelcoD
MOV Protocol2, #cPelcoD
CLR bLineLock
;----------------------------------------------- 协议自定义
CLR bDefine ; 正在学习协议
;----------------------------------------------- 解码器测试
CLR bButState
MOV ButDelay, #0FFH
MOV DelayAuto, #00H
MOV SwState, #00H
MOV TestDelay, #0FFH
;----------------------------------------------- 继电器驱动
MOV CmdState, #cFree
MOV Command1, #cFree
MOV Command2, #cFree
MOV VarDelaySw, #cDelaySw2
MOV VarDelayCam, #cDelayCam2
MOV DelaySwitch, VarDelaySw
MOV DelayCamera, VarDelayCam
CLR bNoStopCmd
;----------------------------------------------- LED
MOV DelayLed1, #00H
MOV DelayLed2, #00H
MOV LedCmd2, #cLedBlink
MOV LedCmd1, #cLedOff
;----------------------------------------------- 启动各中断
Init_9:
CLR A
MOV RegC, #80H
MOV RegH, #80H
Init_92:
MOV @RegC, A
INC RegC
DJNZ RegH, Init_92
MOV RegC, #sBitBuf ; BitBuf 填充
MOV RegF, #20H
Init_94:
MOV @RegC, #0FFH
INC RegC
DJNZ RegF, Init_94
MOV IP, #00H
SETB PT0 ; 置时钟中断为高优先级
SETB PX0 ; 置INT0中断为高优先级
SETB PX1 ; 置INT1中断为高优先级
SETB TR0 ; 启动T0
SETB TR1 ; 启动T1
SETB ES ; 打开串口中断
SETB ET0 ; 打开 T0 中断
SETB EX0 ; 打开 INT0 中断
SETB EX1 ; 打开 INT1 中断
SETB EA ; 开中断
LCALL LoadSet
MOV XrState, #00000000B ; 1.4s WDT
LCALL XrSet
SetTenBitDelay
MOV A, P1
CPL A
MOV Address, A
;*********************************************** 主循环
Main:
MOV A, Time400us
CJNE A, #cTime400us, $+3
JC Main_2
CLR C
CLR ET0
MOV A, Time400us
SUBB A, #cTime400us
MOV Time400us, A
SETB ET0
;----------------------------------------------- 0.4ms 驱动
TimeDelay XrDelay
TimeDelay TenBitDelay1
TimeDelay TenBitDelay2
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
DEC Time10ms
MOV A, Time10ms
JZ Main_3
Main_2:
LJMP Main_4
Main_3:
MOV Time10ms, #cTime10ms
;----------------------------------------------- 10ms 驱动
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
DEC Time100ms
MOV A, Time100ms
JNZ Main_2
MOV Time100ms, #cTime100ms
;----------------------------------------------- 100ms 驱动
CLR pXCE
SwOpt
SETB pXCE
TimeDelay DelaySwitch
TimeDelay DelayCamera
TimeDelay DelayLed1
TimeDelay DelayLed2
TimeDelay DelayAuto
TimeDelay ButDelay
Main_1:
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
DEC Time10s
MOV A, Time10s
JNZ Main_4
MOV Time10s, #cTime10s
;----------------------------------------------- 10s 驱动
TimeDelay TestDelay
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Main_4:
LCALL BitDriver
GetCmdStrLen 2
JNB bDefine, Main_B
LJMP Main_6
Main_B:
ProDect 1
ProtocolCtrl 1
ProDect 2
ProtocolCtrl 2
Main_6:
LCALL BitDriver
RelayDrv
LedDrv 1
LedDrv 2
JNB bLineLock, Main_C
LJMP Main_D
Main_C:
BaudDect
PolarDect
Main_D:
JNB bSetChange, Main_7
LCALL SaveSet
CLR bSetChange
Main_7:
LJMP Main
;*********************************************** INT0 中断(30)
Int0Proc:
SETB bLine46
CLR bLine35
PUSH PSW
PUSH ACC
PushDat
POP ACC
POP PSW
CLR IE0
RETI
;*********************************************** INT1 中断(30)
Int1Proc:
CLR bLine46
SETB bLine35
PUSH PSW
PUSH ACC
PushDat
POP ACC
POP PSW
CLR IE1
RETI
;*********************************************** T0 中断 (9600*6 Hz, 23/37)
T0Int:
PUSH PSW
PUSH ACC
INC Time400us
DJNZ BaudClock, T0Int_2
SJMP T0Int_4
T0Int_2:
MOV A, P3
XRL A, Line
ANL A, #0CH
JZ T0Int_6
; if 线路变化被T0中断捕获
JNB P3.3, T0Int_6
JNB P3.2, T0Int_6
; 且0->1
XRL Line, A
INC BaudClock ; 波形补偿,针对9600
T0Int_4:
PushDat
T0Int_6:
POP ACC
POP PSW
RETI
;*********************************************** 片内串行口中断
Serial:
PUSH PSW
PUSH R_C
PUSH B
PUSH ACC
JNB TI, Serial_5
CLR TI
GetStr 3, ReSendPtr, B, RegC
JNZ Serial_3
SETB bTxOK1
CLR p485OE
SJMP Serial_9
Serial_3:
MOV SBUF, B
INC ReSendPtr
SJMP Serial_9
Serial_5:
JNB RI, Serial_9
; if 接收中断
CLR RI
MOV A, SwState
XRL A, #cSwNormal
JZ Serial_4
MOV A, SwState
XRL A, #cSwDefine
JZ Serial_4
SJMP Serial_9
Serial_4:
;;; JNB bResend, Serial_7
;;;
;;; SETB b485In
;;; PutFin 1, SBUF, RegC
;;; INC CmdLenCount1
;;; ANL CmdLenCount1, #0FH
;;; SJMP Serial_9
;;;Serial_7:
; MOV LedCmd1, #cLedShot
; MOV A, #cTenBit4800
; MOV TenBitDelay1, A
MOV B, SBUF
INC CmdLenCount2
ANL CmdLenCount2, #0FH
JNB bDefine, Serial_8
; if 正在定义协议
PutStr 3, B, RegC ; 存入 sTemp3
SJMP Serial_6
Serial_8: ; else
PutStr 2, B, RegC ; 存入 sTemp2
Serial_6:
MOV LedCmd1, #cLedShot
MOV A, #cTenBit4800
MOV TenBitDelay2, A
Serial_9:
POP ACC
POP B
POP R_C
POP PSW
RETI
;*********************************************** 串比较
; 入口:
; String1, String2, 串指针
; 出口:
; A = 0, 成功
StrCmp:
PUSH R_C
MOV RegC, String1
MOV A, @RegC
ANL A, #0FH
INC A
MOV StrLen, A
StrCmp_1:
MOV RegC, String1
MOV A, @RegC
MOV RegC, String2
XRL A, @RegC
JNZ StrCmp_9
INC String1
INC String2
DJNZ StrLen, StrCmp_1
StrCmp_9:
POP R_C
RET
;*********************************************** 串复制
; 入口:
; String1, String2, 串指针
; 出口:
; String1 = String2
StrCopy:
PUSH R_C
MOV RegC, String2
MOV A, @RegC
ANL A, #0FH
INC A
MOV StrLen, A
StrCopy_1:
MOV RegC, String2
MOV A, @RegC
MOV RegC, String1
MOV @RegC, A
INC String1
INC String2
DJNZ StrLen, StrCopy_1
StrCopy_9:
POP R_C
RET
;*********************************************** 串查表
; 入口:
; RegG = 内存串指针
; EEPROM 起始地址 100H
; 每串占固定空间 16 字节, 串长度 <= 15, 串首字节的 b3b2b1b0 是长度
; 出口:
; A = 比较正确的串的序号, 首串为 0, 0FFH 比较失败
SearchTab:
PUSH R_C
PUSH R_E
PUSH R_F
PUSH R_H
MOV RegF, #00H ; F = EEPROM 指针
SearchTab_2:
MOV RegC, R_G ; C = 内存串指针
MOV R_H, @RegC
INC RegH
ANL R_H, #0FH ; H = 串长度
MOV A, RegF
SWAP A ; A = EEPROM 指针
SETB bSame ; 置比较有效
; SETB bXHi8 ; 使用后半区
LCALL XrRead
JB bOK, SearchTab_7
JB bSame, SearchTab_8
; if 比较失败
CJNE A, #0FFH, SearchTab_4
MOV A, RegC
CJNE A, R_G, SearchTab_4
; if 遇到结束符
SJMP SearchTab_7
SearchTab_4:
INC RegF
MOV R_H, #01H
MOV A, RegF
ANL A, #0F0H
JNZ SearchTab_7
SWAP A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -