aduc单片机数据存储

发布网友 发布时间:2022-04-22 23:06

我来回答

2个回答

热心网友 时间:2023-07-11 10:12

这个是ADI的源代码,你可以到http://www.analog.com/zh/analog-microcontrollers/ac843/procts/code-examples/resources.html?display=popup
下载 里面有一个FlashEE文件夹
;********************************************************************
;
; Author : ADI - Apps www.analog.com/MicroConverter
;
; Date : October 2003
;
; File : dataflsh.asm
;
; Hardware : ADuC842/ADuC843
;
; Description : Demonstrates use of the on-chip read/write 4096 byte
; FlashEE data memory space. Stores a sequence of
; button presses (INT0 button on eval board) in data
; FlashEE space. Replays sequence on LED when board
; is reset or power cycled.
; The ADuC842 stores the play sequece in data flash
; until another is recorded with a new set of button
; presses. To record a new sequence, just wait until
; the current one finishes playing (LED is off) and
; enter new sequence via button (INT0).
;
;********************************************************************

$MOD842 ; Use 8052&ADuC842 predefined symbols

LED EQU P3.4 ; P3.4 drives red LED on eval board
BUTTON EQU P3.2 ; button on eval board drives P3.2
PREVIOUS EQU F0 ; flag to hold previous button value
READ EQU 01h ; FlashEE command: 'read page'
WRITE EQU 02h ; FlashEE command: 'write page'
VERIFY EQU 04h ; FlashEE command: 'verify page'
ERASE EQU 05h ; FlashEE command: 'erase page'
ERASEALL EQU 06h ; FlashEE command: 'erase all'
;--------------------------------------------------------------------
;____________________________________________________________________
; BEGINNING OF CODE
CSEG

ORG 0000h

MAIN:
CLR LED ; turn LED off
MOV EADRH,#0 ; set data FlashEE address to page 0
MOV EADRL,#0

; READ FLASH/EE DATA and indicate values via LED on and off times...

READFLASH:
MOV ECON,#READ ; read current 4byte page of FlashEE
; into EDATA1,2,3,4
MOV A,EDATA4
CJNE A,#1,RECORD ; if EDATA4 is 1, then page contains
; a valid play sequence
; => Play this sequence
; otherwise jump to record mode

;--------------------------------------------------------------------
PLAYBACK:
CALL BLINK ; flash LED for period determined
; by FlashEE data just read
MOV A,EADRL
CJNE A,#0FFh,INCPAGE1 ; if low address is FFh then increment high address
INC EADRH
INCPAGE1:
INC EADRL ; increment to next FlashEE page addr
MOV A,EADRH
CJNE A,#04h,READFLASH
; if address is less than 160 then jump
; to read the next page
; when PLAYBACK is finished jump to RECORD mode

;--------------------------------------------------------------------
RECORD:
CLR LED
JB BUTTON,$ ; wait for first button press

; once button is pressed, erase dataflash
MOV ECON,#ERASEALL ; clear all data FlashEE memory
MOV EADRH,#0
MOV EADRL,#0

; record time of button press

RECORD_NEXT_TIME:
CALL RECORDTIME

MOV EDATA1,DPL ; place DPTR in EDATA1,2,3
MOV EDATA2,DPH
MOV EDATA3,DPP
MOV EDATA4,#1 ; put 1 in EDATA4 as identifier
MOV ECON,#WRITE ; write EDATA1-4 into pre-erased
; page of FlashEE data memory

MOV ECON,#VERIFY ; verify current page is same as
MOV A,ECON ; EDATA1-4. If same, ECON=0.
JNZ RECORD ; if verify fails, jump to RECORD

MOV A,EADRL
CJNE A,#0FFh,INCPAGE2 ; if low address is FFh then increment high address
INC EADRH
INCPAGE2:
INC EADRL ; increment to next FlashEE page addr
MOV A,EADRH
CJNE A,#04h,RECORD_NEXT_TIME
; record first 160 button presses only

; when flash/EE data space is full turn off LED and wait
; for a power cycle
CLR LED
JMP $

;====================================================================
; FUNCTIONS
;====================================================================

;____________________________________________________________________
; SUBROUTINES
BLINK:
; Turn LED ON/OFF based on the time in EDATA3/2/1
CPL LED

CLR A
MOV DPL,A
MOV DPH,A ; clear DPTR
MOV DPP,A

INC EDATA1 ; EDATA1 -> EDATA3 should be
INC EDATA2 ; incremented for the below to work
INC EDATA3

BLINKLOOP:
; the record loop takes 11 instruction cycles hence 7 NOPs are
; required to make the Playback loop 11 instruction cycles also.
; NOTE: the main Playback loop will jump to BLINKLOOP after
; decrementing EDATA1 and hence the time required to decrement
; EDATA2 (approx 1/256 time of main loop) and EDATA3 are ignored.
NOP ; 1
NOP ; 1
NOP ; 1
NOP ; 1
NOP ; 1
NOP ; 1
NOP ; 1
DJNZ EDATA1, BLINKLOOP ; 4
DJNZ EDATA2, BLINKLOOP ; EDATA1 overflows back to FFh
DJNZ EDATA3, BLINKLOOP ; EDATA2 overflows back to FFh

RET

;____________________________________________________________________

RECORDTIME:
; Record how long button is pressed for and store in EDATA3/2/1
CLR A
MOV DPL,A
MOV DPH,A ; clear DPTR
MOV DPP,A

CPL LED

; measure how long the button is either pressed or released
; for. If the button is pressed then the LED is on. If the
; button is released then the LED is off.
RECORDLOOP:
INC DPTR ; incrementing DPTR.. ; 3
JNB LED, CHKB ; 4
JNB BUTTON,RECORDLOOP ; 4
; keep recording while button is pressed
RET
CHKB: JB BUTTON,RECORDLOOP ; 4
; keep recording while button is released
RET

; DPP,DPH,DPL now holds a number that represents the length of
; time between button edges. this data will be stored in FlashEE
; space for use in controlling LED on and off times in "play" mode.

;____________________________________________________________________

END

热心网友 时间:2023-07-11 10:13

好深奥。。。不懂。。。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com