51單片機STC89C52 iic

SCL BIT P2.1 
SDA BIT P2.0
ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:
MOV SP,#30H
MOV P1,#0FFH ;滅LED
MOV R6,#2 ;R6保存AT24C02內部待寫地址,用於傳遞參數
MOV R7,#55H ;R7保存待寫數據,用於傳遞參數
LCALL iic_Write ;調用寫函數,將R7的數據寫入AT24C02 R6所指地址
LCALL DELAY10MS ;延時
MOV R6,#2 ;R6保存AT24C02內部待讀地址,用於給讀函數傳遞參數
LCALL iic_Read ;調用讀函數
MOV A,R7 ;將保存在R7內的讀取到的數據,送給累加器
CJNE A,#55H,MAINA0  ;比較讀回的數據是否跟寫入的一致
MOV P1,#0FH ;數據一致高4位LED亮
SJMP $
MAINA0:
MOV P1,#0F0H ;數據不一致低4位LED亮
MAINA1:
SJMP $

iic_Write: ;IIC寫函數,參數R6:地址,參數R7:數據
PUSH ACC 
CLR SCL	;START信號
SETB SDA
SETB SCL
CLR SDA
MOV A,#0A0H ;器件地址,寫方向
MOV R0,#08H
IIC1:
CLR SCL ;SDA只能在SCL爲低電平時可變
RLC A
JC IIC0
CLR SDA
SJMP IIC2
IIC0:
SETB SDA
IIC2:
SETB SCL ;上升沿到來,AT24C02將SDA數據鎖存
DJNZ R0,IIC1
CLR SCL ;允許SDA變化,等待ACK
SETB SDA ;釋放SDA,以檢測ACK
JB SDA,$ ;等待ACK
SETB SCL 
MOV A,R6 ;內部地址,寫方向
MOV R0,#8
IIC3:
CLR SCL
RLC A
JC IIC4
CLR SDA
SJMP IIC5
IIC4:
SETB SDA
IIC5:
SETB SCL
DJNZ R0,IIC3
CLR SCL ;檢測ACK
SETB SDA
JB SDA,$
SETB SCL
MOV A,R7 ;數據,寫方向
MOV R0,#8
IIC6:
CLR SCL
RLC A
JC IIC7
CLR SDA
SJMP IIC8
IIC7:
SETB SDA
IIC8:
SETB SCL
DJNZ R0,IIC6
CLR SCL	;檢測ACK
SETB SDA
JB SDA,$
SETB SCL
CLR SCL	;STOP信號
CLR SDA 
SETB SCL
SETB SDA
POP ACC
RET

iic_Read: ;IIC讀函數,參數R6:地址
PUSH ACC
CLR SCL ;START信號
SETB SDA
SETB SCL
CLR SDA
MOV A,#0A0H ;器件地址,寫方向 
MOV R0,#8
IIC10:
CLR SCL
RLC A
JC IIC00
CLR SDA
SJMP IIC20
IIC00:
SETB SDA
IIC20:
SETB SCL
DJNZ R0,IIC10
CLR SCL ;檢測ACK
SETB SDA
JB SDA,$
SETB SCL
MOV A,R6 ;內部地址,寫方向
MOV R0,#8
IIC30:
CLR SCL
RLC A
JC IIC40
CLR SDA
SJMP IIC50
IIC40:
SETB SDA
IIC50:
SETB SCL
DJNZ R0,IIC30
CLR SCL ;檢測ACK
SETB SDA
JB SDA,$
SETB SCL 
CLR SCL
SETB SDA ;重新發起始信號
SETB SCL
CLR SDA
MOV A,#0A1H ;器件地址,讀方向 
MOV R0,#8
IIC11:
CLR SCL
RLC A
JC IIC01
CLR SDA
SJMP IIC21
IIC01:
SETB SDA
IIC21:
SETB SCL
DJNZ R0,IIC11
CLR SCL ;檢測ACK
SETB SDA
JB SDA,$
SETB SCL  
MOV R0,#8
IICA2:
CLR SCL ;開始讀數據
SETB SDA
SETB SCL
NOP
JB SDA,IICA0
CLR C
SJMP IICA1
IICA0:
SETB C
IICA1:
RLC A
DJNZ R0,IICA2
MOV R7,A ;保存讀取數據
CLR SCL ;STOP信號
CLR SDA
SETB SCL
SETB SDA
POP ACC
RET

DELAY10MS:    ;延時 
SETB RS0
MOV R1,#10
DELAY1:
MOV R0,#250
DELAY0:
NOP
NOP 
DJNZ R0,DELAY0
DJNZ R1,DELAY1
CLR RS0
RET

DELAY4S:    ;延時 
SETB RS1
MOV R3,#02H
DELAY30:
MOV R2,#04H
DELAY20:
MOV R1,#250
DELAY10:
MOV R0,#250
DELAY00:
NOP
NOP 
DJNZ R0,DELAY00
DJNZ R1,DELAY10
DJNZ R2,DELAY20
DJNZ R3,DELAY30
CLR RS1
RET

END


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章