?? nickles_i2c.asm
字號:
;===============================================
; 程序設(shè)計: 俞長新
; 開始日期: 2002.03.01
; 版本: VER 1.00
; MCU =AT89C52 8KBYTES FLASH MEMORY /256 RAM
; XTAL = 12.0000MHz
; EEPROM= AT24C02
;===============================================
; I2C總線接口定義
;===============================================
IIADR EQU 00H ;I2C器件的物理地址
SCL BIT P1.6 ;I2C時鐘線
SDA BIT P1.7 ;I2C數(shù)據(jù)線
WP BIT P1.2 ;I2C寫保護(hù)檢測
I2CNOP MACRO
NOP
NOP
NOP
ENDM
;===============================================
; I2C總線接口函數(shù)
;===============================================
;===== 寫I2C器件1字節(jié) 入口為R7 ACC =====
BYTEWR:
PUSH ACC ;
LCALL START ;
MOV A,#0A0H+IIADR ;
LCALL SENDBYTE ;
MOV A,R7
LCALL SENDBYTE ;
POP ACC
LCALL SENDBYTE ;
LCALL STOP ;
SJMP DELAY ;
;===== 頁(8個字節(jié))寫I2C器件 入口為R7,R1,R6=====
PAGEWR:
MOV A,R6
JNZ PAGEWRN
RET
PAGEWRN:
LCALL START ;
MOV A,#0A0H+IIADR ;
LCALL SENDBYTE ;
MOV A,R7
LCALL SENDBYTE ;
PAGEWR1:
MOV A,@R1 ;
LCALL SENDBYTE ;
INC R1 ;
DJNZ R6,PAGEWR1 ;
LCALL STOP ;
;===== 寫I2C器件后延時10毫秒 =====
DELAY:
MOV A,R7
PUSH ACC
MOV A,R6
PUSH ACC
MOV R6,#20 ;10ms
DELAY1:
MOV R7,#250 ;250*2us*20
DELAY2:
DJNZ R7,DELAY2 ;
DJNZ R6,DELAY1 ;
POP ACC
MOV R6,A
POP ACC
MOV R7,A
RET
;===== 讀I2C器件當(dāng)前 入口為ACC =====
CUREAD:
LCALL START ;
MOV A,#0A1H+IIADR ;
LCALL SENDBYTE ;
LCALL READBYTE ;
LCALL SENDNOACK ;
LCALL STOP ;
RET
;===== 讀I2C器件1字節(jié) 入口為R7 ACC =====
BYTEREAD:
LCALL START ;
MOV A,#0A0H+IIADR ;
LCALL SENDBYTE ;
MOV A,R7
LCALL SENDBYTE ;
LCALL START ;
MOV A,#0A1H+IIADR ;
LCALL SENDBYTE ;
LCALL READBYTE ;
LCALL SENDNOACK ;
LCALL STOP ;
RET
;===== 讀I2C器件(R6)個字節(jié) 入口為R6,R7,出口為R1-> =====
RANDREAD:
LCALL START ;
MOV A,#0A0H+IIADR ;
LCALL SENDBYTE ;
MOV A,R7
LCALL SENDBYTE ;
LCALL START ;
MOV A,#0A1H+IIADR ;
LCALL SENDBYTE ;
SJMP RANDREAD2 ;
RANDREAD1:
LCALL SENDACK ;
RANDREAD2:
LCALL READBYTE ;
MOV @R1,A ;
INC R1 ;
DJNZ R6,RANDREAD1 ;
LCALL SENDNOACK ;
LCALL STOP ;
RET
;===== 字節(jié)數(shù)據(jù)傳統(tǒng)送子程序 =====
SENDBYTE:
MOV B,#8 ;8位
SENDBY2:
RLC A
MOV SDA,C ;
I2CNOP
SETB SCL ;置時鐘線為高通知被控器開始
I2CNOP
CLR SCL ;保證時鐘高周期大于4uS
DJNZ B,SENDBY2 ;
SETB SDA
I2CNOP
SETB SCL
I2CNOP
SETB C
JB SDA,SENDBY6 ;ACK=1
CLR C
SENDBY6:
CLR SCL
RET
;===== 字節(jié)數(shù)據(jù)接收子程序 =====
READBYTE:
SETB SDA
MOV B,#8
READBY2:
CLR SCL
I2CNOP
SETB SCL
MOV C,SDA
RLC A
I2CNOP
DJNZ B,READBY2
RET
;===== 發(fā)送應(yīng)答位子程序 =====
SENDACK:
CLR SCL
I2CNOP
CLR SDA
I2CNOP
SETB SCL
I2CNOP
CLR SCL
RET
;===== 發(fā)送非應(yīng)答位子程序 =====
SENDNOACK:
CLR SCL
I2CNOP
SETB SDA
I2CNOP
SETB SCL
I2CNOP
CLR SCL
RET
;===== START 發(fā)送I2C 起始條件 =====
START:
SETB SDA ;發(fā)送起始條件的數(shù)據(jù)信號
I2CNOP
SETB SCL ;發(fā)送起始條件的時鐘信號
I2CNOP
CLR SDA ;發(fā)送起始信號
I2CNOP
CLR SCL ;鉗住I2C 發(fā)送或接收數(shù)據(jù)
RET
;===== STOP 發(fā)送I2C 總線停止條件 =====
STOP:
CLR SDA
I2CNOP
SETB SCL
I2CNOP
SETB SDA
RET
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -