📄 w2b.asm
字号:
SETB P2.0
MOV P0,#0FFH
RET
;---------------------------------------------
W2051: 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
;===========================================
R2864: MOV P1,DPL
MOV P2,DPH
ACALL R64CW
MOV A,P0
LCALL SEND
MOV A,#0
CJNE A,DPL,R2864 ;相当于一次接收256字节
ACALL READ ;接收值无用,准备发送下一组数据。
CJNE A,#6BH,AGRD2
LJMP START ;比较出错,让其退出。
AGRD2:
MOV A,DPH
CJNE A,#20H,R2864 ;8K
LJMP 0000H
;-----------------------------------
W2864: SETB F0 ;RESET F0=0
W2764: mov a,#5Ah ;要高位
ACALL receive ;先发再收
mov 7ch,a ;高位
mov a,#5Bh ;要低位
acall receive
mov 7dh,a ;低位
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
;
R64CW: CLR P3.7 ;-CS
SETB P2.6 ;2764:-PRG 2864:-WE
CLR P3.3 ;-OE=0 ; SETB P2.7 ;Vpp=5V
SETB P3.2 ;关闭高压 ; SETB P3.5 ;没用
RET
W64CW: ;SETB P2.7 ;1脚 Vpp 准备送电压
SETB P3.3 ;-OE=H; SETB P3.5 ;有反向2极管引入1脚。这里没什么用.
SETB P3.2 ;关闭高压
CLR P3.7 ;-CS=0
JB F0,NH ;2864不用12V
CLR P3.2 ;Vpp=12V (原是P33)
NH: CLR P2.6 ;2764:-PGM=0, 2864:-WE 写控制信号
RET
END;
;
;
;-------------------------------------------------
;
;
;
;
;
; 2764 2864A 8951
; P32 ┌──┬──┐ ┌──┬──┐ ┌──┬──┐
; P35 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 P33 22│-OE 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 ┤9 5V 32├ P0.7
; A0│10 19│D7 A0│10 19│D7 RXD P3.0 ┤10 (P32)31├ -EA/VP
; D0│11 18│D6 D0│11 18│D6 TXD P3.1 ┤11 P33 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 out 23├ P2.2
; 2764: VPP=12V~13V VCC=5.75~6.5 XTAL1 ┤19 in 22├ P2.1
; 2864: 脚1 空 区别只是无高压 VSS ┤20 21├ P2.0
; └─────┘
;
; 2764 27256 27512
; ┌──┬──┐ ┌──┬──┐ ┌──┬──┐
; Vpp│1 28│+5V Vpp│1 28│+5V A15│1 28│+5V
; A12│2 27│-PGM A12│2 27│A14 A12│2 27│A14
; A7│3 26│NC A7│3 26│A13 A7│3 26│A13
; A6│4 25│A8 A6│4 25│A8 A6│4 25│A8
; A5│5 24│A9 A5│5 24│A9 A5│5 24│A9
; A4│6 23│A11 A4│6 23│A11 A4│6 23│A11
; A3│7 22│-OE A3│7 22│-OE A3│7 22│-OE/VPP
; A2│8 21│A10 A2│8 21│A10 A2│8 21│A10
; A1│9 20│-CS A1│9 20│-CS/PRM A1│9 20│-CS
; A0│10 19│D7 A0│10 19│D7 A0│10 19│D7
; D0│11 18│D6 D0│11 18│D6 D0│11 18│D6
; D1│12 17│D5 D1│12 17│D5 D1│12 17│D5
; D2│13 16│D4 D2│13 16│D4 D2│13 16│D4
; 地│14 15│D3 地│14 15│D3 地│14 15│D3
; └─────┘ └─────┘ └─────┘
;
; 27010 27040 27080
; ┌──┬──┐ ┌──┬──┐ ┌──┬──┐
; Vpp│1 32│+5V Vpp│1 32│+5V A19│1 32│+5V
; A16│2 31│-PGM A16│2 31│A18 A16│2 31│A18
; A15│3 30│NC A15│3 30│A17 A15│3 30│A17
; A12│4 29│A14 A12│4 29│A14 A12│4 29│A14
; A7│5 28│A13 A7│5 28│A13 A7│5 28│A13
; A6│6 27│A8 A6│6 27│A8 A6│6 27│A8
; A5│7 26│A9 A5│7 26│A9 A5│7 26│A9
; A4│8 25│A11 A4│8 25│A11 A4│8 25│A11
; A3│9 24│-OE A3│9 24│-OE A3│9 24│-OE/Vpp
; A2│10 23│A10 A2│10 23│A10 A2│10 23│A10
; A1│11 22│-CS A1│11 22│-CS/PGM A1│11 22│-CS
; A0│12 21│D7 A0│12 21│D7 A0│12 21│D7
; D0│13 20│D6 D0│13 20│D6 D0│13 20│D6
; D1│14 19│D5 D1│14 19│D5 D1│14 19│D5
; D2│15 18│D4 D2│15 18│D4 D2│15 18│D4
; 地│16 17│D3 地│16 17│D3 地│16 17│D3
; └─────┘ └─────┘ └─────┘
;电源正极通过二极管接Vpp,空出P35, 除040,-cs都能接地,空出p37。
;P32->Vpp, P33->-OE, P37->-CS
;010:P34=A16
;020: P34=A16 P35=A17
;040: P34=A16 P35=A17 P36=A18
;080: p34=A16 P35=A17 P36=A18 P33=A19(-OE=Vpp由P32控制,空出P33 )
;================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -