📄 kzwj230.asm
字号:
;---------------------------------------------------------------
; CYGNAL Integrated Products
;
; Assembly Code Configuration Tool: F022 INITIALIZATION/CONFIGURATION CODE
;----------------------------------------------------------------
; This file is read only. To insert the code into your
; application, simply cut and paste or use the "Save As"
; command in the file menu to save the file in your project
; directory.
;----------------------------------------------------------------
$INCLUDE(C8051F200.INC) ; Register definition file.
$INCLUDE(控制器子程序集.asm)
cont_rs EQU 45 ;44 ;总线收发字数
cont_smq EQU 43 ;42 ;声码器送数字数
cont_vram EQU 0ABH ;0AAH ;音量字存放ram单元
;cont_null EQU 01h 2004-12-13 14:13
SDA EQU P0.6
SCL EQU P0.7
MUT EQU P0.4
A12 EQU P1.4
A13 EQU P1.5
DE1T EQU P0.5
FS100 EQU P1.7
WJB_OK EQU P1.6
DSEG
ORG 26H
LED1: DS 1
LED2: DS 1
LED3: DS 1
WR1: DS 1
KEY: DS 1
CY12_DT: DS 1
CY34_DT: DS 1
ORG 30H
TEMP: DS 1
RT_ID: DS 1
RT_ADD: DS 1
COMMAND: DS 1
CHECK: DS 1
COUNT: DS 1
CAL_WORD: DS 1
VOL_C1: DS 1
VOL_C2: DS 1
VOL_HF1: DS 1
VOL_HF2: DS 1
VOL_DH: DS 1
VOL_NT: DS 1
RES_COUNT1: DS 1
RES_COUNT2: DS 1
RES_COUNT3: DS 1
BIT_COUNT: DS 1
BSEG
ORG 00H ;20
ENABLE: DBIT 1
IS_RT: DBIT 1
KEY_LOOSE: DBIT 1
XIAODOU1: DBIT 1
XIAODOU2: DBIT 1
XIAODOU3: DBIT 1
ERR_ADD: DBIT 1
BY_CALL: DBIT 1
;21
NPTT: DBIT 1
WPTT: DBIT 1
NWPTT: DBIT 1
NPPTT: DBIT 1
WWPTT: DBIT 1
WPPTT: DBIT 1
CCALL: DBIT 1
CCALL_1: DBIT 1
;22
CCALL_PTT: DBIT 1
MN_BIT1: DBIT 1 ;MN BOARD CHECK MARK
MN_BIT2: DBIT 1 ;暂不用
POWER_ON: DBIT 1
ERR_BUS: DBIT 1
DT1_ING: DBIT 1
DT2_ING: DBIT 1
DT3_ING: DBIT 1
;23
DT4_ING: DBIT 1
NEED_SAVE: DBIT 1
KEY_RES_ON: DBIT 1
KEY_RES_OFF: DBIT 1
ERR_BUS_MARK: DBIT 1
ERR_MN_MARK: DBIT 1
ERR_WJ_MARK: DBIT 1
ORG 48h ;WR1对应的位地址
CTR_SVOX: DBIT 1
CTR_UP: DBIT 1
CTR_MZ: DBIT 1
CTR_VOX: DBIT 1
;CTR_ZY: DBIT 1
;----------------------------------------------------------------
; INTERRUPT VECTOR CODE
;----------------------------------------------------------------
CSEG
ORG 0000H
LJMP CONFIG
ORG 000BH
LJMP INT_T0
ORG 0023H
LJMP INT_RT
ORG 0030H
CONFIG:
SETB POWER_ON
CONFIGX:
MOV WDTCN, #007h ; Watchdog Timer Control Register
MOV WDTCN, #0DEh ; Disable WDT
MOV WDTCN, #0ADh ;禁止看门狗
mov PRT0MX, #001h ; PRT0MX: Initial Reset Value将P0.0,P0.1设为tx,rx
mov PRT1MX, #000h ; PRT1MX: Initial Reset Value CP0不接端口引脚
mov PRT2MX, #048h ; PRT2MX: Initial Reset Value 禁止端口3弱上拉,禁止端口0弱上拉
mov PRT0CF, #0B5h ; Output configuration for P0 输出方式写0为漏极开路,写1为推挽方式
mov PRT1CF, #0FFh ; Output configuration for P1
mov PRT2CF, #0FFh ; Output configuration for P2
MOV PRT3CF, #00h ; Output configuration for P3
MOV P0MODE, #0FFh ; Input Configuration for P0写0对应数字输入被禁止
mov P1MODE, #0FFh ; Input Configuration for P1
mov P2MODE, #0FFh ; Input Configuration for P2
mov P3MODE, #0FFh ; Input Configuration for P3
MOV OSCXCN, #067h ; External Oscillator Control Register 晶体振荡器方式,>>11MHZ 111B
CLR A
DJNZ ACC, $ ;wait for
DJNZ ACC, $ ;at least 1ms
OX_WAIT:
MOV A,OSCXCN
JNB ACC.7, OX_WAIT ;poll XTLVLD
mov OSCICN, #08Ch ; Internal Oscillator Control Register选择外部振荡器R,内部振荡器允许,允许时钟丢失检测器,检测到时钟丢失将触发复位
mov REF0CN, #000h ; Reference Control Register选择外部VREF源
mov SPI0CN, #000h ; SPI Control Register禁止SPI,禁止主方式
mov SPI0CFG, #000h ; SPI Configuration Register
mov SPI0CKR, #000h ; SPI Clock Rate Register SPI被设为主方式时,这些位决定SCK输出的频率
mov CPT0CN, #000h ; Comparator 0 Control Register 禁止比较器
mov CPT1CN, #000h ; Comparator 1 Control Register
;----------------------------------------------------------------
; UART Configuration
;----------------------------------------------------------------
mov SCON, #0c0h ; Serial Port Control Register MODE3 9位UART,可变波特率
;ANL SCON, #0FCh ; clear interrupt pending flags
mov PCON, #080h ; Power Control Rgister SMOD=1允许波特率/2功能 ????允许波特率加倍
mov CKCON, #010h ; Clock Control Register T1M=1使用系统时钟 定时器1用系统时钟
MOV TMOD, #021h ; Timer Mode Register TIMER1为自动重装8位,TIMER0为16位
mov TCON, #000h ; Timer Control Register 禁止定时器0,1
mov RCAP2H, #000h ; Timer 2 Capture Register High Byte定时器2捕捉寄存器
mov RCAP2L, #000h ; Timer 2 Capture Register Low Byte
mov TH2, #000h ; Timer 2 High Byte
mov TL2, #000h ; Timer 2 Low Byte
mov T2CON, #000h ; Timer 2 Control Register
MOV RSTSRC, #000h ; Reset Source Register复位源寄存器
MOV IE, #00h ;Interrupt Enable
MOV IP, #10h ;Interrupt Priority串口为高优先级
MOV EIE1, #000h ;Extended Interrupt Enable 1 扩展中断
MOV EIE2, #000h ;Extended Interrupt Enable 2
MOV EIP1, #000h ;Extended Interrupt Priority 1
MOV EIP2, #000h ;Extended Interrupt Priority 2
MOV SP,#07H
DEFINE_PY
clrxram:
MOVX @DPTR,A
INC DPTR
MOV R1,DPH
CJNE R1,#03,CLRXRAM
MOV LED1,#00H ;暂定
LCALL WRITE_LED1 ;MOV A LED1
MOV LED2,#00H
LCALL WRITE_LED2
JNB POWER_ON,$+6
LCALL BIT_DP ;POWER_BIT
CLR POWER_ON
CLR A
LCALL READ_RD1 ;READ ADDRESS
ANL A,#0FH
XRL A,#0FH
MOV R0,A
JZ ERROR_ADD
CLR C
SUBB A,#05H ;带盒子<=4;
JNC ERROR_ADD
MOV RT_ADD,R0 ;SAVE ADDRESS
LJMP GOOD_ADD
ERROR_ADD:
MOV LED1,#0FFH ;ERROR ADDRESS ,ALL LIGHT ON!
LCALL WRITE_LED1
MOV LED2,#0FFH
LCALL WRITE_LED2
lcall DELAY100MS
; MOV LED1,#00H ;ERROR ADDRESS ,ALL LIGHT ON!
; LCALL WRITE_LED1
; MOV LED2,#00H
; LCALL WRITE_LED2
; lcall DELAY100MS
LJMP CONFIGX
GOOD_ADD:
LCALL READ_24C01 ;现场保护读
CLR LED2.5
CLR LED1.2
LCALL WRITE_LED1
MOV TH1,#0FFH ;波特率为24.576/16=1.536Mbps
MOV TL1,#0FFH
SETB TR1
MOV TL0,#00H ;31.985mS的定时中断,在串行中断里再置为最大值(暂时不要)
MOV TH0,#00H ;用意:当没有总线时,单个盒子仍然可以工作
CLR RI
CLR TI
SETB SM2
SETB REN
SETB ES
SETB EA
SETB TR0
SETB ET0
LOOP:
JNB NEED_SAVE,LOOP1
CLR NEED_SAVE
LCALL WRITE_24C01 ;现场保护写
LOOP1:
LJMP $
;********************************主程序***************************************
INT_T0: ;TIMER0中断服务程序(公式:(2e16-X)*12/24.576M=10mS,X换算为16进制即可),其中2e16=65536
MOV DPTR,#MAIN_WORK
CLR FS100
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB FS100
SETB ERR_BUS
POP ACC
POP ACC
PUSH DPL
PUSH DPH
RETI
INT_RT: ;串行中断服务程序
CLR RI
CLR TI
CLR ERR_BUS
MOV Command,SBUF
MOV DPTR,#MAIN_RT
MOV TL0,#00H
MOV TH0,#00H
POP ACC
POP ACC
PUSH DPL
PUSH DPH
RETI
;********************************************************************************
;* 命令格式: *
;* 系统10ms同步命令1:1`00 00`0000(1字,不需应答)——复帧开始 *
;* 系统10ms同步命令2:1`00 00`0001(1字,不需应答)——复帧结束 *
;* 单 个 发 数 命 令:1`01 xx`xxxx(1字,应答12字)——单帧开始 *
;********************************************************************************
MAIN_RT:
MOV A,Command
JNB ACC.6,RT1_1
LJMP RT1_2
RT1_1:
JZ RT1_COMM_0
CJNE A,#01H,LOOPEN ;非法命令,忽略
MOV TL0,#00H ;置定时器为最大值
MOV TH0,#00H
CLR
LJMP MAIN_WORK ;复帧通信结束
LOOPEN:
LJMP LOOP
RT1_COMM_0: ;复帧通信开始
SETB Enable ;开始置标志位
CLR FS100
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB FS100
LJMP LOOPEN
RT1_2:
JNB Enable,LOOPEN ;是否已经接收过复帧开始命令
JB ACC.7,LOOPEN ;筛选命令格式为1`01xx`xxxx
MOV A,#00111111B
ANL A,Command
MOV RT_ID,A
CJNE A,RT_ADD,RT1_3
MOV A,RT_ID
LCALL LOCK_DPTR ;定位内存
CLR ES
CLR DE1T
LCALL SEND_41B_0 ;是自己需要发数
SETB DE1T
SETB ES
LJMP LOOPEN
RT1_3:
MOV A,RT_ID
LCALL LOCK_DPTR ;定位内存
CLR ES
LCALL RECEIVE_42B
SETB ES ;接收别人的数
LJMP LOOPEN
;*****************************************************************************
MAIN_WORK:
CLR ES
CLR ET0
LCALL READ_DRAM_TXD
MOV A,RT_ADD
LCALL LOCK_DPTR
LCALL WRITE_XRAM_TXD
;***********************************************************************************
;NTPTT,WTPTT,CCALL消抖
;解释: NPTT--输入变量 NWPTT--中间变量(消抖位) NPPTT--最终变量(内通按键标志位)
; WPTT--输入变量 WWPTT--中间变量(消抖位) WPPTT--最终变量(外通按键标志位)
; CCALL--输入变量 CCALL_1--中间变量(消抖位) CCALL_PTT--最终变量(呼叫按键标志位)
;以上三个按键标志位均是高电平表示按下
;***********************************************************************************
LCALL READ_RD2 ;MN BOARD ERROR,DISPLAY THE LIGHT ONCE
;OUTPUT:NPTT,WPTT,CCALL and BIT1
JB NPTT,NP ;内通ptt没有按下
JB NWPTT,NP_1
SETB NWPTT
LJMP NJIESHU
NP_1:
SETB NPPTT
LJMP NJIESHU
NP:
JNB NWPTT,NP_2 ;oldptt是0
CLR NWPTT
LJMP NJIESHU
NP_2:
CLR NPPTT
NJIESHU:
JB WPTT,WP
JB WWPTT,WP_1
SETB WWPTT
LJMP WJIESHU
WP_1:
SETB WPPTT
LJMP WJIESHU
WP:
JNB WWPTT,WP_2
CLR WWPTT
LJMP WJIESHU
WP_2: CLR WPPTT
WJIESHU:
; JB CCALL,CP
; JB CCALL_1,CP_1
; SETB CCALL_1
; LJMP CJIESHU
;CP_1: SETB CCALL_PTT
; LJMP CJIESHU
;CP: JNB CCALL_1,CP_2
; CLR CCALL_1
; LJMP CJIESHU
;CP_2: CLR CCALL_PTT
CJIESHU:
JNB BY_CALL,KEY_SCAN ;被超控时,按健不再起作用
LJMP KEY_SCAN_END
KEY_SCAN:
;扫描法读按键
MOV LED3,#0FEH ;KEYL-1=0
LCALL WRITE_LED3
NOP
NOP
NOP
LCALL READ_KEYH ;读按键
JZ KEY_NOT_1 ;判断有无按键
JB XIAODOU1,IF_THEONE1 ;判断是否第二次按下,是:再判断是否是相同按键
SETB XIAODOU1
MOV KEY,A ;保存按键值
BACK_1:
LJMP KEY_SCAN_END
BACK_11:
CLR XIAODOU1
AJMP BACK_1
IF_THEONE1:
CJNE A,KEY,BACK_11 ;判断是否同一按键,不是,到没有按键
LJMP KEY_1_VALID
KEY_NOT_1:
MOV LED3,#0FDH ;KEYL-2=0
LCALL WRITE_LED3
NOP
NOP
NOP
LCALL READ_KEYH ;读按键
JZ KEY_NOT_2 ;判断有无按键
JB XIAODOU2,IF_THEONE2 ;判断是否第二次按下,是:再判断是否是相同按键
SETB XIAODOU2
MOV KEY,A ;保存按键值
BACK_2:
LJMP KEY_SCAN_END
BACK_22:
CLR XIAODOU2
AJMP BACK_2
IF_THEONE2:
CJNE A,KEY,BACK_22 ;判断是否同一按键,不是,到没有按键
LJMP KEY_2_VALID
KEY_NOT_2:
MOV LED3,#0FBH ;KEYL-3=0
LCALL WRITE_LED3
NOP
NOP
NOP
LCALL READ_KEYH ;读按键
JZ BACK_3
JNB ACC.0,NOT_BIT_KEY ;判断是不是自检按键按下
MOV R0,BIT_COUNT
INC R0
MOV BIT_COUNT,R0
NOT_BIT_KEY:
JNB ACC.3,$+5 ;3
SETB CCALL_PTT ;2
NOT_CALL_KEY:
JB XIAODOU3,IF_THEONE3
SETB XIAODOU3
MOV KEY,A
LJMP KEY_SCAN_END
BACK_3:
CLR KEY_LOOSE ;扫描完后,没有按键,设定标志
CLR CCALL_PTT ;呼叫标志位
LJMP KEY_SCAN_END
BACK_33:
CLR XIAODOU3
LJMP KEY_SCAN_END
IF_THEONE3:
CJNE A,KEY,BACK_33
LJMP KEY_3_VALID
KEY_SCAN_END: ;扫描按键出口
; CLR ERR_BUS ;20040908
JNB ERR_BUS,KEY_SCAN_END1 ;BUS CHECKING
SETB LED1.0
SETB LED1.3
SETB LED2.0
CLR ERR_BUS
SETB ERR_BUS_MARK
LJMP KEY_SCAN_END1_1
KEY_SCAN_END1:
JNB ERR_BUS_MARK,KEY_SCAN_END1_1
CLR LED1.0
CLR LED1.3
CLR LED2.0
CLR ERR_BUS_MARK
KEY_SCAN_END1_1:
JB MN_BIT1,KEY_SCAN_END2 ;MN BOARD CHECKING
SETB LED1.0
SETB LED2.0
SETB ERR_MN_MARK
LJMP KEY_SCAN_END2_1
KEY_SCAN_END2:
JNB ERR_MN_MARK,KEY_SCAN_END2_1
CLR LED1.0
CLR LED2.0
CLR ERR_BUS_MARK
KEY_SCAN_END2_1:
; JB WJB_OK,KEY_SCAN_END3 ;WJ BOARD CHECKING(not ture)
; SETB LED1.0
; SETB LED1.3
; SETB ERR_WJ_MARK
; LJMP KEY_SCAN_END3_1
;KEY_SCAN_END3:
; JNB ERR_WJ_MARK,KEY_SCAN_END3_1
; CLR LED1.0
; CLR LED1.3
; CLR ERR_WJ_MARK
;KEY_SCAN_END3_1:
KEY_SCAN_END4: ;判断自检按键是否长时间按下(2005-07-05)
MOV A,BIT_COUNT
CJNE A,#050H,KEY_SCAN_END5 ;0.8秒
MOV BIT_COUNT,#00H
LJMP CONFIG
KEY_SCAN_END5:
; MOV SP,#07H
;*************************************************************************************************P
;CTR_MZ:高有效 CTR_ZY:高有效 CTR_SVOX:低有效
;CTR_UP:高有效 CTR_VOX:高有效(在谈/检接死<按键亮:高,按键灭:低>,控制抗噪模块)
;*************************************************************************************************Y
;为解决环境噪音进入总线,影响其它乘员接收,增加抗噪模块,控制信号和“谈/检”按键有关。
JB CCALL_PTT,KEY_SCAN_END5_1 ;3
CLR CTR_UP ;2
MOV A,LED2 ;无CALL按键按下就熄灭灯
ANL A,#11011111B
MOV LED2,A
LJMP KEY_SCAN_END6 ;3
KEY_SCAN_END5_1:
SETB CTR_UP
MOV A,LED2 ;有CALL按键按下就点亮灯
ORL A,#00100000B
MOV LED2,A
KEY_SCAN_END6:
JNB LED1.2,$+8 ;3 抗噪攻关更改
SETB CTR_VOX ;2
LJMP $+5 ;3
CLR CTR_VOX ;2
LCALL WRITE_LED1
LCALL WRITE_LED2
LCALL WRITE_WR1
LCALL READ_VOL1
LCALL READ_VOL2
LCALL READ_VOL3
LJMP ALL_DEAL
;按键操作
KEY_1_VALID:
JB KEY_LOOSE,KEY_1_VALID1
SETB KEY_LOOSE
CLR XIAODOU1
CLR XIAODOU2
CLR XIAODOU3
JB KEY.0,KEY_16_1
JB KEY.1,KEY_15_1
JB KEY.2,KEY_14_1
JB KEY.3,KEY_13_1
KEY_1_VALID1:
LJMP KEY_SCAN_END
KEY_16_1: LJMP KEY_16
KEY_15_1: LJMP KEY_15
KEY_14_1: LJMP KEY_14
KEY_13_1: LJMP KEY_13
KEY_2_VALID:
JB KEY_LOOSE,KEY_2_VALID1
SETB KEY_LOOSE
CLR XIAODOU1
CLR XIAODOU2
CLR XIAODOU3
JB KEY.0,KEY_12_1
JB KEY.1,KEY_11_1
JB KEY.2,KEY_10_1
JB KEY.3,KEY_9_1
KEY_2_VALID1:
LJMP KEY_SCAN_END
KEY_12_1: LJMP KEY_12
KEY_11_1: LJMP KEY_11
KEY_10_1: LJMP KEY_10
KEY_9_1: LJMP KEY_9
KEY_3_VALID:
JB KEY_LOOSE,KEY_3_VALID1
SETB KEY_LOOSE
CLR XIAODOU1
CLR XIAODOU2
CLR XIAODOU3
JB KEY.0,KEY_8_1
JB KEY.1,KEY_7_1
JB KEY.2,KEY_6_1
JB KEY.3,KEY_5_1
KEY_3_VALID1:
LJMP KEY_SCAN_END
KEY_8_1: LJMP KEY_8
KEY_7_1: LJMP KEY_7
KEY_6_1: LJMP KEY_6
KEY_5_1: LJMP KEY_5
;LED1.0
KEY_16: ;超1
MOV A,LED1
XRL A,#00000001B
MOV LED1,A
JNB ACC.0,NOT_KEY_16
CLR LED1.3
CLR LED2.0
CLR LED2.3
MOV A,RT_ADD ;机械师不发超1,按键不亮
CJNE A,#04H,$+5 ;3
CLR LED1.0 ;2
NOT_KEY_16:
LJMP LOOP_TMP
;LED1.3
KEY_15: ;超2
MOV A,LED1
XRL A,#00001000B
MOV LED1,A
JNB ACC.3,NOT_KEY_15
CLR LED1.0
CLR LED2.0
CLR LED2.3
MOV A,RT_ADD ;机械师不发超2,按键不亮
CJNE A,#04H,$+5 ;3
CLR LED1.3 ;2
NOT_KEY_15:
LJMP LOOP_TMP
;LED2.0
KEY_14: ;短波1
MOV A,LED2
XRL A,#00000001B
MOV LED2,A
JNB ACC.0,NOT_KEY_14
CLR LED1.0
CLR LED1.3
CLR LED2.3
MOV A,RT_ADD
CJNE A,#04H,$+5 ;3 机械师不发短波1,按键不亮
CLR LED2.0 ;2
NOT_KEY_14:
LJMP LOOP_TMP
;LED2.3
KEY_13: ;短波2
MOV A,LED2
XRL A,#00001000B
MOV LED2,A
JNB ACC.3,NOT_KEY_13
CLR LED1.0
CLR LED1.3
CLR LED2.0
MOV A,RT_ADD
CJNE A,#04H,$+5 ;3 机械师不发短波2,按键不亮
CLR LED2.3 ;2
NOT_KEY_13:
LJMP LOOP_TMP
;LED1.1
KEY_12: ; 塔康
MOV A,LED1
XRL A,#00000010B
MOV LED1,A
MOV A,RT_ADD
CJNE A,#04H,$+5 ;3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -