📄 93c46-a.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 + -