📄 fengmingqi.txt
字号:
JNB READ_CODE,FKW
MOV R7,#04H
MOV 30H,#SHAKE_HAND1
MOV 31H,#SHAKE_HAND2
MOV 32H,#SHAKE_HAND3
MOV 33H,#SHAKE_HAND4
MOV R0,#30H ;发送握手信号
NEXT_CMD: MOV A,@R0
MOV C,ACC.7 ;发送BIT7和比BIT6 7777
MOV SEND_PORT1,C
MOV C,ACC.6
MOV SEND_PORT2,C
SETB WRITE_CODE
JB READ_CODE,$
MOV C,ACC.5 ;发送BIT5和比BIT4
MOV SEND_PORT1,C
MOV C,ACC.4
MOV SEND_PORT2,C
CLR WRITE_CODE
JNB READ_CODE,$
MOV C,ACC.3 ;发送BIT3和比BIT2
MOV SEND_PORT1,C
MOV C,ACC.2
MOV SEND_PORT2,C
SETB WRITE_CODE
JB READ_CODE,$
MOV C,ACC.1 ;发送BIT1和比BIT0
MOV SEND_PORT1,C
MOV C,ACC.0
MOV SEND_PORT2,C
CLR WRITE_CODE
JNB READ_CODE,$
INC R0 ;指向下一个数据
DJNZ R7,NEXT_CMD
CLR TR1 ;停止运行定时器T1
CLR ET1 ;禁止定时器T1中断
CLR TF1
MOV A,#0FFH
MOV P2,A
SETB UPDATE_EN
AJMP KEY_OFF
ALARM_OK: CLR BEEP_PORT
MOV R0,#00H ;延时约132ms
MOV R1,#00H
INIT_A: DJNZ R1,$
CLR MEM_CS ;清除X5045的看门狗定时器
NOP
SETB MEM_CS
DJNZ R0,INIT_A
SETB BEEP_PORT
RET
READ_APROM_SET: CLR A
MOV CHPENR,A ;禁止改变CHPCON寄存器内容
MOV TCON,A ;TR0=0,定时器0停止工作
MOV IP,A
MOV IE,#82H ;允许定时器0中断
MOV TMOD,#01H ;设置T0为16位定时器模式
CLR A
MOV SFRCN,A ;读取APROM命令代码
MOV SFRAL,A ;设置读取数据的器始地址
MOV SFRAH,A
MOV A,#0FEH ;定时时间为2us
MOV T0_L8,A
MOV TL0,A
MOV A,#0FFH
MOV T0_H8,A
MOV TH0,A
RET
READ_PAGE: MOV R0,#00H ;设置读取的数据的存放首地址
READ_LOOP: SETB TR0
MOV PCON,#01H ;进入IDLE工作模式,准备读取APROM中一个字节的内容
MOV A,SFRFD ;读取APROM中一个字节的内容
MOVX @R0,A
INC SFRAL ;修改地址指针,指向下一个数据单元
INC R0
MOV A,R0
JNZ READ_LOOP
INC SFRAH
CLR WRITE_CODE ;设置数据传送的握手信号
WAIT_SHAKE: CLR MEM_CS ;清除X5045的看门狗定时器
NOP
SETB MEM_CS
JB READ_CODE,WAIT_SHAKE;等待主机响应信号
MOV R7,#00H ;设置工作次数
MOV R0,#00H
NEXT_ROM: MOVX A,@R0
MOV C,ACC.7 ;发送BIT7和比BIT6 7777
MOV SEND_PORT1,C
MOV C,ACC.6
MOV SEND_PORT2,C
SETB WRITE_CODE
JNB READ_CODE,$
MOV C,ACC.5 ;发送BIT5和比BIT4
MOV SEND_PORT1,C
MOV C,ACC.4
MOV SEND_PORT2,C
CLR WRITE_CODE
JB READ_CODE,$
MOV C,ACC.3 ;发送BIT3和比BIT2
MOV SEND_PORT1,C
MOV C,ACC.2
MOV SEND_PORT2,C
SETB WRITE_CODE
JNB READ_CODE,$
MOV C,ACC.1 ;发送BIT1和比BIT0
MOV SEND_PORT1,C
MOV C,ACC.0
MOV SEND_PORT2,C
CLR WRITE_CODE
JB READ_CODE,$
INC R0 ;指向下一个数据
DJNZ R7,NEXT_ROM
MOV A,#0FFH
MOV P2,A
CLR WRITE_CODE
CLR MEM_CS ;清除X5045的看门狗定时器
NOP
SETB MEM_CS
MOV A,SFRAH
XRL A,#80H ;判断是否到达终止地址7FFFH
JNZ READ_PAGE
RET
RECEIVE_SHAKE: MOV R7,#00H
DJNZ R7,$ ;延时等待512us
MOV P2,#0FFH
KHR: CLR MEM_CS ;清除X5045的看门狗定时器
NOP
SETB MEM_CS
JB WRITE_CODE,KHR ;等待芯片擦除并查空完毕
CLR READ_CODE ;设置响应获取擦除信息的握手信号标志
MOV R7,#14H ;获取芯片擦除状态信息(共有20字节)
MOV R0,#90H
GET_BLANK: JNB WRITE_CODE,$ ;首先获取7,6位数据
MOV A,P2
SETB READ_CODE
MOV C,ACC.RECEIVE1 ;保留7,6位数据
MOV B.7,C
MOV C,ACC.RECEIVE2
MOV B.6,C
JB WRITE_CODE,$ ;接着获取5,4位数据
MOV A,P2
CLR READ_CODE
MOV C,ACC.RECEIVE1 ;保留5,4位数据
MOV B.5,C
MOV C,ACC.RECEIVE2
MOV B.4,C
JNB WRITE_CODE,$ ;获取3,2位数据
MOV A,P2
SETB READ_CODE
MOV C,ACC.RECEIVE1 ;保留3,2位数据
MOV B.3,C
MOV C,ACC.RECEIVE2
MOV B.2,C
JB WRITE_CODE,$ ;接着获取1,0位数据
MOV A,P2
CLR READ_CODE
MOV C,ACC.RECEIVE1 ;保留1,0位数据
MOV B.1,C
MOV C,ACC.RECEIVE2
MOV B.0,C
MOV A,B
MOV @R0,A
INC R0
DJNZ R7,GET_BLANK ;不到20个字节,继续
MOV A,#0FFH
MOV P2,A
MOV R7,#14H ;获取芯片擦除状态信息(共有20字节)
MOV R0,#90H
MOV DPTR,#PROG_SHAKE
FKT: CLR A
MOVC A,@A+DPTR
XRL A,@R0 ;比较数据是否符合系统要求
JNZ SHAKE_ERROR
INC R0
INC DPTR
DJNZ R7,FKT
RET
SHAKE_ERROR: CLR MEM_CS ;在线编程握手信号错误,则不再响应命令
MOV A,#0FFH
MOV P2,A
SETB MEM_CS
SJMP SHAKE_ERROR
PROG_SHAKE: DB ISP_SHAKE0 ;在线编程握手标志数据0
DB ISP_SHAKE1 ;在线编程握手标志数据1
DB ISP_SHAKE2 ;在线编程握手标志数据2
DB ISP_SHAKE3 ;在线编程握手标志数据3
DB ISP_SHAKE4 ;在线编程握手标志数据4
DB ISP_SHAKE5 ;在线编程握手标志数据5
DB ISP_SHAKE6 ;在线编程握手标志数据6
DB ISP_SHAKE7 ;在线编程握手标志数据7
DB ISP_SHAKE8 ;在线编程握手标志数据8
DB ISP_SHAKE9 ;在线编程握手标志数据9
DB ISP_SHAKEA ;在线编程握手标志数据A
DB ISP_SHAKEB ;在线编程握手标志数据B
DB ISP_SHAKEC ;在线编程握手标志数据C
DB ISP_SHAKED ;在线编程握手标志数据D
DB ISP_SHAKEE ;在线编程握手标志数据E
DB ISP_SHAKEF ;在线编程握手标志数据F
DB ISP_SHAKEG ;在线编程握手标志数据G
DB ISP_SHAKEH ;在线编程握手标志数据H
DB ISP_SHAKEI ;在线编程握手标志数据I
DB ISP_SHAKEJ ;在线编程握手标志数据J
BEEP_ONE: MOV A,#BEEP_ON_TIME ;设置蜂鸣器发声时间
MOV BEEP_WAVE,A
CLR BEEP_PORT ;打开蜂鸣器
SETB BEEP_FLAG
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -