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

📄 eg1920.asm

📁 这是几年前我写的
💻 ASM
📖 第 1 页 / 共 5 页
字号:
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 + -