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

📄 kzwj230.asm

📁 完成485总线数据的收发。 按键扫描等
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	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 + -