📄 w1.asm
字号:
;71H和R7动态延时
;7CH接收的高位地址
;7DH接收的低位地址
;R2,R3 CALL DELAY
;R4,R5 初始化指示灯闪动的次数
;R6 小延时参数
;R0 16字节指针
ORG 0000H
LJMP START
ORG 0030H
START:
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
acall init
MOV 20H,#00 ;用于位
MOV 70H,#00 ;键操作指针
ANL PCON,#7FH ;SMOD=0,OTHER=RESET
MOV SCON,#70h ;串口方式0
MOV TMOD,#21h ;T0定时,T1计数
MOV TL1,#0FDH ;波特率,9600,4800,2400,1200
MOV TH1,#0FDH ; 0FDH,0FAH,0F4H,0E8H
MOV IE,#00000000B ;EA - ET2 ES ET1 EX1 ET0 EX0
SETB TR1 ;启动定时器1,波特率
MOV R0,#0
MOV R7,#02 ;acall delay 的次数
mov dph,#0 ;mov dptr,#0
mov dpl,#0
CLR F0
MAIN: jnb RI,$ ;等待接收串口数据
CLR RI
MOV A,SBUF
CJNE A,#05H,N05 ;R 8951
AJMP R51
N05: CJNE A,#15H,N15 ;W 8951
AJMP F51
N15: CJNE A,#06H,N06 ;R 8952
AJMP R52
N06: CJNE A,#16H,N16 ;W 8952
AJMP F51
N16: CJNE A,#07H,N07 ;R 2051
AJMP R20
N07: CJNE A,#17H,N17 ;W 2051
AJMP W20
N17: CJNE A,#25H,N25 ;E 8951
AJMP E51
N25: CJNE A,#27H,N27 ;E 2051
AJMP E20
N27: CJNE A,#01H,N01 ;R2764 2864
AJMP R64
N01: CJNE A,#11H,N11 ;W2764
AJMP W2764
N11: CJNE A,#12H,N12 ;W2864
AJMP W2864
N12:
AJMP 0000
;---------------------------------------------
R51: MOV 7DH,#10H ;4K
AJMP R895x
R52: MOV 7DH,#20H ;8K
R895x: ACALL R89CW
R895y: MOV P1,DPL
MOV P2,DPH
MOV A,P0
ACALL SEND ;发送的同时inc DPTR
mov A,#0
cjne a, dpl,R895Y ;一次发送256个
acall read ;计算机是收到必发
MOV A,7DH
CJNE A,DPH,R895X
LJMP START
R89CW: CLR P2.7 ;读控制信号 P2.6,P2.7,P3.6,P3.7,/PROG(30)
SETB P3.6 ; L , L , H , H , H
SETB P3.7 ;
SETB P3.3 ;ALE/PROG=5V
SETB P3.5 ;Vpp=5v
SETB P3.2 ;
MOV P0,#0FFH
RET
;---------------------------------------------
F51: ACALL E895 ;擦除IC 写8951和8952
mov a,#5Ah ;要高位
ACALL receive ;先发再收
mov 7ch,a ;高位
mov a,#5Bh ;要低位
acall receive
mov 7dh,a ;低位
;
W895x: mov a,#5Ch ;要数据
ACALL RECEIVE16 ;接收数据
MOV R0,#50H;
W89a: ;CLR P2.7 ;读控制
MOV A,@R0
cjne A,#0FFH,WORK
SJMP OK
WORK:
SETB P3.3 ;ALE/P=H
SETB P3.5 ;12V
CLR P2.6 ;写控制信号 /PROG,P2.6,P2.7,P3.6,P3.7,Vpp
SETB P3.6 ; P3.3
SETB P3.7 ;
MOV P0,A ;data ;ACALL XDY
MOV P1,DPL ;低地址
MOV P2,DPH ;高地址
SETB P2.7 ;ENABLE L , L , H , H , H ,12v ;ACALL XDY
CLR P3.2 ;Vpp=12v, ;ACALL XDY
nop ;准备写
CLR P3.3 ;ALE/PROG=L 12V
acall delay ;写过程
SETB P3.3 ;ALE/P=H 5V ;
SETB P3.2 ;Vpp=5V
; JNB P3.4,$ ;增加判断,保证写入; SETB P3.5
nop ;准备读
CLR P2.7 ;读
MOV P0,#0FFH ;准备读
MOV B,P0 ;读
CJNE A,B,W89a ;比较,不等继续写
OK: INC R0
INC DPTR ;地址加1
CJNE R0,#60H,W89a
MOV A,7CH ;取结束地址
CJNE A,DPH,W895X ;不等转W895x
MOV A,7DH
CJNE A,DPL,W895X
MOV A,#5DH ;送结束信号
ACALL SEND
LJMP START
;--------------------------------
E20: mov 71H,#02; 延时
EE20:
ACALL INIT2051 ;初始化2051
ACALL E205 ;擦除IC
MOV P1,#0
MOV P2,#0
ACALL W20CW ;发读控制字
MOV A,P0
cjne a,#0FFh,EEE20 ;空了吗?
MOV A,#5DH; ;发ok!信息
ACALL SEND;
AJMP start;
EEE20: inc 71h
mov r7,71h
cjne r7,#09,EE20 ;再擦
MOV A,#5EH; ;发不可擦信息
ACALL SEND;
AJMP START;
;--------------------------------
E51: mov 71H,#03; 延时
EE51:
ACALL E895; 擦除
ACALL R89CW; 读控制字
MOV P1,#0
MOV P2,#0
MOV A,P0
cjne a,#0FFh,Enext ;空了吗?
MOV A,#5DH;
ACALL SEND;
AJMP start;
Enext: inc 71h
mov r7,71h
cjne r7,#09,EE51 ;再擦
MOV A,#5EH;
ACALL SEND;
AJMP START;
;---------------------------------
W89CW: SETB P3.3 ;ALE/P=H
CLR P2.6 ;写控制信号 /PROG,P2.6,P2.7,P3.6,P3.7,Vpp
SETB P2.7 ; L , L , H , H , H ,12v
SETB P3.6 ;
SETB P3.7
SETB P3.5 ;
CLR P3.2 ;Vpp=12v
CLR P3.3 ;ALE/PROG=L
RET
;-----------------------------------------
E895: SETB P3.3 ;擦除控制字 /PROG,P2.6,P2.7,P3.6,P3.7,Vpp
SETB P3.5 ; HLH , H , L , L , L ,12v
SETB P2.6
CLR P2.7
CLR P3.6
CLR P3.7 ;acall xdy
CLR P3.2 ;Vpp=12v
NOP; acall xdy
CLR P3.3 ;脉冲L
xx: ACALL DELAY
djnz r7,xx
SETB P3.3 ;脉冲H ;acall xdy
SETB P3.2 ;5V
RET
;---------------------------------------------
INIT2051:CLR P3.5 ;上电(RST L->H )
SETB P3.2 ;
CLR P2.6 ;XTAL1=0
ACALL DELAY ;10ms
SETB P3.5
RET
;---------------------------------------------
R20: ACALL INIT2051
A2051: ACALL R20CW
MOV A,P0
ACALL SEND
SETB P2.6 ;地址加1
CLR P2.6 ;XTAL1
mov A,#0
cjne a, dpl,A2051 ;一次发送256个
acall read
MOV A,DPH
CJNE A,#08,A2051 ;2K
LJMP START
;---------------------------------------------
R20CW:SETB P3.5 ;读控制信号 RST,P3.2/PROG,P3.3,P3.4,P3.5,P3.7
SETB P3.2 ; H , H , L , L , H , H
SETB P2.2 ; O2, P2.2 ,P2.3,P2.4,P2.5,P2.0
CLR P2.3
CLR P2.4
SETB P2.5
SETB P2.0
MOV P0,#0FFH
RET
;---------------------------------------------
W20: ACALL INIT2051 ;初始化2051
ACALL E205 ;擦除IC
mov a,#5Ah ;要高位
ACALL receive
mov 7ch,a ;高位
mov a,#5Bh ;要低位
acall receive
mov 7dh,a ;低位
WW20: mov a,#5Ch ;要数据
ACALL RECEIVE16 ;
mov R0,#50H
W20a:
MOV A,@R0
MOV P0,A
CJNE A,#0FFH,WORK1
SJMP OK1
WORK1:
ACALL W20CW ;写控制字
ACALL DELAY ;写过程
; jnb p2.1,$ ; SETB P2.2 ;/P=H
ACALL R20CW ;读控制字
mov P0,#0ffh
MOV B,P0
CJNE A,B,W20A ;校验
OK1: SETB P2.6 ;地址加1
CLR P2.6 ;XTAL1
INC R0
INC DPTR ;计数器加1
CJNE R0,#60H,W20A ;页内写
MOV A,DPH
CJNE A,7CH,WW20 ;再去接收
MOV A,DPL
CJNE A,7DH,WW20
MOV A,#5DH ;送结束信号
ACALL SEND
LJMP START
;---------------------------------------------
W20CW: SETB P3.5 ;写控制信号 RST,P3.2/PROG,P3.3,P3.4,P3.5,P3.7
CLR P3.2 ; 12V, H->L->H , L , H , H , H
SETB P2.2 ; O2, P2.2 ,P2.3,P2.4,P2.5,P2.0
CLR P2.2 ;/PROG=L
CLR P2.3
SETB P2.4
SETB P2.5
SETB P2.0
RET
;---------------------------------------------
E205:SETB P3.5 ;擦除控制字 RST,P3.2/PROG,P3.3,P3.4,P3.5,P3.7
CLR P3.2 ; 12v, H->L->H , H , L , L , L
SETB P2.2 ;/PROG=H O2, P2.2 ,P2.3,P2.4,P2.5,P2.0
CLR P2.2 ;/PROG=L
SETB P2.3
CLR P2.4
CLR P2.5
CLR P2.0
xxx: ACALL DELAY
djnz r7,xxx
; ACALL DELAY ;延时10ms
SETB P2.2 ;/PROG=H
RET
;---------------------------------
SEND: MOV SBUF,A ;发送数据
JNB TI,$
CLR TI
INC DPTR ;地址加1
RET
;
RECEIVE: MOV SBUF,A; #5AH
JNB TI,$
CLR TI
READ: JNB RI,$
CLR RI
MOV A,SBUF ;接收数据
RET
RECEIVE16: MOV SBUF,A; #5AH
JNB TI,$
CLR TI
mov R0,#50H
READ16: JNB RI,$
CLR RI
MOV A,SBUF ;接收数据
MOV @R0,A
INC R0
CJNE R0,#60H,READ16;
RET
;--------------------------------
DELAY: MOV R2,#0AH ;延时10ms
DEL1: MOV R3,#80H
DEL2: NOP
DJNZ R3,DEL2
DJNZ R2,DEL1
RET
xdy: MOV R6,#05H
DJNZ r6,$ ;delay 48T
ret
ydy: MOV R6,#64H
DJNZ r6,$ ;delay 48T
ret
init:mov r5,#10H ;闪动次数
inix: mov r4,#10H
dly: call delay
djnz r4,dly
cpl p3.4
djnz r5,inix;
setb p3.4
ret
;===========================================
R64: MOV P1,DPL
MOV P2,DPH
ACALL R64CW
MOV A,P0
LCALL SEND
MOV A,#0
CJNE A,DPL,R64 ;相当于一次接收256字节
ACALL READ ;接收值无用,准备发送下一组数据。
MOV A,DPH
CJNE A,#20H,R64 ;8K
LJMP 0000H
;
R64CW: CLR P3.7 ;/CS
SETB P2.6 ;2764:-PRG 2864:-WE
SETB P3.3 ;关闭高压
SETB P2.7 ;Vpp=5V
SETB P3.2 ;关闭高压
CLR P3.5 ;/OE=0
RET
;-----------------------------------
W2864: SETB F0 ;RESET F0=0
W2764: mov a,#5Ah ;要高位
ACALL receive ;先发再收
mov 7ch,a ;高位
mov a,#5Bh ;要低位
acall receive
mov 7dh,a ;低位
ACALL W64CW ;写状态,并锁存数据
acall delay ;
W64x: mov a,#5CH ;要数据
ACALL RECEIVE16 ;接收数据
MOV R0,#50H ;缓冲区 50-5F
V264: MOV A,@R0 ;取数据
MOV P1,DPL ;送地址
MOV P2,DPH
LCALL R64CW ;发读控制字
MOV P0,#0FFH
MOV B,P0 ;读
CJNE A,B,W2x64 ;不等才写
AJMP A64 ;相等跳过
W2x64: MOV P0,A
ACALL W64CW ;写状态,并锁存数据
acall delay ;
ACALL R64CW ;发读控制字
acall ydy ;
MOV P0,#0FFH
MOV B,P0 ;读
CJNE A,B,W2x64 ;不等再写
;
A64: INC DPTR ;地址加1
INC R0 ;数据区指针加1
CJNE R0,#60H,V264 ;要完成16个数据的写入
MOV A,DPH
CJNE A,7CH,W64x ;8K
MOV A,DPL
CJNE A,7DH,W64x ;请求发送下16个数据
MOV A,#5DH ;结束标志
LCALL SEND
LJMP 0000H
;
W64CW: SETB P2.7 ;1脚 Vpp 准备送电压
SETB P3.3 ;关闭12V
SETB P3.5 ;/OE=H
SETB P3.2 ;关闭高压
CLR P3.7 ;/CS=0
JB F0,NH ;2864不用12V
CLR P3.3 ;Vpp=12V
NH: CLR P2.6 ;2764:/PGM=0, 2864:/WE 写控制信号
RET
END;
;-------------------------------------------------
; 2764 2864A 8031
; P27 ┌──┬──┐ ┌──┬──┐ ┌──┬──┐
; P33 Vpp│1 28│+5V NC│1 28│+5V P1.0 ┤1 40├ VCC
; A12│2 P26 27│-PGM A12│2 27│-WE P1.1 ┤2 39├ P0.0
; A7│3 26│NC A7│3 26│NC P1.2 ┤3 38├ P0.1
; A6│4 25│A8 A6│4 25│A8 P1.3 ┤4 37├ P0.2
; A5│5 24│A9 A5│5 24│A9 P1.4 ┤5 36├ P0.3
; A4│6 23│A11 A4│6 23│A11 P1.5 ┤6 35├ P0.4
; A3│7 P32 22│-OE P35 A3│7 22│-OE P1.6 ┤7 34├ P0.5
; A2│8 21│A10 A2│8 21│A10 P1.7 ┤8 33├ P0.6
; A1│9 P37 20│-CS A1│9 20│-CS RST/VPP ┤9 32├ P0.7
; A0│10 19│D7 A0│10 19│D7 RXD P3.0 ┤10 31├ -EA/VDD
; D0│11 18│D6 D0│11 18│D6 TXD P3.1 ┤11 30├ ALE/-PRG
; D1│12 17│D5 D1│12 17│D5 -INT0 P3.2 ┤12 29├ -PSEN
; D2│13 16│D4 D2│13 16│D4 -INT1 P3.3 ┤13 28├ P2.7
; 地│14 15│D3 地│14 15│D3 T0 P3.4 ┤14 27├ P2.6
; └─────┘ └─────┘ T1 P3.5 ┤15 26├ P2.5
; -WR P3.6 ┤16 25├ P2.4 ; 读:-CE=0 -OE=0 -WE=H -RD P3.7 ┤17 24├ P2.3
; 写:-CE=0 -OE=H -WE=0 XTAL2 ┤18 23├ P2.2
; 2764: VPP=12V~13V VCC=5.75~6.5 XTAL1 ┤19 22├ P2.1
; 2864: 脚1 空 VSS ┤20 21├ P2.0
; └─────┘
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -