?? i2c(2).c
字號:
ORG ×××× ;程序開始地址。
SCL EQU P1.1 ;選擇P1.1作時鐘線。
SDA EQU P1.0 ;選擇P1.0作數據線。
功能:WRITE是寫入程序。將R1指示的R7個片內字節寫入AT24C02中,寫入首址由R0指示。
WRITE:ACALL STAR ;發出起始信號。
MOV A,#0A0H ;發出寫命令。
ACALL OUTB
JC WBE ;無回答,結束操作。
MOV A,R0 ;發出E2PROM首址。
ACALL OUTB
JC WBE ;無回答,結束操作。
WR1: MOV A,@R1 ;取一字節內容。
ACALL OUTB ;寫入E2PROM中。
JC WBE ;無回答,結束操作。
INC R1 ;指向下一字節。
DJNZ R7,WR1 ;寫完全部字節。
WBE: AJMP STOP ;發出結束信號。
功能:READ是讀出程序。將R1指示的R7個E2PROM字節讀入片內RAM中,首址由R0指示。
READ: ACALL STAR ;發出起始信號。
MOV A,#0A0H ;發出寫命令。
ACALL OUTB
JC RDE ;無回答,結束操作。
MOV A,R1 ;發出E2PROM首址。
ACALL OUTB
JC RDE ;無回答,結束操作。
ACALL STOP ;發出結束信號。
NOP ;延時。
NOP
ACALL STAR ;再次發出起始信號。
MOV A,#0A1H ;發出讀命令。
ACALL OUTB
JC RDE ;無回答,結束操作。
RD1: MOV B,#08H ;每移出8位組成一字節。
RD2: CLR SCL ;移出一個時鐘脈沖。
NOP
SETB SCL ;時鐘脈沖上升沿。
NOP
MOV C,SDA ;讀入一位。
RLC A ;拼裝到累加器中。
NOP
DJNZ B,RD2 ;拼完一字節。
MOV @R0,A ;存入片內。
INC R0 ;指向下一地址。
CLR SCL ;時鐘脈沖下降沿。
CJNE R7,#1,RD3 ;是最后一個字節嗎?
SETB SDA ;最后一個字節不給回答信號。
SJMP RD4
RD3: CLR SDA ;準備好回答信號。
RD4: NOP
SETB SCL ;時鐘脈沖上升沿。
NOP ;等待E2PROM讀取回答信號
NOP
CLR SCL ;回答完畢。
SETB SDA ;準備讀入下一字節。
DJNZ R7,RD1 ;讀完全部字節。
CLR C
RDE: AJMP STOP ;發出結束信號。
功能:OUTB是向E2PROM發出一字節信息的子程序。
OUTB: MOV B,#08H ;一字節8位。
OUT1: CLR SCL ;將時鐘線拉低。
RLC A ;移出一位。
MOV SDA,C ;放到數據線上。
SETB SCL ;將時鐘線升高。
NOP ;等待一位信息送入E2PROM中。
DJNZ B,OUT1 ;發送完8位。
CLR SCL ;將時鐘線拉低。
SETB SDA ;準備接收回答信號。
SETB SCL ;將時鐘線升高。
NOPMOV C,SDA ;接收回答信號。
CLR SCL ;將時鐘線拉低。
RET
功能:STAR是起始信號。
STAR: SETB SDA ;將數據線升高。
SETB SCL ;將時鐘線升高。
NOP ;延時。
CLR SDA ;將數據線拉低,發出起始信號。
NOP ;延時。
CLR SCL ;將時鐘線拉低。
RET
功能:STOP是結束信號。
STOP: CLR SCL ;將時鐘線拉低。
CLR SDA ;將數據線拉低。
NOP
SETB SCL ;將時鐘線升高。
NOP
SETB SDA ;將數據線升高,發出結束信號。
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -