?? 24c02.asm
字號:
;******************************************************************
;******************** WWW.QLMCU.COM **********************
;***************** AT24C02串行E2PROM的讀寫實驗 ******************
;********************** FOSC= 11.0592MHz ********************
;******************** design by benladn911 ************************
;*********************** 2005/05/05 ***************************
;****************** Email:lanbing51@126.com *********************
;!!!!!!!!!!!!!!!!!!!!!!!!!讀寫操作成功!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;AT24C02的1、2、3腳是三條地址線,用于確定芯片的硬件地址。在AT89C51試驗開發板上它們都接地,
;第 8 腳和第 4 腳分別為正、負電源。
;第 5 腳SDA為串行數據輸入/輸出,數據通過這條雙向I2C總線串行傳送,在實驗開發板上和單片機的 P2.7 連接。
;第 6 腳SCL為串行時鐘輸入線,在實驗開發板上和單片機的 P3.6 連接。
;SDA和SCL都需要和正電源間各接一個 4.7K 的電阻上拉。第 7 腳需要接地。
;程序中多處調用了DELAY子程序(僅兩條NOP指令),這是為了滿足I2C總線上數據傳送速率的要求,
;只有當SDA數據線上的數據穩定下來之后才能進行讀寫(即SCL線發出正脈沖)。
;另外,在讀最后一數據字節時,置應答信號為“1”,表示讀操作即將完成。
;AT24系列EEPROM在開始狀態后需緊接一個8位器件地址,以進行應讀寫操作。
;設備尋址碼的高4位為1、0、1、0,對于AT24C01/02,尋址碼高4位后面的三位是器件尋址碼,
;與它們的硬連線管腳相對應。最低應是讀寫選擇位即方向位(R/W)。
;(R/W)為“0”表示發送,即主器件把信息寫到所選擇的從器件;
;(R/W)為“1”表示主器件將從從器件讀信息。
;具體的格式如下:
;1010 A2 A1 A0 R/W
; 1010 0000B-----寫卡器件地址 !!!!!!!!!!!!!!!!!!!!
; 1010 0001B-----讀卡器件地址 !!!!!!!!!!!!!!!!!!!!
; 24C02中帶有片內地址寄存器,每寫入或讀出一個數據字節后,該地址寄存器自動加1 !!!!!!!!!!
; 以實現對下一個存儲單元的讀寫,所有字節均以單一操作方式讀取
; 為降低總的寫入時間, 一次操作可寫入多達 8 個字節的數據!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; AT24C01/02的頁面為 8 字節!!!
; AT24C04/08/16的頁面為 16 字節!!!
;************************************************************************************
;***************************字節寫入模式寫數據(WRITE_BYTE)
;************下列程序中的參數為:R6= =目的地址,A= =數據;數據如下:
;*********************************************************************操作成功!!!
SCL EQU P3.6
SDA EQU P2.7 ;端口定義
ORG 0000H
LJMP START
ORG 0100H
START:
MOV DPTR,#TAB
MOV R6,#00H ;寫入字節地址的設置
LCALL XXX ;寫入第一頁(8個字節的數據,24C01/02一次最多只能寫 8 個字節!!!)
LCALL DELAY ;調用大概 1mS 延時,此延時程序非常必要!!!
LCALL DELAY
LCALL DELAY
LCALL DELAY
;----------------------READ THE FIRST BYTE--------------
RRRR: MOV R1,#00H ;THE FIRST BYTE'S ADDRESS
LCALL DDD
LCALL DELAY
LCALL DELAY
CLR P3.7 ;***選通LED的公共端
MOV P0,80H
LCALL DELAY1
;----------------------READ THE SECOND BYTE-------------
LOOPPP:INC R1 ;THE SECOND BYTE'S ADDRESS
LCALL DDD
LCALL DELAY
LCALL DELAY
CLR P3.7 ;***選通LED的公共端
MOV P0,80H
LCALL DELAY1
MOV R1,#00H
LJMP RRRR
;--------------------------------寫入數據//2005.05.05
XXX:
MOV P1,#0FFH
MOV A,#00H
PUSH ACC ;保存A中的數據
LCALL START_IC ;發開始信號
MOV A,#0A0H ;寫入器件地址設置為 A0H
LCALL WR_BYTE
MOV A,R6 ;寫入字節地址
LCALL WR_BYTE
POP ACC ;恢復A中數據
LCALL WRITE_BYTE ;寫入第一頁的數據
LCALL STOP_IC
RET
;--------------------------------讀取一個數據//2005.06.27// OK!!!
DDD:
MOV A,#00H
PUSH ACC ;保存A中的數據
LCALL START_IC ;發開始信號
MOV A,#0A0H ;寫入器件地址,表示選中該器件
LCALL WR_BYTE
MOV A,R1 ;寫入字節地址---------------地址設置!!!!!!!
LCALL WR_BYTE
POP ACC ;恢復A中數據
MOV P2,#0FFH
MOV P3,#0FFH
LCALL START_IC
MOV A,#0A1H ;*****讀器件時地址必須設置為 A1H !!!!!
LCALL WR_BYTE
LCALL RD_BYTE ;讀出第一個字節
MOV 80H,A
NOP
NOP
LCALL STOP_IC
RET
;---------------------------------------------------------------------
WRITE_BYTE: ;字節寫入模式寫數據(WRITE_BYTE)
MOV R7,#08 ;欲寫入數據個數的設定,一次最多只能寫入 8 各字節的數據(對24C01/02而言!!!!)
LOOP: MOV A,#00H
MOVC A,@A+DPTR
LCALL WR_BYTE ;寫入數據
INC R6 ;增加字節地址!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
INC DPTR
DJNZ R7,LOOP
RET
;----------------------------------------------------------------------
;*******************************************************************************
;*********************************以下為各功能子程序****************************
;*******************************************************************************
;-------------------------------------------------------------------
;-----------------------------開始條件------------------------------
START_IC:
CLR SCL ; SCL低電平時才允許SDA更改
NOP ;加入空指令延時以確保信號可靠
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
NOP
RET
;----------------------------------------------------------------------------------
;-------------------寫一字節數據到EEPROM,程序中已包含應答子程序!!!-----------------
;----------------------------------------------------------------------------------
WR_BYTE:
MOV R5,#08 ;一字節8位數據
CLR SCL
NOP
NOP
WR_BYTE1:RLC A ;帶進位位左移,A.8->C
MOV SDA,C ; SCL低電平時改變SDA上的數據
NOP
SETB SCL ;拉高SCL把數據發送出去
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R5,WR_BYTE1; 依次發送A中的8位數據
SETB SDA
SETB SCL
JB SDA,$ ; 等待IC卡確認信號
CLR SCL
NOP
nop
RET
;---------------------------------------------------------------------------
;--------------------------從EEPROM讀一字節(RD_BYTE)//2005.06.27 ---------
;---------------------------------------------------------------------------
RD_BYTE:
MOV R5,#08
SETB SDA;設備SDA為讀狀態
CLR A;清空A寄存器
RD_BYTE1:
MOV C,SDA;讀一位數據到進位位
RLC A;左移數據到A.0
SETB SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R5,RD_BYTE1;依次讀出8位數據到A中
RET;無應答信號
;利用該程序可將讀出的數據存放在A中。需要注意的是:讀數據的器件不是通過確認狀態來應答的,
;而是隨后產生一個停止狀態。
;-----------------------------------------------------------------------
;------------------------------------停止條件
STOP_IC:
CLR SCL
NOP
NOP
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SCL
NOP
NOP
CLR SDA
RET
;-------------------------------------------------------------------------
TAB:
DB 01H,02H,04H,08H,05H,06H,07H,08H
;-------------------------------------------------------------------------
DELAY: MOV R4,#2;延時程序,延時1000微秒= 1mS FOSC=6MHz
DD3:MOV R5,#124
DJNZ R5,$
DJNZ R4,DD3
RET
DELAY1: MOV R4,#10H ;一秒延遲子程序
DELAY11:MOV R5,#255
DELAY41:MOV R6,#0FFH
DJNZ R6,$
DJNZ R5,DELAY41
DJNZ R4,DELAY11
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -