?? compass-i2c.asm
字號(hào):
;------------------ 周立功單片機(jī)研究所 -----------------------
;-------------------------------------------------------------
;文件名: COMPASS-I2C.ASM
;功能: 指南針模塊的I2C總線操作
;創(chuàng)建人: 唐堯福
;創(chuàng)建日期: 2004.04.01
;注意: 使用模擬I2C。
;-------------------------------------------------------------
$INCLUDE (REG932.INC)
;變量定義
ACK BIT 10
SLA DATA 76H
NUMBYTE EQU 30H
MTD EQU 51H
SUBA EQU 32H
MRD EQU 40H
ORG 0000H
AJMP MAIN
;主程序開(kāi)始
ORG 0100H
MAIN:
MOV SP,#60H
MOV P0M1,#00H
MOV P0M2,#00H
MOV P1M1,#00H
MOV P1M2,#00H ;P1口設(shè)置為準(zhǔn)雙向
MAIN_L1:
MOV SLA,#76H ;指定器件地址
MOV SUBA,#00H ;指定子地址
MOV NUMBYTE,#03H
LCALL IRDNBYTE ;從指南針模塊讀取3個(gè)字節(jié)
AJMP MAIN_L1
;***********************
;名稱: START
;啟動(dòng)I2C總線子程序
;***********************
START:
SETB SDA
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCL ;起始條件建立時(shí)間大于4.7us
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP ;起始條件鎖定時(shí)大于4us
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL ;鉗住總線,準(zhǔn)備發(fā)數(shù)據(jù)
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;****************************
;名稱: STOP
;功能: 結(jié)束總線子程序
;****************************
STOP:
CLR SDA
NOP
NOP
NOP
NOP
SETB SCL ;發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
NOP ;結(jié)束總線時(shí)間大于4us
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SDA ;結(jié)束總線
NOP ;保證一個(gè)終止信號(hào)和起始信號(hào)的空閑時(shí)間大于4.7us
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;*******************************
;名稱: MACK
;功能: 發(fā)送應(yīng)答信號(hào)子程序
;*******************************
MACK:
CLR SDA ;將SDA置0
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP ;保持?jǐn)?shù)據(jù)時(shí)間,即SCL為高時(shí)間大于4.7us
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;****************************
;名稱: MNACK
;功能: 發(fā)送非應(yīng)答信號(hào)
;****************************
MNACK:
SETB SDA ;將SDA置1
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP ;保持?jǐn)?shù)據(jù)時(shí)間,即SCL為高時(shí)間大于4.7us
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;**************************************
;名稱: CACK
;功能: 檢查應(yīng)答位子程序
; 返回值,ACK=1時(shí)表示有應(yīng)答
;**************************************
CACK:
SETB SDA
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK ;判斷應(yīng)答位
CEND:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;*******************************************************
;名稱: WRBYTE
;功能: 發(fā)送字節(jié)子程序
;入口參數(shù): 字節(jié)數(shù)據(jù)放入ACC
;注意: 每發(fā)送一字節(jié)要調(diào)用一次CACK子程序,取應(yīng)答位
;*******************************************************
WRBYTE:
MOV R0,#08H
WLP:
RLC A ;取數(shù)據(jù)位
JC WR1
SJMP WR3 ;判斷數(shù)據(jù)位
WLP1:
DJNZ R0,WLP
NOP
RET
WR1:
SETB SDA ;發(fā)送1
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SJMP WLP1
WR3:
CLR SDA ;發(fā)送0
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SJMP WLP1
;*************************************************
;名稱: RDBYTE
;功能: 讀取字節(jié)子程序
;出口參數(shù): 讀出的值在ACC
;注意: 每取一字節(jié)要發(fā)送一個(gè)應(yīng)答/非應(yīng)答信號(hào)
;*************************************************
RDBYTE:
MOV R0,#08H
RLP:
SETB SDA
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCL ;時(shí)鐘線為高,接收數(shù)據(jù)位
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,SDA ;讀取數(shù)據(jù)位
MOV A,R2
RLC A ;進(jìn)行數(shù)據(jù)位的處理
MOV R2,A
CLR SCL ;將SCL拉低,時(shí)間大于4.7us
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R0,RLP ;未夠8位,再來(lái)一次
RET
;****************************************************************
;名稱: IRDNBYTE
;功能: 向器件指定子地址讀取N字節(jié)數(shù)據(jù)
;入口參數(shù): 器件從地址SLA、器件子地址SUBA、接收字節(jié)數(shù)NUMBYTE
;出口參數(shù): 接收數(shù)據(jù)緩沖區(qū)MTD
;占用: A、 R0、 R1、 R2、 R3、 CY
;****************************************************************
IRDNBYTE:
MOV R3,NUMBYTE
LCALL START
MOV A,SLA
LCALL WRBYTE ;發(fā)送器件從地址
LCALL CACK
JNB ACK,RETRDN
MOV A,SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
LCALL START ;重新起動(dòng)總線
MOV A,SLA
INC A ;準(zhǔn)備進(jìn)行讀操作
LCALL WRBYTE
LCALL CACK
JNB ACK,IRDNBYTE
MOV R1,#MRD
RDN1:
LCALL RDBYTE ;讀操作開(kāi)始
MOV @R1,A
DJNZ R3,SACK
LCALL MNACK ;最后一字節(jié)發(fā)非應(yīng)答位
RETRDN:
LCALL STOP ;并結(jié)束總線
RET
SACK:
LCALL MACK
INC R1
SJMP RDN1
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -