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