单片机EEPROM读擦写问题 请汇编高手指点 我只懂汇编语言
我使用的程序是从STC的说明书里抄的ORG00HJMPQQ;---FH1---程序运行一次无返回--QQ:MOVP1,#0FFHMOVP3,#0FFH;==改写200H-...
我使用的程序是从STC的说明书里抄的
ORG 00H
JMP QQ
;---FH1---程序运行一次无返回--
QQ: MOV P1,#0FFH
MOV P3,#0FFH
;== 改写200H---3FFH的 EEPROM
MOV R1,#5
WQ3: JB GNAN,QQ1
CALL T2MS
DJNZ R1,WQ3
JNB GNAN,$
;====读==200H---3FFH的 EEPROM
MOV 0C3H,#200H
MOV 0C4H,#3FFH
MOV 0C7H,#10000000B
MOV 0C5H,#1
MOV 0C6H,#5AH
MOV 0C6H,#0A5H
NOP
MOV A,0C2H
NOP
BD: CALL ADXS
MOV A,02CH
;===按下按钮A数据加1
;这里有个调数据的程序
;===
Q2: MOV 02CH,A
JB GNAN,BD
CALL T2MS
JB GNAN,BD
JNB GNAN,$
;===擦除===200H-3FFH==EEPROM
MOV 0C3H,#200H
MOV 0C4H,#3FFH
MOV 0C7H,#10000000B
MOV 0C5H,#3
MOV 0C6H,#5AH
MOV 0C6H,#0A5H
NOP
;==写入===200H-3FFH==EEPROM
MOV A,0C2H
MOV 0C3H,#200H
MOV 0C4H,#3FFH
MOV 0C7H,#10000000B
MOV 0C5H,#2
MOV 0C6H,#5AH
MOV 0C6H,#0A5H
NOP
JMP QQ
QQ1: ;====改写0000H---1FFH的 EEPROM
我就是把
MOV 0C3H,#200H
MOV 0C4H,#3FFH
改成
MOV 0C3H,#0000H
MOV 0C4H,#1FFH 展开
ORG 00H
JMP QQ
;---FH1---程序运行一次无返回--
QQ: MOV P1,#0FFH
MOV P3,#0FFH
;== 改写200H---3FFH的 EEPROM
MOV R1,#5
WQ3: JB GNAN,QQ1
CALL T2MS
DJNZ R1,WQ3
JNB GNAN,$
;====读==200H---3FFH的 EEPROM
MOV 0C3H,#200H
MOV 0C4H,#3FFH
MOV 0C7H,#10000000B
MOV 0C5H,#1
MOV 0C6H,#5AH
MOV 0C6H,#0A5H
NOP
MOV A,0C2H
NOP
BD: CALL ADXS
MOV A,02CH
;===按下按钮A数据加1
;这里有个调数据的程序
;===
Q2: MOV 02CH,A
JB GNAN,BD
CALL T2MS
JB GNAN,BD
JNB GNAN,$
;===擦除===200H-3FFH==EEPROM
MOV 0C3H,#200H
MOV 0C4H,#3FFH
MOV 0C7H,#10000000B
MOV 0C5H,#3
MOV 0C6H,#5AH
MOV 0C6H,#0A5H
NOP
;==写入===200H-3FFH==EEPROM
MOV A,0C2H
MOV 0C3H,#200H
MOV 0C4H,#3FFH
MOV 0C7H,#10000000B
MOV 0C5H,#2
MOV 0C6H,#5AH
MOV 0C6H,#0A5H
NOP
JMP QQ
QQ1: ;====改写0000H---1FFH的 EEPROM
我就是把
MOV 0C3H,#200H
MOV 0C4H,#3FFH
改成
MOV 0C3H,#0000H
MOV 0C4H,#1FFH 展开
2个回答
展开全部
;====读==200H---3FFH的 EEPROM
MOV 0C3H,#200H----这立即数,是多少位的?
MOV 0C4H,#3FFH----这立即数,是多少位的?
MOV 0C3H,#200H----这立即数,是多少位的?
MOV 0C4H,#3FFH----这立即数,是多少位的?
追问
你好,请问能详细说说我错在那里吗,我感觉好像也是这里出来问题,但我是抄说明书的,
追答
STC说明书的链接如下:
http://www.stcmcu.com/datasheet/stc/STC-NEW-SOURCE-CODE/STC_IAP_EEPROM.asm
-------------
====读==200H---3FFH的 EEPROM
读出这么多?
要知道,每次,只能读一个字节。
比如读出 200H中的内容:
MOV 0C3H,#02H
MOV 0C4H,#00H
……
比如读出 201H中的内容:
MOV 0C3H,#02H
MOV 0C4H,#01H
……
比如读出 3FFH中的内容:
MOV 0C3H,#03H
MOV 0C4H,#0FFH
……
C3、C4中,应该是同一个地址的高低八位。
而你写的:
MOV 0C3H,#200H----这立即数,是多少位的?
MOV 0C4H,#3FFH----这立即数,是多少位的?
你这是把C3、C4,写成了起始、末尾两个地址。
展开全部
STC的EEPROM不能随便擦写,最小擦除(格式化)单位是扇区,以下是我编写的一段供参考:
;-------------------写参数到EEROM-----------------------------
PARAPUT:
MOV DPTR,#0000H
LCALL IAP_Erase
MOV DPTR,#0000H
MOV R0,#60H
MOV R1,#16
PARAPUT1:
MOV A,@R0
LCALL IAP_WRITE
INC R0
INC DPTR
DJNZ R1,PARAPUT1
RET
;-------------------从EEROM中读出参数-----------------------------
PARAGET:
MOV DPTR,#0000H
MOV R0,#60H
MOV R1,#16
PARAGET1:
LCALL IAP_READ
MOV @R0,A
INC R0
INC DPTR
DJNZ R1,PARAGET1
RET
;------------------------------------------------
;读一字节,调用前需打开 IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
IAP_READ:
MOV IAP_CONTR,#ENABLE_IAP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV IAP_CMD,#ISP_IAP_BYTE_READ ;设置为IAP/ISP/EEPROM字节读模式命令
MOV IAP_ADDRH,DPH ;设置目标单元地址的高8位地址
MOV IAP_ADDRL,DPL ;设置目标单元地址的低8位地址
;CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被触发起动
NOP
MOV A,IAP_DATA ;读出的数据在IAP_DATA单元中,送入累加器A
;SETB EA
LCALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
;一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关
RET
;------------------------------------------------
;字节编程,调用前需打开 IAP 功能,入口:DPTR = 字节地址, A=须编程字节的数据
IAP_WRITE:
MOV IAP_CONTR,#ENABLE_IAP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV IAP_CMD,#ISP_IAP_BYTE_PROGRAM ;设置为IAP/ISP/EEPROM字节编程模式命令
MOV IAP_ADDRH,DPH ;设置目标单元地址的高8位地址
MOV IAP_ADDRL,DPL ;设置目标单元地址的低8位地址
MOV IAP_DATA,A ;要编程的数据先送进ISP_DATA寄存器
;CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被触发起动
NOP
;SETB EA
LCALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
;一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关
RET
;------------------------------------------------
;擦除扇区, 入口:DPTR = 扇区地址
IAP_Erase:
MOV IAP_CONTR,#ENABLE_IAP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV IAP_CMD,#03H ;设置为IAP/ISP/EEPROM扇区擦除模式命令
MOV IAP_ADDRH,DPH ;设置目标单元地址的高8位地址
MOV IAP_ADDRL,DPL ;设置目标单元地址的低8位地址
;CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被触发起动
NOP
;SETB EA
LCALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
;一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关
RET
;------------------------------------------------
IAP_Disable:
;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
;一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关
MOV IAP_CONTR,#0 ;关闭 IAP 功能
MOV IAP_CMD,#0 ;清命令寄存器,使命令寄存器无命令,此句可不用
MOV IAP_TRIG,#0 ;清命令触发寄存器,使命令触发寄存器无触发,此句可不用
MOV IAP_ADDRH,#0FFH ;送地址高字节单元为00,指向非EEPROM区
MOV IAP_ADDRL,#0FFH ;送地址低字节单元为00,防止误操作
RET
;-------------------写参数到EEROM-----------------------------
PARAPUT:
MOV DPTR,#0000H
LCALL IAP_Erase
MOV DPTR,#0000H
MOV R0,#60H
MOV R1,#16
PARAPUT1:
MOV A,@R0
LCALL IAP_WRITE
INC R0
INC DPTR
DJNZ R1,PARAPUT1
RET
;-------------------从EEROM中读出参数-----------------------------
PARAGET:
MOV DPTR,#0000H
MOV R0,#60H
MOV R1,#16
PARAGET1:
LCALL IAP_READ
MOV @R0,A
INC R0
INC DPTR
DJNZ R1,PARAGET1
RET
;------------------------------------------------
;读一字节,调用前需打开 IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
IAP_READ:
MOV IAP_CONTR,#ENABLE_IAP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV IAP_CMD,#ISP_IAP_BYTE_READ ;设置为IAP/ISP/EEPROM字节读模式命令
MOV IAP_ADDRH,DPH ;设置目标单元地址的高8位地址
MOV IAP_ADDRL,DPL ;设置目标单元地址的低8位地址
;CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被触发起动
NOP
MOV A,IAP_DATA ;读出的数据在IAP_DATA单元中,送入累加器A
;SETB EA
LCALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
;一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关
RET
;------------------------------------------------
;字节编程,调用前需打开 IAP 功能,入口:DPTR = 字节地址, A=须编程字节的数据
IAP_WRITE:
MOV IAP_CONTR,#ENABLE_IAP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV IAP_CMD,#ISP_IAP_BYTE_PROGRAM ;设置为IAP/ISP/EEPROM字节编程模式命令
MOV IAP_ADDRH,DPH ;设置目标单元地址的高8位地址
MOV IAP_ADDRL,DPL ;设置目标单元地址的低8位地址
MOV IAP_DATA,A ;要编程的数据先送进ISP_DATA寄存器
;CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被触发起动
NOP
;SETB EA
LCALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
;一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关
RET
;------------------------------------------------
;擦除扇区, 入口:DPTR = 扇区地址
IAP_Erase:
MOV IAP_CONTR,#ENABLE_IAP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV IAP_CMD,#03H ;设置为IAP/ISP/EEPROM扇区擦除模式命令
MOV IAP_ADDRH,DPH ;设置目标单元地址的高8位地址
MOV IAP_ADDRL,DPL ;设置目标单元地址的低8位地址
;CLR EA
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被触发起动
NOP
;SETB EA
LCALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
;一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关
RET
;------------------------------------------------
IAP_Disable:
;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
;一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关
MOV IAP_CONTR,#0 ;关闭 IAP 功能
MOV IAP_CMD,#0 ;清命令寄存器,使命令寄存器无命令,此句可不用
MOV IAP_TRIG,#0 ;清命令触发寄存器,使命令触发寄存器无触发,此句可不用
MOV IAP_ADDRH,#0FFH ;送地址高字节单元为00,指向非EEPROM区
MOV IAP_ADDRL,#0FFH ;送地址低字节单元为00,防止误操作
RET
追问
你好,你读、擦除、写、这些和说明书里是一样的,就是上面2个程序你是不一样的,但我看不出来为什么要怎么写。
请问你第一个程序和第二个程序是什么作用?
请问设置目标单元地址的高8位地址,设置目标单元地址的低8位地址,这个是写200H,3FFH吗?
能说说我是那里出错误,所以导致写一个扇区的时候,把另外的一个扇区也写了,为什么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询