?? file15.asm
字號:
;AT24C04 讀寫程序
;2404 是一個4KB的EEPROM,具有1,000,000次擦寫周期,數據保存100年不變,非揮發性存
;介質,I2C總線形式,頁面存儲方式,能方便地讀寫數據,數據保存安全可靠。
;本程序主要為AT24C04的讀寫程序,具有單字節讀、寫;多字節連續讀、寫等方式
;程序下載以后,經過一段時間的操作以后,會在led上顯示"H"對應的二進制結果(48H)
BEEP BIT P3.7 ;蜂鳴器定義
MDIO BIT P2.3 ;EEPROM數據輸入輸出口
MCLK BIT P2.4 ;EEPROM時鐘口線
MEM_R1 EQU 0BH ;延時寄存器1
MEM_R2 EQU 0CH ;延時寄存器2
WP BIT P2.4 ;EEPROM寫保護,高電平保護
DATA_A EQU 20H ;地址緩沖區
ORG 00H ;程序開始
JMP MAIN ;主程序
ORG 30H ;主程序開始 30H
MAIN: MOV SP,#30H ;設置堆棧
LCALL REST ;初始化
MOV DATA_A,#00H ;數據在AT24C04中的首地址
MOV R1,#0 ;待存數據首地址
MOV R0,#255 ;需要存儲的數據數量
LP: MOV A,R1 ;獲得首地址
MOV DPTR,#TAB ;查數據表
MOVC A,@A+DPTR ;得到數據
JZ LPE ;如果為0返回
MOV B,A ;寄存
MOV DPH,DATA_A ;數據在AT24C04中的地址
Lcall wt_mem ;寫入一個字節數據
INC DATA_A ;準備下一個地址
INC R1 ;準備下一個數據
JMP LP ;重復寫入
LPE: MOV DPH,#00H ;要讀取的數據地址
MOV B,#00H ;寄存器清零
LCALL RD_MEM ;讀取數據從AT24C04
MOV P1,B ;數據從P1口反映出來
JMP $ ;停止
REST: ;初始化
CLR WP ;清除寫保護
CLR MCLK ;時鐘為低
CLR MDIO ;數據為低
MOV P0,#00H ;禁止數碼管顯示
CLR BEEP ;禁止蜂鳴器
RET
;**************** AT24C04 操作程序 ****************
WT_MEM: ;寫入的地址在DPH中,數據在B中
ACALL MEM_START ;給AT24C04開始信號
MOV A,#0A0H ;"寫"命令字+片選地址信息
ACALL WR1 ;寫入以上信息
ACALL ACK
MWRITE2:
MOV A,DPH ;準備寫入片內地址信息
ACALL WR1 ;寫入
ACALL ACK
MOV A,B ;準備數據
ACALL WR1 ;寫入數據
ACALL ACK
ACALL MEM_STOP ;發送停止信號,
;如果要重復寫,可以不發結束信號,
;返回MWRITE2繼續寫下一個數據
;寫完后發送結束信號。
RET ;返回,一個字節寫結束
;********** AT24CXX 讀字節程序 ***************************
; 要讀入的地址信息在DPH中,返回的讀取數據在B中
RD_MEM:
ACALL MEM_START ;發送開始信號
MOV A,#0A0H ;"寫"命令字+片選地址信號
ACALL WR1 ;寫入以上信息
ACALL ACK
MOV A,DPH ;準備片內信息
ACALL WR1 ;寫入片地址信息
ACALL ACK
ACALL MEM_START ;重復發送開始信號,這里和寫不同
MOV A,#0A1H ;準備命令字(讀)+片選地值
ACALL WR1 ;寫入以上信息
ACALL NAK
CLR A ;準備接收讀取的數據
MOV DPL,#08H ;數據位數
CLR MCLK ;時鐘為低
RD1: SETB MCLK ;時鐘上跳
NOP ;等待數據出現
LCALL MDELAY ;延時等待
MOV C,MDIO ;數據移入C
RLC A ;數據移入寄存器A
CLR MCLK ;時鐘下跳,準備讀取下一位數據
LCALL MDELAY
DJNZ DPL,RD1 ;沒有讀完則繼續,否則返回
MOV B,A ;數據送B
ACALL MEM_STOP ;發送結束信號
RET ;返回,
WR1: MOV MEM_R1,#08H ;寫入8個字節數
WR2: RLC A ;A帶進位左移
MOV MDIO,C ;數據輸出一位
SETB MCLK ;向AT24C04鎖存數據
ACALL MDELAY ;等待
CLR MCLK ;準備寫入下一個字節數據
ACALL MDELAY ;等待
DJNZ MEM_R1,WR2 ;沒有寫完,繼續
RET
;
WR4: CLR MDIO
LCALL MDELAY ;等待寫完8字節信息
SETB MCLK ;發送第9個時鐘作為應答信號
MOV C,MDIO
LCALL MDELAY ;等待,AT24C04應答信號
CLR MCLK ;完成,清除時鐘
RET ;返回
;發送應答
ACK: CLR MDIO
LCALL MDELAY ;等待寫完8字節信息
SETB MCLK ;發送第9個時鐘作為應答信號
MOV C,MDIO
LCALL MDELAY ;等待,AT24C04應答信號
CLR MCLK ;完成,清除時鐘
RET
;不發送應答
NAK: SETB MDIO
LCALL MDELAY ;等待寫完8字節信息
SETB MCLK ;發送第9個時鐘作為應答信號
MOV C,MDIO
LCALL MDELAY ;等待,AT24C04應答信號
CLR MCLK ;完成,清除時鐘
RET
;*********** 發送開始信號 ********************
;開始信號:在時鐘為高電平,數據線出現下跳;
MEM_START: SETB MDIO ;數據線高電平
SETB MCLK ;時鐘提高
NOP ;等待電平穩定
CLR MDIO ;數據下跳作為開始信號
ACALL MDELAY ;延時
CLR MCLK ;時鐘下跳
ACALL MDELAY ;等待一段時間
RET ;返回
;********** 發送停止信號 *********************
;停止信號:在時鐘為高電平,數據線出現上跳;
MEM_STOP: SETB MCLK ;時鐘線高
ACALL MDELAY ;等待電平穩定
SETB MDIO ;數據線高,停止信號
ACALL MDELAY ;等待
LCALL DELAY20MS ;寫周期延時
; LCALL DELAY20MS ;延時
RET ;返回
MDELAY: ;短時間延時
MOV MEM_R2,#04H
LOOP: NOP
DJNZ MEM_R2,LOOP
RET
DELAY20MS: ;20ms延時
MOV R5,#20
DELAY1: MOV R4,#00H
DELAY2: DJNZ R4,DELAY2
DJNZ R5,DELAY1
RET
; ************ 這張表格位要寫入AT24C04的數據 ***********************
; " HEJOIN "
; " LiZaoping"
; " ZHEJIANGHAIYAN"
; " HTTP://WWW.HEJOIN.COM"
; " Email:Hejoin@163.net"
TAB: DB 'H', 'E', 'J', 'O', 'I', 'N', 0AH
DB 'L', 'i', 'Z', 'a', 'o', 'p', 'i', 'n', 'g', 0AH
DB 'Z', 'H', 'E', 'J', 'I', 'A', 'N', 'G', 'H', 'A', 'I', 'Y', 'A', 'N',0AH
DB 'H', 'T', 'T', 'P', '/', '/', ':', 'W', 'W', 'W', '.', 'H', 'E', 'J', 'O', 'I', 'N', '.', 'C', 'O', 'M',0AH
DB 'E', 'm', 'a', 'i', 'l', ':', 'H', 'e', 'j', 'o', 'i', 'n', '@', '1', '6', '3', '.', 'n', 'e', 't',0AH
db 00h
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -