📄 kzwj230.asm
字号:
NOP
NOP
NOP
NOP
MOV A,P3
ORL P1,#00110000B ;DEFAULT:A12=A13=1
MOV B,A
ANL A,#0FH
XRL A,#0FH
MOV VOL_DH,A
MOV A,B
ANL A,#0F0H
XRL A,#0F0H
SWAP A
MOV VOL_NT,A
RET
Write_WR1:
MOV A,WR1
MOV P3,A
NOP
NOP
MOV P2,#08H
ANL P1,#11001111B ;CLEAR A12,A13
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
ORL P1,#00110000B ;DEFAULT:A12=A13=1
MOV P2,#00H
NOP
NOP
NOP
NOP
NOP
NOP
RET
READ_RD1:
MOV P3,#0FFH
MOV P2,#04H
ANL P1,#11001111B ;CLEAR A12,A13
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV A,P3
ORL P1,#00110000B ;DEFAULT:A12=A13=1
RET
READ_RD2:
MOV P3,#0FFH
MOV P2,#06H
ANL P1,#11001111B ;CLEAR A12,A13
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV A,P3
ORL P1,#00110000B ;DEFAULT:A12=A13=1
; JB ACC.0,$+7
; CLR CCALL
; AJMP $+4
; SETB CCALL
JB ACC.1,$+7
CLR NPTT
AJMP $+4
SETB NPTT
JB ACC.2,$+7
CLR WPTT
AJMP $+4
SETB WPTT
JB ACC.3,$+7
CLR MN_BIT1
AJMP $+4
SETB MN_BIT1
; JB ACC.4,$+7
; CLR MN_BIT2
; AJMP $+4
; SETB MN_BIT2
RET
SEND_41B_0: ;发45Byte(第9位为0),发的内容在DPTR以后44个单元内(命令字+43话音字“声码器3个校验字”),第45个为异或校验
CLR REN
CLR TB8 ;第9位为0
MOV Count,#cont_rs-1 ;先送44个字(命令字和话音字)
MOV Check,#00H ;预置校验字
SEND_41B_0_1:
MOVX A,@DPTR
MOV SBUF,A
XRL Check,A ;异或校验 2
JNB TI,$ ;发完一个字节后TI置1
CLR TI
MOV Temp,#02H ;延时1uS 3
DJNZ Temp,$
INC DPTR
DJNZ Count,SEND_41B_0_1 ;循环检测 3
MOV Temp,#08H ;延时2uS 3
DJNZ Temp,$
MOV SBUF,Check ;发生成校验字送总线
nop
JNB TI,$ ;等待发完
CLR TI
nop
nop
SETB REN
RET
RECEIVE_42B: ;收45个数。命令字、话音字放在DPTR后的44个单元,
CLR RI ;校验结果放在DPTR后第45个单元,正确计数器放在DPTR后第46个单元
CLR SM2
MOV Temp,#42h ;接收第一个字定时20uS
JB RI,RECEIVE_42B_1 ;3
DJNZ Temp,$-3 ;3
LJMP RECEIVE_42B_ERROR ;到时出错
RECEIVE_42B_1:
CLR RI
MOV A,SBUF
MOVX @DPTR,A
INC DPTR ;外存地址加一
MOV Check,A
MOV Count,#cont_rs-1
RECEIVE_42B_2:
MOV Temp,#21h ;接收后续44个字定时10uS
JB RI,RECEIVE_42B_3
DJNZ Temp,$-3
LJMP RECEIVE_42B_ERROR ;到时出错
RECEIVE_42B_3:
CLR RI
MOV A,SBUF
MOVX @DPTR,A
INC DPTR ;外存地址加一
XRL Check,A
DJNZ Count,RECEIVE_42B_2
SETB SM2
MOV A,Check
MOVX @DPTR,A ;保存校验结果
CJNE A,#00h,RECEIVE_42B_ERROR ;校验and校验失败
INC DPTR
MOVX A,@DPTR
INC A ;成功计数器加一
JB ACC.4,RECEIVE_42B_4
MOVX @DPTR,A
RET
RECEIVE_42B_4:
MOV A,#00001111b
MOVX @DPTR,A
RET
RECEIVE_42B_ERROR:
CLR RI
SETB SM2
MOV A,#11110000b
ANL DPL,A
MOV A,#00h
MOVX @DPTR,A ;清除状态字
MOV A,#2DH
ADD A,DPL
MOV DPL,A
MOVX A,@DPTR ;取出成功计数字
DEC A ;成功计数器减一
JB ACC.7,RECEIVE_42B_5
MOVX @DPTR,A
RET
RECEIVE_42B_5:
MOV A,#00h
MOVX @DPTR,A ;边界检查
RET
BIT_DP:
CLR EA
MOV LED1,#0FFH
LCALL WRITE_LED1
MOV LED2,#0FFH
LCALL WRITE_LED2
LCALL DELAY1S
MOV LED1,#00H
LCALL WRITE_LED1
MOV LED2,#00H
LCALL WRITE_LED2
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED1.0
LCALL WRITE_LED1
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED1.1
LCALL WRITE_LED1
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED1.2
LCALL WRITE_LED1
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED1.3
LCALL WRITE_LED1
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED1.4
LCALL WRITE_LED1
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED1.5
LCALL WRITE_LED1
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED2.0
LCALL WRITE_LED2
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED2.1
LCALL WRITE_LED2
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED2.2
LCALL WRITE_LED2
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED2.3
LCALL WRITE_LED2
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED2.4
LCALL WRITE_LED2
LCALL DELAY100MS
LCALL DELAY100MS
SETB LED2.5
LCALL WRITE_LED2
LCALL DELAY100MS
LCALL DELAY100MS
MOV LED1,#00H
LCALL WRITE_LED1
MOV LED2,#00H
LCALL WRITE_LED2
LCALL DELAY100MS
SETB EA
RET
DELAY10us: ;10us
MOV R6,#51H
DJNZ R6,$
RET
DELAY5us: ;5us
MOV R6,#28H
DJNZ R6,$
RET
DELAY100us: ;100us
MOV R6,#03H
MOV R7,#33H
DJNZ R7,$
DJNZ R6,$-2
RET
DELAY1MS:
MOV R6,#20h
MOV R7,#03h ;延时1mS
DJNZ R7,$
DJNZ R6,$-2
RET
DELAY2MS:
MOV R6,#40h
MOV R7,#07h ;延时2mS
DJNZ R7,$
DJNZ R6,$-2
RET
DELAY15MS: ;15ms
MOV R5,#01H
MOV R6,#0E0H
MOV R7,#37H
DELAY15MS_1:
DJNZ R7,$
DJNZ R6,DELAY15MS_1
DJNZ R5,DELAY15MS_1
RET
DELAY100MS: ;100ms
MOV R5,#0CH
MOV R6,#81H
MOV R7,#6EH
DELAY100:
DJNZ R7,$
DJNZ R6,DELAY100
DJNZ R5,DELAY100
RET
DELAY1S: ;1s
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
LCALL DELAY100MS
RET
RW24C01
;************************************************************************************************
;1.单片机写、DSP读
;例:第一路:单片机写,0040H~006BH,其中有效数据0040H~0067H(40Byte话音字)、0068H~006AH(三个校验字)和006BH(一个
;音量字);
; DSP读,0040H~006BH,其中有效数据0040H~0067H(40Byte话音字)、0068H~006AH(三个校验字)和006BH(一个音量字);
; ....
;2.单片机读、DSP写
;DSP写,0700H~072AH:40Byte话音字、3Byte校验字
;单片机读,0700H~072AH:40Byte话音字、3Byte校验字
;************************************************************************************************
READ_DRAM_TXD: ;从声码器发通道读出话音字
CLR A
MOV R7,#cont_smq ;43 TONE_BYTE
MOV R0,#80H
MOV DPTR,#0E00H
READ_DRAM_TXD_1:
LCALL READ_XRAM
MOV @R0,A
NOP
INC R0
INC DPTR
INC DPTR
DJNZ R7,READ_DRAM_TXD_1
RET
WRITE_XRAM_TXD:
CLR A
MOV R7,#cont_smq ;43 TONE_BYTE AND 1 VOL_BYTE
MOV R0,#80H ;(80H~AAH)--TONE_BYTE ABH--VOL_BYTE
INC DPTR ;第一个为状态字,话音字从第2个开始
WRITE_XRAM_TXD_1:
MOV A,@R0
MOVX @DPTR,A
NOP
NOP
NOP
NOP
NOP
INC R0
INC DPTR
DJNZ R7,WRITE_XRAM_TXD_1
RET
;*********************************************************************************************
;读单片机内部的FLASH中附加的128字节的扇区,实现现场保护功能
;LED1——0001H LED2——0002H
PLAY_BY_PLAY_WRITE: ;现场保护写op_time=14ms左右>10ms
CLR EA
MOV FLSCL,#10001001B
NOP
NOP
NOP
NOP
NOP
NOP
MOV PSCTL,#00000111B
NOP
NOP
NOP
NOP
NOP
NOP
MOV DPTR,#2000H
MOV A,#33H
MOVX @DPTR,A ;擦除扇区内容
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV PSCTL,#00000001B ;禁止擦除
NOP
NOP
NOP
NOP
NOP
NOP
MOV A,#55H ;2000H
MOVX @DPTR,A
INC DPTR ;2001H
MOV A,LED1
MOVX @DPTR,A
INC DPTR ;2002H
MOV A,LED2
MOVX @DPTR,A
NOP
NOP
NOP
NOP
NOP
MOV PSCTL,#00000000B ;禁止擦除和写操作
NOP
NOP
NOP
NOP
NOP
NOP
MOV FLSCL,#10001111B
SETB EA
RET
PLAY_BY_PLAY_READ: ;现场保护读
MOV FLSCL,#10001111B
NOP
NOP
NOP
NOP
NOP
NOP
MOV PSCTL,#00000000B
NOP
NOP
NOP
NOP
NOP
NOP
CLR A
MOV DPTR,#2000H
MOVC A,@A+DPTR
CJNE A,#55H,OUT_READ
CLR A
MOV DPTR,#2001H
MOVC A,@A+DPTR
ANL A,#00111111B ;只取前六位,其他位置0
MOV LED1,A
JNB ACC.5,$+5 ;判断收静音
CLR CTR_SVOX
CLR A
INC DPTR
MOVC A,@A+DPTR
ANL A,#00111111B ;只取前六位,其他位置0
MOV LED2,A
JNB ACC.1,$+5 ;判断面罩
SETB CTR_MZ
OUT_READ:
MOV FLSCL,#10001111B
NOP
NOP
NOP
NOP
NOP
NOP
MOV PSCTL,#00000000B
NOP
NOP
NOP
NOP
NOP
NOP
LCALL WRITE_LED1
LCALL WRITE_LED2
LCALL WRITE_WR1
RET
;用24C01(EEPROM)实现现场保护功能
WRITE_24C01:
; MOV LED1,#00H
CLR EA
MOV R1,LED1
MOV B,#00H
MOV R2,LED2
MOV R3,#00H
LCALL W24
SETB EA
RET
READ_24C01:
MOV B,#00H
LCALL R24
ANL A,#00111011B ;只取前六位,其他位置0
MOV LED1,A
JNB ACC.5,$+5 ;判断收静音
CLR CTR_SVOX
; JNB ACC.4,$+5 ;判断征用
; SETB CTR_ZY
MOV B,#01H
LCALL R24
ANL A,#00111111B ;只取前六位,其他位置0
MOV LED2,A
JNB ACC.2,$+5 ;判断面罩
SETB CTR_MZ
RET
W24: ;(Byte Write) R1,R2,R3--INPUT DATA;B--INPUT ADDRESS
LCALL SA24
MOV A,B ;B--输入地址(WORD ADDRESS)
LCALL WB1
CLR SDA ;WRITE SIGNAL
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
CLR SCL ;WAITING ACK SIGNAL
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
LCALL DELAY5us
CLR SCL
JB SDA,$
MOV A,R1
LCALL WB2
MOV A,R2
LCALL WB2
MOV A,R3
LCALL WB2
LCALL SO24
RET
R24: ;(Byte Read) B--INPUT ADDRESS;A--OUTPUT DATA
LCALL SA24 ;开始传送数据
MOV A,B
LCALL WB1
CLR SCL
LCALL DELAY5us
SETB SDA ;READ SIGNAL
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
CLR SCL ;WAITING ACK SIGNAL
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
LCALL DELAY5us
LCALL DELAY5us
CLR SCL
JB SDA,$
LCALL RB
LCALL SO24
RET
WB1:
MOV R7,#07H ;7 BIT WORD ADDRESS
RLC A
WB_1:
CLR SCL
LCALL DELAY5us
RLC A
MOV SDA,C
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
DJNZ R7,WB_1
CLR SCL
LCALL DELAY5us
RET
WB2:
MOV R7,#08H
WB2_1:
CLR SCL
LCALL DELAY5us
RLC A
MOV SDA,C
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
DJNZ R7,WB2_1
CLR SCL
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
LCALL DELAY5us
CLR SCL
JB SDA,$
LCALL DELAY5us
RET
RB: SETB SDA
MOV R7,#08H
RB_1:
CLR SCL
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
MOV C,SDA
RLC A
LCALL DELAY5us
DJNZ R7,RB_1
LCALL DELAY5us
CLR SCL
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
SETB SDA
LCALL DELAY5us
RET
SA24:
SETB SDA ;SCL高电平时SDA由高变低,开始传送数据!数据只有在SCL为低电平时才能改变!
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
CLR SDA
LCALL DELAY5us
CLR SCL
LCALL DELAY5us
RET
SO24:
CLR SDA
LCALL DELAY5us
SETB SCL
LCALL DELAY5us
SETB SDA
LCALL DELAY5us
CLR SCL
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -