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

📄 kzwj230.asm

📁 完成485总线数据的收发。 按键扫描等
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	CLR	LED1.1		;2
	LJMP	LOOP_TMP

;LED1.4
KEY_11:					;导航
	MOV	A,LED1
	XRL	A,#00010000B
	MOV	LED1,A
	MOV	A,RT_ADD
	CJNE	A,#04H,$+5
	CLR	LED1.4
	LJMP	LOOP_TMP

;LED2.1
KEY_10:					;罗1
	MOV	A,LED2
	XRL	A,#00000010B
	MOV	LED2,A
	MOV	A,RT_ADD
	CJNE	A,#04H,$+5	;3
	CLR	LED2.1		;2
	LJMP	LOOP_TMP

;LED2.4
KEY_9:					;罗2
	MOV	A,LED2
	XRL	A,#00010000B
	MOV	LED2,A
	MOV	A,RT_ADD
	CJNE	A,#04H,$+5	;3
	CLR	LED2.4		;2
	LJMP	LOOP_TMP

;LED1.2
KEY_8:					;谈/检(免提功能和长时间按下后的自检功能)
;	LJMP	CONFIG

	MOV	A,LED1
	XRL	A,#00000100B
	MOV	LED1,A	;免提高有效
	MOV	BIT_COUNT,#00H
	LJMP	LOOP_TMP

;LED1.5
KEY_7:					;静噪
	MOV	A,LED1
	XRL	A,#00100000B
	MOV	LED1,A
	JNB	ACC.5,KEY7_1
	CLR	CTR_SVOX		;收静噪低有效
	LJMP	LOOP_TMP
KEY7_1:
	SETB	CTR_SVOX
	LJMP	LOOP_TMP

;LED2.2
KEY_6:					;面罩
	MOV	A,LED2
	XRL	A,#00000100B
	MOV	LED2,A
	JB	ACC.2,$+8	;3
	CLR	CTR_MZ	;2
	LJMP	LOOP_TMP	;3
	SETB	CTR_MZ
	LJMP	LOOP_TMP

;LED2.5
KEY_5:					;呼叫
;	MOV	A,LED2
;	XRL	A,#00100000B
;	MOV	LED2,A
;	JNB	ACC.5,$+8	;3
;	SETB	CCALL_PTT	;2
;	LJMP	LOOP_TMP	;3
;	CLR	CCALL_PTT
LOOP_TMP:
	SETB	NEED_SAVE
	LJMP	KEY_SCAN_END
	
;****************************************************************************
;0B0H~0BFH放置各通道的音量字,声音解码与否在此单元内进行处理
;****************************************************************************
ALL_DEAL:				;按键扫描结束,开始内部的逻辑功能处理
	JB	by_call,In_by_call
;乘员1开始	
	MOV	A,#01h
	CJNE	A,RT_ADD,ISNOT_MY1	;比较是不是本身
	LJMP	COMMAND_1
In_by_call:
	LJMP	over_call		;by   超控    在进入之前置超控字为超控者地址
ISNOT_MY1:
	MOV	DPTR,#0030H
	MOVX	A,@DPTR
	JZ	not_decode_1
	JNB	ACC.7,Isnot_in_1	;是内通
;	JB	ACC.2,SET_1_RES		;是否RES网
	JB	ACC.1,SET_1_NTALK	;是否通话
	JB	ACC.0,SET_1_CALL	;是否呼叫(超控)
Isnot_in_1:
	JB	ACC.4,IS_WAITONG1
	LJMP	not_decode_1
;******************返回的状态字含义******************************************************
;0000 0000--空操作(没有任何操作)							*
;1000 0XXX--内通(XXX表示内通网0001--CALL网,0010--RES网不发以及免提内通,0100--RES网发)		*
;0001 XXXX--外通(XXXX表示电台号0001--超短波1,0010--超短波2,0100--短波1,1000--短波2)	*
;****************************************************************************************
SET_1_RES:
	LJMP	DECODE_1
Set_1_NTALK:
	LJMP	decode_1
Set_1_CALL:
	setb	by_call
	MOV	cal_word,#01h
	LJMP	OVER_1
decode_1:
	MOV	A,#01H
	MOV	R0,#0B0H		;置音量字,解码
	MOV	@R0,A
	ljmp	over_1
IS_WAITONG1:
	LABLE_ING
not_decode_1:
	MOV	A,#00H
	MOV	R0,#0B0H		;置音量字为0,不解码
	MOV	@R0,A
	LJMP	OVER_1
COMMAND_1:
	MOV	A,#00H
	MOV	R0,#0B0H		;置音量字为0,不解码
	MOV	@R0,A
	MOV	DPTR,#0030H
	JNB	WPPTT,NO_WPPTT
	JNB	LED1.0,$+19		;超1判断
	JNB	DT1_ING,$+10		;3	
	CLR	DT1_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010001B		;超1置命令字11H
	MOVX	@DPTR,A	
	LJMP	OVER_1_1
	JNB	LED1.3,$+19		;超2判断
	JNB	DT2_ING,$+10		;3	
	CLR	DT2_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010010B		;超2置命令字12H
	MOVX	@DPTR,A	
	LJMP	OVER_1_1
	JNB	LED2.0,$+19		;短波1判断
	JNB	DT3_ING,$+10		;3	
	CLR	DT3_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010100B		;短波1置命令字14H
	MOVX	@DPTR,A	
	LJMP	OVER_1_1
	JNB	LED2.3,$+19		;短波2判断
	JNB	DT4_ING,$+10		;3	
	CLR	DT4_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00011000B		;短波2置命令字18H
	MOVX	@DPTR,A	
	LJMP	OVER_1_1
	MOV	A,#00H			;有外通PTT但没电台选中时,屏蔽内通发话
	MOVX	@DPTR,A
OVER_1_1:
	ANL	A,#00001111B
	MOV	CY12_DT,A		;把乘员1正在发的电台号存起来
	LJMP	OVER_1
NO_WPPTT:
	MOV	A,CY12_DT		; 1没发电台
	ANL	A,#11110000B
	MOV	CY12_DT,A
	JNB	CCALL_PTT,NO_CCALL1	;超控判断
	MOV	A,#10000001B		;超控置命令字81H
	MOVX	@DPTR,A	
	LJMP	OVER_1
NO_CCALL1:
	JNB	LED1.2,NO_NT1	;免提判断
	MOV	A,#10000010B
	MOVX	@DPTR,A
	LJMP	OVER_1
NO_NT1:
;	JNB	LED1.1,NO_RES		;任务判断
;	MOV	A,#10000100B		;任务发置命令字84H
;	MOVX	@DPTR,A	
;	LJMP	OVER_1
;NO_RES:
	JNB	NPPTT,OVER_11
	MOV	A,#10000010B
	MOVX	@DPTR,A
	LJMP	OVER_1
OVER_11: 
	CLR	A
	MOVX	@DPTR,A
over_1:
;乘员2开始
	MOV	A,#02H
	CJNE	A,RT_ADD,ISNOT_MY2	;比较是不是本身
	LJMP	COMMAND_2
ISNOT_MY2:
	MOV	DPTR,#0060H
	MOVX	A,@DPTR
	JZ	not_decode_2
	JNB	ACC.7,Isnot_in_2	;是内通
	JB	ACC.1,SET_2_NTALK	;是否通话
	JB	ACC.0,SET_2_CALL	;是否呼叫(超控)
Isnot_in_2:
	JB	ACC.4,IS_WAITONG2
	LJMP	not_decode_2
;******************返回的状态字含义******************************************************
;0000 0000--空操作(没有任何操作)							*
;1000 0XXX--内通(XXX表示内通网0001--CALL网,0010--RES网不发,0100--RES网发)		*
;0001 XXXX--外通(XXXX表示电台号0001--超短波1,0010--超短波2,0100--短波1,1000--短波2)	*
;****************************************************************************************
Set_2_NTALK:
	LJMP	decode_2
Set_2_CALL:
	setb	by_call
	MOV	cal_word,#02h
	LJMP	OVER_2
decode_2:
	MOV	A,#01H
	MOV	R0,#0B1H		;置音量字,解码
	MOV	@R0,A
	ljmp	over_2
IS_WAITONG2:
	LABLE_ING
not_decode_2:
	MOV	A,#00H
	MOV	R0,#0B1H		;置音量字为0,不解码
	MOV	@R0,A
	LJMP	OVER_2
COMMAND_2:
	MOV	A,#00H
	MOV	R0,#0B1H		;置音量字为0,不解码
	MOV	@R0,A
	MOV	DPTR,#0060H
	JNB	WPPTT,NO_WPPTT2
	JNB	LED1.0,$+19
	JNB	DT1_ING,$+10		;3	
	CLR	DT1_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010001B
	MOVX	@DPTR,A	
	LJMP	OVER_2_1
	JNB	LED1.3,$+19
	JNB	DT2_ING,$+10		;3	
	CLR	DT2_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010010B
	MOVX	@DPTR,A	
	LJMP	OVER_2_1
	JNB	LED2.0,$+19
	JNB	DT3_ING,$+10		;3	
	CLR	DT3_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010100B
	MOVX	@DPTR,A	
	LJMP	OVER_2_1
	JNB	LED2.3,$+19
	JNB	DT4_ING,$+10		;3	
	CLR	DT4_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00011000B
	MOVX	@DPTR,A	
	LJMP	OVER_2_1
	MOV	A,#00H			;有外通PTT但没电台选中时,屏蔽内通发话
	MOVX	@DPTR,A
OVER_2_1:
	SWAP	A
	ANL	A,#11110000B
	ORL	CY12_DT,A		;把乘员2正在发的电台号存起来
	LJMP	OVER_2
NO_WPPTT2:
	MOV	A,CY12_DT		;乘员2没发电台
	ANL	A,#00001111B
	MOV	CY12_DT,A
	JNB	CCALL_PTT,NO_CCALL2
	MOV	A,#10000001B
	MOVX	@DPTR,A	
	LJMP	OVER_2
NO_CCALL2:
	JNB	LED1.2,NO_NT2	;免提判断
	MOV	A,#10000010B
	MOVX	@DPTR,A
	LJMP	OVER_2
NO_NT2:
	JNB	NPPTT,OVER_21
	MOV	A,#10000010B
	MOVX	@DPTR,A
	LJMP	OVER_2
OVER_21: 
	CLR	A
	MOVX	@DPTR,A
over_2:
;乘员3开始
	MOV	A,#03h
	CJNE	A,RT_ADD,ISNOT_MY3	;比较是不是本身
	LJMP	COMMAND_3
ISNOT_MY3:
	MOV	DPTR,#0090h
	MOVX	A,@DPTR
	JZ	not_decode_3
	JNB	ACC.7,Isnot_in_3	;是内通
	JB	ACC.1,SET_3_NTALK	;是否通话
	JB	ACC.0,SET_3_CALL	;是否呼叫(超控)
Isnot_in_3:
	JB	ACC.4,IS_WAITONG3
	LJMP	not_decode_3
;******************返回的状态字含义******************************************************
;0000 0000--空操作(没有任何操作)							*
;1000 0XXX--内通(XXX表示内通网0001--CALL网,0010--RES网不发,0100--RES网发)		*
;0001 XXXX--外通(XXXX表示电台号0001--超短波1,0010--超短波2,0100--短波1,1000--短波2)	*
;****************************************************************************************
Set_3_NTALK:
	LJMP	decode_3
Set_3_CALL:
	setb	by_call
	MOV	cal_word,#03h
	LJMP	OVER_3
decode_3:
	MOV	A,#01H
	MOV	R0,#0B2H		;置音量字,解码
	MOV	@R0,A
	ljmp	over_3
IS_WAITONG3:
	LABLE_ING
not_decode_3:
	MOV	A,#00H
	MOV	R0,#0B2H		;置音量字为0,不解码
	MOV	@R0,A
	LJMP	OVER_3
COMMAND_3:
	MOV	A,#00H
	MOV	R0,#0B2H		;置音量字为0,不解码
	MOV	@R0,A
	MOV	DPTR,#0090H
	JNB	WPPTT,NO_WPPTT3
	JNB	LED1.0,$+19
	JNB	DT1_ING,$+10		;3	
	CLR	DT1_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010001B
	MOVX	@DPTR,A	
	LJMP	OVER_3_1
	JNB	LED1.3,$+19		;3
	JNB	DT2_ING,$+10		;3	
	CLR	DT2_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010010B		;2
	MOVX	@DPTR,A			;1
	LJMP	OVER_3_1		;3
	JNB	LED2.0,$+19
	JNB	DT3_ING,$+10		;3	
	CLR	DT3_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010100B
	MOVX	@DPTR,A	
	LJMP	OVER_3_1
	JNB	LED2.3,$+19
	JNB	DT4_ING,$+10		;3	
	CLR	DT4_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00011000B
	MOVX	@DPTR,A	
	LJMP	OVER_3_1
	MOV	A,#00H			;有外通PTT但没电台选中时,屏蔽内通发话
	MOVX	@DPTR,A
OVER_3_1:
	ANL	A,#00001111B
	MOV	CY34_DT,A		;把乘员3正在发的电台号存起来
	LJMP	OVER_3
NO_WPPTT3:
	MOV	A,CY34_DT		;乘员3没发电台
	ANL	A,#11110000B
	MOV	CY34_DT,A
	JNB	CCALL_PTT,NO_CCALL3
	MOV	A,#10000001B
	MOVX	@DPTR,A	
	LJMP	OVER_3
NO_CCALL3:
	JNB	LED1.2,NO_NT3	;免提判断
	MOV	A,#10000010B
	MOVX	@DPTR,A
	LJMP	OVER_3
NO_NT3:
	JNB	NPPTT,OVER_31
	MOV	A,#10000010B
	MOVX	@DPTR,A
	LJMP	OVER_3
OVER_31: 
	CLR	A
	MOVX	@DPTR,A
over_3:
;乘员4开始				;乘员4不发电台
	MOV	A,#04h			;
	CJNE	A,RT_ADD,ISNOT_MY4	;比较是不是本身
	LJMP	COMMAND_4
ISNOT_MY4:
	MOV	DPTR,#00C0h
	MOVX	A,@DPTR
	JZ	not_decode_4
	JNB	ACC.7,Isnot_in_4	;是内通
	JB	ACC.1,SET_4_NTALK	;是否通话
	JB	ACC.0,SET_4_CALL	;是否呼叫(超控)
Isnot_in_4:
	JB	ACC.4,IS_WAITONG4
	LJMP	not_decode_4
;******************返回的状态字含义******************************************************
;0000 0000--空操作(没有任何操作)							*
;1000 0XXX--内通(XXX表示内通网0001--CALL网,0010--RES网不发,0100--RES网发)		*
;0001 XXXX--外通(XXXX表示电台号0001--超短波1,0010--超短波2,0100--短波1,1000--短波2)	*
;****************************************************************************************
Set_4_NTALK:
	LJMP	decode_4
Set_4_CALL:
	setb	by_call
	MOV	cal_word,#04h
	LJMP	OVER_4
decode_4:
	MOV	A,#01H
	MOV	R0,#0B3H		;置音量字,解码
	MOV	@R0,A
	ljmp	over_4
IS_WAITONG4:
	LABLE_ING
not_decode_4:
	MOV	A,#00H
	MOV	R0,#0B3H		;置音量字为0,不解码
	MOV	@R0,A
	LJMP	OVER_4
COMMAND_4:
	MOV	A,#00H
	MOV	R0,#0B3H		;置音量字为0,不解码
	MOV	@R0,A
	MOV	DPTR,#00C0H
	JNB	WPPTT,NO_WPPTT4
	JNB	LED1.0,$+19
	JNB	DT1_ING,$+10		;3	
	CLR	DT1_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010001B		
	MOVX	@DPTR,A		
	LJMP	OVER_4_1
	JNB	LED1.3,$+19
	JNB	DT2_ING,$+10		;3	
	CLR	DT2_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010010B
	MOVX	@DPTR,A	
	LJMP	OVER_4_1
	JNB	LED2.0,$+19
	JNB	DT3_ING,$+10		;3	
	CLR	DT3_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00010100B
	MOVX	@DPTR,A	
	LJMP	OVER_4_1
	JNB	LED2.3,$+19
	JNB	DT4_ING,$+10		;3	
	CLR	DT4_ING			;2
	MOV	A,#00000000B		;2
	LJMP	$+5			;3
	MOV	A,#00011000B
	MOVX	@DPTR,A	
	LJMP	OVER_4_1
	MOV	A,#00H			;有外通PTT但没电台选中时,屏蔽内通发话
	MOVX	@DPTR,A
OVER_4_1:
	SWAP	A
	ANL	A,#11110000B
	ORL	CY34_DT,A		;把乘员4正在发的电台号存起来
	LJMP	OVER_4
NO_WPPTT4:
	MOV	A,CY34_DT		;乘员4没发电台
	ANL	A,#00001111B
	MOV	CY34_DT,A
	JNB	CCALL_PTT,NO_CCALL4
	MOV	A,#10000001B
	MOVX	@DPTR,A	
	LJMP	OVER_4
NO_CCALL4:
	JNB	LED1.2,NO_NT4	;免提判断
	MOV	A,#10000010B
	MOVX	@DPTR,A
	LJMP	OVER_4
NO_NT4:
	JNB	NPPTT,OVER_41
	MOV	A,#10000010B
	MOVX	@DPTR,A
	LJMP	OVER_4
OVER_41: 
	CLR	A
	MOVX	@DPTR,A
over_4:
	LJMP	shuo_diantai_chuli

over_call:				;如果已经被超控
	MOV	A,#00H
	MOV	R0,#0B0H
	MOV	@R0,A
	INC	R0
	MOV	@R0,A
	INC	R0
	MOV	@R0,A
	INC	R0
	MOV	@R0,A
	MOV	A,cal_word
	LCALL	LOCK_DPTR
	MOVX	A,@DPTR
	CJNE	A,#10000001B,CAL_FINISH
	MOV	A,#0AFH			;往B0H~B3H内写入乘员盒音量字
	ADD	A,CAL_WORD
	MOV	R0,A
	MOV	A,#81H			;暂给一个音量值,要求解码
	MOV	@R0,A
	LJMP	shuo_diantai_chuli

CAL_FINISH:
	CLR	by_call
	MOV	A,#0AFH
	ADD	A,CAL_WORD
	MOV	R0,A
	MOV	A,VOL_NT		;超控结束,返回原先音量的值
	MOV	@R0,A

	MOV	cal_word,#00h
	MOV	A,#00H			;没有内通ptt按下,置命令字
	MOV	DPTR,#0030h
	MOVX	@DPTR,A			;xram操作
	MOV	DPTR,#0060h
	MOVX	@DPTR,A			;xram操作
	MOV	DPTR,#0090h
	MOVX	@DPTR,A			;xram操作
	MOV	DPTR,#00C0h
	MOVX	@DPTR,A			;xram操作
shuo_diantai_chuli:


;写声码器(把从总线上收到的数据写到声码器中去)
;01--乘员1
;	MOV 	PRT3CF, #0ffh		;Output configuration for P3 
	MOV	A,#01h
	CJNE	A,RT_ADD,ISNOT_MY_1	;比较是不是本身
	MOV	A,#00H
	LJMP	READ_XRAM_1
ISNOT_MY_1:
	MOV	R0,#0B0H
	MOV	A,@R0
	JNZ	ISNOT_MY_1_1		;判断是否解码
	AJMP	READ_XRAM_1
ISNOT_MY_1_1:
	CJNE	A,#81H,$+6		;判断是否被该乘员呼叫
	LJMP	$+8
	MOV	A,VOL_NT
	LJMP	$+5
	MOV	A,#0BH
READ_XRAM_1:				;从总线地址内取出43话音字,放在80H~AAH内
	MOV	R0,#cont_vram		;解码置音量字——0ABH
	MOV	@R0,A
	CLR	A
	MOV	R7,#cont_smq		;42 TONE_BYTE(INCLUD 2 CHECK_BYTE)
	MOV	R0,#80H
	MOV	DPTR,#0031H
READ_XRAM_1_1:
	MOVX	A,@DPTR
	MOV	@R0,A
	INC	R0
	INC	DPTR
	DJNZ	R7,READ_XRAM_1_1
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
WRITE_DRAM_1:				;把80H~ABH内的话音字及音量字写入声码器
	CLR	A
	MOV	R7,#cont_smq+1
	MOV	R0,#80H
	MOV	DPTR,#0080H
WRITE_DRAM_1_1:
	MOV	A,@R0
	MOV	B,A
	LCALL	WRITE_XRAM
	NOP
	INC	R0
	INC	DPTR
	INC	DPTR
	DJNZ	R7,WRITE_DRAM_1_1
THIS_TIME_END_1:
	MOV	Temp,#02h		;延时1uS 3
	DJNZ	Temp,$
;02--乘员2
	MOV	A,#02h			
	CJNE	A,RT_ADD,ISNOT_MY_2	;比较是不是本身
	MOV	A,#00H
	LJMP	READ_XRAM_2
ISNOT_MY_2:
	MOV	R0,#0B1H
	MOV	A,@R0
	JNZ	ISNOT_MY_2_1
	AJMP	READ_XRAM_2
ISNOT_MY_2_1:
	CJNE	A,#81H,$+6		;判断是否被该乘员呼叫
	LJMP	$+8
	MOV	A,VOL_NT
	LJMP	$+5
	MOV	A,#0BH
READ_XRAM_2:				;从总线地址内取出43话音字,放在80H~AAH内
	MOV	R0,#cont_vram		;解码置音量字
	MOV	@R0,A	
	CLR	A
	MOV	R7,#cont_smq		;43 TONE_BYTE
	MOV	R0,#80H
	MOV	DPTR,#0061H
READ_XRAM_2_1:
	MOVX	A,@DPTR
	MOV	@R0,A
	NOP
	INC	R0
	INC	DPTR
	DJNZ	R7,READ_XRAM_2_1
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
WRITE_DRAM_2:				;把80H~ABH内的话音字及音量字写入声码器
	CLR	A
	MOV	R7,#cont_smq+1
	MOV	R0,#80H
	MOV	DPTR,#0100H
WRITE_DRAM_2_1:
	MOV	A,@R0
	MOV	B,A
	LCALL	WRITE_XRAM
	INC	R0
	INC	DPTR
	INC	DPTR
	DJNZ	R7,WRITE_DRAM_2_1
THIS_TIME_END_2:
	MOV	Temp,#02h		;延时1uS 3
	DJNZ	Temp,$

;03--乘员3

⌨️ 快捷键说明

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