?? wl007.asm
字號(hào):
;********************************************************************************
;* 標(biāo)題: ME300系列單片機(jī)開發(fā)系統(tǒng)演示程序 - AT24C02讀寫演示程序 *
;* 硬件: ME300A+ *
;* 文件: wl007.asm *
;* 日期: 2004-1-5 *
;* 版本: 1.0 *
;* 作者: 偉納電子 - Freeman *
;* 郵箱: freeman@willar.com *
;* 網(wǎng)站: http://www.willar.com *
;********************************************************************************
;* 描述: *
;* AT24C02讀寫演示程序 *
;* *
;********************************************************************************
;* 跳線設(shè)置: *
;* JP1 全部短接,JP2短接2-3端 *
;* *
;********************************************************************************
;* 【版權(quán)】 Copyright(C)偉納電子 www.willar.com All Rights Reserved *
;* 【聲明】 此程序僅用于學(xué)習(xí)與參考,引用請(qǐng)注明版權(quán)和作者信息! *
;********************************************************************************
NAME WL007
OP_READ EQU 0xa1 ; 器件地址以及讀取操作
OP_WRITE EQU 0xa0 ; 器件地址以及寫入操作
MAX_ADDR EQU 0x7f ; AT24C02最大地址
CODE_SEG SEGMENT CODE
DATA_SEG SEGMENT DATA
STACK_SEG SEGMENT IDATA
RSEG DATA_SEG
ADDR: DS 1
TMP2: DS 1
TMP3: DS 1
RSEG STACK_SEG
STACK: DS 20
SCL BIT P3.3
SDA BIT P1.3
;===============================================================================
CSEG AT 0000H ; 復(fù)位向量
JMP MAIN
;===============================================================================
RSEG CODE_SEG
MAIN:
; 主程序開始
USING 0
MOV SP, #(STACK-1) ; 設(shè)置堆棧
SETB SDA
SETB SCL
MOV R7,#05AH ; 全部填充0xff
LCALL FILL_BYTE
CLR A
MOV ADDR,A
MAIN_LP1: ; 將表格DIS_CODE內(nèi)數(shù)據(jù)寫入到EEPROM
MOV A,ADDR
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR ; 查表
MOV R5,A ; 數(shù)據(jù)到R5
MOV R7,ADDR ; 地址到R7
LCALL WRITE_BYTE
INC ADDR ; 地址加1
MOV A,ADDR
CLR C
SUBB A,#08H ; 共8字節(jié),判斷是否完成
JC MAIN_LP1 ;
CLR A ;
MOV ADDR,A ;
MAIN_LP2: ; 循環(huán)讀取AT24C02內(nèi)容,并輸出到P0口
MOV R7,ADDR ; 地址到R7
LCALL READ_RANDOM
MOV P0,R7 ; 將讀取的數(shù)據(jù)傳送到P0
INC ADDR ; 地址加1
ANL ADDR,#07H ; 循環(huán)讀取范圍為0x00~0x07
MOV R7,#0FAH ; delay
LCALL DELAYMS
SJMP MAIN_LP2
; END OF MAIN
;===============================================================================
RSEG CODE_SEG
START:
; 開始位
; 傳入?yún)?shù): 無
; 返回值:無
SETB SDA
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
; END OF START
;===============================================================================
RSEG CODE_SEG
STOP:
; 停止位
; 傳入?yún)?shù): 無
; 返回值:無
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
RET
; END OF STOP
;===============================================================================
RSEG CODE_SEG
SHIN:
; 從AT24Cxx移入數(shù)據(jù)到MCU
; 傳入?yún)?shù): 無
; 返回值:R7 --- 移出的數(shù)據(jù)
USING 0
CLR A
MOV R6,A
SHIN_LP:
SETB SCL
MOV A,R7
ADD A,ACC
MOV R7,A
MOV C,SDA
CLR A
RLC A
ORL AR7,A
CLR SCL
INC R6
CJNE R6,#08H,SHIN_LP ; 共8位,判斷是否完成
RET
; END OF SHIN
;===============================================================================
RSEG CODE_SEG
SHOUT:
; 從MCU移出數(shù)據(jù)到AT24Cxx
; 傳入?yún)?shù): R7 --- 要移出的數(shù)據(jù)
; 返回值:C --- AT24Cxx的應(yīng)答位
USING 0
CLR A
MOV R6,A
SHOUT_LP: ; 循環(huán)移入8個(gè)位
MOV A,R7
RLC A
MOV SDA,C
NOP
SETB SCL
NOP
NOP
CLR SCL
MOV A,R7
ADD A,ACC
MOV R7,A
INC R6
CJNE R6,#08H,SHOUT_LP ; 共8位,判斷是否完成
SETB SDA ; 讀取應(yīng)答
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA ; 保存應(yīng)答位到C
CLR SCL
RET
; END OF SHOUT
;===============================================================================
RSEG CODE_SEG
WRITE_BYTE:
; 在指定地址寫入數(shù)據(jù)
; 傳入?yún)?shù): R7 --- 寫入數(shù)據(jù)的地址
; 傳入?yún)?shù): R5 --- 要寫入的數(shù)據(jù)
; 返回值:無
USING 0
MOV R4,AR7
LCALL START
MOV R7,#OP_WRITE ; 寫入器件地址和寫命令
LCALL SHOUT
MOV R7,AR4 ; 地址
LCALL SHOUT
MOV R7,AR5 ; 數(shù)據(jù)
LCALL SHOUT
LCALL STOP
MOV R7,#10 ; 寫入周期, 延時(shí)10ms
LJMP DELAYMS
; END OF WRITE_BYTE
;===============================================================================
RSEG CODE_SEG
FILL_BYTE:
; 填充數(shù)據(jù)到EEPROM內(nèi)
; 傳入?yún)?shù): R7 --- 要填充的數(shù)據(jù)
; 返回值:無
USING 0
MOV TMP3,R7
CLR A
MOV TMP2,A
FILL_LP:
MOV R5,TMP3
MOV R7,TMP2
LCALL WRITE_BYTE
INC TMP2
MOV A,TMP2
CLR C
SUBB A,#07FH
JC FILL_LP
; END OF FILL_BYTE
;===============================================================================
RSEG CODE_SEG
READ_CURRENT:
; 在當(dāng)前地址讀取
; 傳入?yún)?shù):無
; 返回值:R7 --- 讀出的數(shù)據(jù)
USING 0
LCALL START
MOV R7,#OP_READ ; 寫入器件地址和讀取命令
LCALL SHOUT
LCALL SHIN ; 讀取數(shù)據(jù),保存在R7
LCALL STOP
RET
; END OF read_current
;===============================================================================
RSEG CODE_SEG
READ_RANDOM:
; 在指定地址讀取
; 傳入?yún)?shù):R7 --- 地址
; 返回值:R7 --- 讀出的數(shù)據(jù)
USING 0
MOV R5,AR7 ; 暫存地址
LCALL START
MOV R7,#OP_WRITE ; 寫入器件地址和寫入命令
LCALL SHOUT
MOV R7,AR5 ; 寫入地址
LCALL SHOUT
LCALL READ_CURRENT ; 在當(dāng)前地址讀取
RET
; END OF READ_RANDOM
;===============================================================================
RSEG CODE_SEG
DELAYMS:
; 延時(shí)子程序
; 傳入?yún)?shù):R7 --- 延時(shí)值(MS)
; 返回值:無
MOV A,R7
JZ END_DLYMS
DLY_LP1:
MOV R6,#185
DLY_LP2:
NOP
NOP
NOP
DJNZ R6,DLY_LP2
DJNZ R7,DLY_LP1
END_DLYMS:
RET
; END OF DELAYMS
;===============================================================================
RSEG CODE_SEG
DIS_CODE:
; 寫入到AT24C02的數(shù)據(jù)串
DB 07EH
DB 0BDH
DB 0DBH
DB 0E7H
DB 0DBH
DB 0BDH
DB 07EH
DB 0FFH
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -