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

📄 93c46-a.asm

📁 這是一個學習如何寫入的93c46的EEPROM 的程式.
💻 ASM
字号:
;//----------93C46 DOWNLOAD PROGRAM---------//
;//----------6MHZ CRYSTAL-------------------//

FLAG0			EQU 	20H.0
FLAG1			EQU	20H.1
FLAG2			EQU	20H.2
FLAG3			EQU	20H.3
SENDF			EQU	20H.4

CS			BIT	P1.2
SK			BIT	P1.3
DI			BIT	P1.4
DO			BIT 	P1.5
B_CNT			DATA	10H
B_SEND			DATA	11H
DATSEND		DATA	12H


	ORG	0000H
	JMP	INIT

	ORG	23H
	JB	SENDF,SENDFF
	JB	FLAG0,FG0
	LJMP	JUDGE	
	JMP	INIT

FG0:		LJMP	SERIAL		;receive program
SENDFF:	LJMP	SERIAL1	;send program send to pc 
	
INIT:		
	MOV	A,#00
	MOV	TMOD,#20H	;set bandant rate 1200
	MOV	TH1,#0F3H
	MOV	TL1,#0F3H
	SETB	TCON.6		;TR1 start
	MOV	PCON,A		;set smod=0
	SETB	IE.7		;set int Enable
	SETB 	IE.4		;set serial int
	MOV	SCON,#50H	;SIO in mode1 & Ren bit enable
	MOV	PSW,A		;set psw.5 low	
	CLR	FLAG0
	CLR	FLAG1
	CLR	FLAG2
	CLR	FLAG3
	CLR	SENDF	

;// No need DTR control to start mcu.

		
MAIN:

;//--------------------------------------------------------------//
;// First judge which function will be done---------------------//
;// check receive data from PC---------------------------------//
;// 00----> flag0  write sub then receive data from Pc--------//
;// 01---> flag1  read sub then send data to Pc -------------//
;// 02--->  flag2 write all is set 0------------------------//
;// 03---> flag3 erase all is set 1 -----------------------//

AGAIN:	SETB 	PSW.5
WAIT:	JB	PSW.5,WAIT		;wait serial int
	JB	FLAG0,RECEIVE
	JB	FLAG1,READ6
	JB	FLAG2,WRAL6
	JB	FLAG3,ERAL6
JUDGE:	MOV	A,SBUF
	JZ	WRITE4		;00
	DEC	A
	JZ	READ4		;01
	DEC	A
	JZ	WRAL4		;02
	DEC	A
	JZ	ERAL4		;03


WRITE4:				;00
	SETB	FLAG0
	JMP	CLEAR
	
READ4:				;01
	SETB	FLAG1
	JMP		CLEAR

WRAL4:				;02
	SETB	FLAG2
	JMP		CLEAR

ERAL4:				;03
	SETB	FLAG3
	JMP		CLEAR

CLEAR:	CLR	SCON.0
		CLR	PSW.5
		RETI

READ6:
	LJMP	READ5
ERAL6:
	LJMP	ERAL5
WRAL6:
	LJMP	WRAL5	

		
;// Judge sub finished---------------------------------------------//

;//-----------------------------------------------------------------------------------
;//Mcu receive data from pc 128 bytes.
;//mcu put these data from 80h--ffh. 

RECEIVE:	
		MOV	R1,#80H		;receive data and put 80--ffh
		MOV	R2,#128		;128 times
AGAIN1:	SETB 	PSW.5

WAIT1:	JB	PSW.5,WAIT1	;wait serial int
		DJNZ	R2,AGAIN1
		CLR	FLAG0
		LJMP	WRITE5

SERIAL:	MOV	A,SBUF
		MOV	@R1,A
		INC	R1
		CLR	SCON.0
		CLR	PSW.5
		RETI

;//128 bytes data receive finished.
;//---------------------------------------------------------------------------

WRAL5:
	LCALL	WRAL
	CLR		FLAG2
	LJMP	INIT

ERAL5:
	LCALL	ERAL
	CLR		FLAG3
	LJMP	INIT


WRITE5:				;Write data
	LCALL	WRITE
	LJMP	INIT

READ5:				;Read data from PC
	LCALL	READ3	
	LCALL	SEND_PC
	LJMP	INIT



;// mcu send data to pc sub program //

SEND_PC:
		SETB	SENDF		; SET Send flag 
		MOV	SCON,#40H	;SET REN BIT DISABLE & can not receive.
		MOV	R1,#80H		;take data from 80H ~ FFH.
		MOV	R2,#80H		;80 ~ FFh total 128bytes, counter.
T_LOOP:	SETB	PSW.5
		MOV	A,@R1
		MOV	SBUF,A
T_WAIT:	JB	PSW.5,T_WAIT
		INC	R1
		DJNZ	R2,T_LOOP
		
		CLR	SENDF
		MOV	SCON,#50H	;set ren bit enable
		RET

;------------------------------------------------------
SERIAL1:	MOV	R4,#01FH
TDL1:		DJNZ	R4,TDL1

		CLR		SCON.1
		CLR		PSW.5
		RETI

;------------------------------------------------------

;// send data to pc sub finished    //



;//----------READ SUB -----------------
READ3:	
	MOV	R7,#00H		;READ- ADDRESS
	MOV	R2,#64		;64*16 STRUCTURE, loop 64 times
	MOV	R0,#80H		;PUSH DATA FROM 80H,DATA STACK 80~FFH of mcu

READ:
		
	LCALL	START_93C46
	MOV	DATSEND,#06H		
	MOV	B_SEND,#03H		
	LCALL	SEND_DATA		;send operater code
	MOV	DATSEND,R7
	MOV	B_SEND,#06H		
	LCALL	SEND_DATA		;send address
	SETB	DO
	MOV	B_CNT,#16

READ1:	SETB	SK
	SETB 	SK
	CLR	SK
	CLR	SK
	NOP
	MOV	C,DO
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R6
	RLC	A
	MOV	R6,A
	DJNZ	B_CNT,READ1
	LCALL	STOP_93C46
	MOV	A,R5
	MOV	@R0,A		; put low byte in low address start address 80
	INC	R0
	MOV	A,R6
	MOV	@R0,A
	INC	R0
	INC	R7		;( address +1) *2
	DJNZ	R2,READ
	CLR	FLAG1

	RET


;//---write sub from 00~7F address---//
;//take data from RAM 80~FF of 78E52 mcu--//

WRITE:	
	MOV	R7,#00H		;WRITE - ADDRESS
	MOV	R2,#64		;64*16 STRUCTURE, loop 64 times
	MOV	R0,#80H		;TAKE DATA FROM 80H,DATA STACK 80~FFH of mcu

;//    it is 16 bit structure---------------//	
;//R5 put low data & R6 put high---//

WRITE1:
	MOV	A,@R0		
	MOV	R5,A
	INC	R0
	MOV	A,@R0
	MOV	R6,A
	INC 	R0
	
	LCALL	WEN_93C46		;write enable
	LCALL	START_93C46		;start ic
	MOV	DATSEND,#05H		;send operater code
	MOV	B_SEND,#03H
	LCALL	SEND_DATA
	MOV	DATSEND,R7			;send write-address
	MOV	B_SEND,#06H
	LCALL	SEND_DATA	
	MOV	DATSEND,R6			;send write-data
	MOV	B_SEND,#08H		
	LCALL	SEND_DATA
	MOV	DATSEND,R5
	MOV	B_SEND,#08H
	LCALL	SEND_DATA
	
	INC	R7				;write-address +1
	DJNZ	R2,WRITE1	;total 64 times*16,R2 is counter

	LCALL	STOP_93C46
	LCALL	WDS_93C46
	RET


;// Set all bit 0.

WRAL:
	MOV	R5,#00H
	MOV	R6,#00H
	LCALL	WEN_93C46
	LCALL	START_93C46
	MOV	DATSEND,#11H
	MOV	B_SEND,#05H
	LCALL	SEND_DATA
	MOV	DATSEND,#00H
	MOV	B_SEND,#04H
	LCALL	SEND_DATA
	MOV	DATSEND,R6
	MOV	B_SEND,#08H
	LCALL	SEND_DATA
	MOV	DATSEND,R5
	MOV	B_SEND,#08H
	LCALL	SEND_DATA
	LCALL	STOP_93C46
	LCALL	WDS_93C46


START_93C46:
	SETB	DO
	SETB 	DI
	CLR	SK
	SETB	CS
	JNB	DO,$
	SETB	SK
	CLR	SK
	CLR	CS
	CLR	SK
	CLR	DI
	SETB	CS
	RET

STOP_93C46:
	CLR	SK
	CLR	DI
	CLR	CS
	SETB	DO
	RET

WEN_93C46:
	LCALL	START_93C46
	MOV	DATSEND,#04H
	MOV	B_SEND,#03H
	LCALL	SEND_DATA
	MOV	DATSEND,#30H
	MOV	B_SEND,#06H
	LCALL	SEND_DATA
	LCALL	STOP_93C46
	RET

WDS_93C46:
	LCALL	START_93C46
	MOV	DATSEND,#04H
	MOV	B_SEND,#03H
	LCALL	SEND_DATA
	MOV	DATSEND,#00H
	MOV	B_SEND,#06H
	LCALL	SEND_DATA
	LCALL	STOP_93C46
	RET

;//Erase all from 00~7F---//
;//set all bit is 1------//

ERASE:
	LCALL	WEN_93C46
	LCALL	START_93C46
	MOV	DATSEND,#07H
	MOV	B_SEND,#03H
	LCALL	SEND_DATA
	MOV	DATSEND,R7
	MOV	B_SEND,#06H
	LCALL	SEND_DATA
	LCALL	STOP_93C46
	LCALL	WDS_93C46
	RET

ERAL:
	LCALL	WEN_93C46
	LCALL	START_93C46
	MOV	DATSEND,#04H
	MOV	B_SEND,#03H
	LCALL	SEND_DATA
	MOV	DATSEND,#20H
	MOV	B_SEND,#06H
	LCALL	SEND_DATA
	LCALL	STOP_93C46
	LCALL	WDS_93C46
	RET

SEND_DATA:
	MOV	B_CNT,B_SEND
	MOV	A,#08H
	CLR 	C
	SUBB	A,B_CNT
	MOV	B_CNT,A
	JZ	SEND_DATA2
	MOV	A,DATSEND
	
SEND_DATA1:
	RL	A
	DJNZ	B_CNT,SEND_DATA1
	JMP	SEND_DATA3
SEND_DATA2:
	MOV	A,DATSEND
SEND_DATA3:
	MOV	B_CNT,B_SEND
SEND_DATA4:
	RLC	A
	JC	SEND_DATA5
	CLR	DI
	JMP	SEND_DATA6
SEND_DATA5:
	SETB	DI
	NOP
	NOP
SEND_DATA6:
	SETB	SK
	CLR	SK
	DJNZ	B_CNT,SEND_DATA4
	RET
CLOSE:
	END









⌨️ 快捷键说明

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