?? master.asm
字號(hào):
;/*------------------------------------------------------------------*/
;/* --- STC MCU International Limited -------------------------------*/
;/* --- STC 1T Series MCU Simulate I2C Master Demo ------------------*/
;/* --- Mobile: (86)13922805190 -------------------------------------*/
;/* --- Fax: 86-755-82944243 ----------------------------------------*/
;/* --- Tel: 86-755-82948412 ----------------------------------------*/
;/* --- Web: www.STCMCU.com -----------------------------------------*/
;/* If you want to use the program or the program referenced in the */
;/* article, please specify in which data and procedures from STC */
;/*------------------------------------------------------------------*/
SCL BIT P1.0
SDA BIT P1.1
;----------------------------
ORG 0
MOV TMOD,#20H ;初始化串口為(9600,n,8,1)
MOV SCON,#5AH
MOV A,#-5 ;-18432000/12/32/9600
MOV TH1,A
MOV TL1,A
SETB TR1
MAIN:
CALL UART_RXDATA ;接收下一個(gè)串口數(shù)據(jù)
MOV R0,A ;臨時(shí)保存到R0
;讀取I2C設(shè)備IDATA 80H的數(shù)據(jù)
CALL I2C_START ;開(kāi)始讀取
MOV A,#01H
CALL I2C_TXBYTE ;發(fā)送地址數(shù)據(jù)+讀信號(hào)
CALL I2C_RXACK ;接收ACK
CALL I2C_RXBYTE ;接收數(shù)據(jù)
SETB C
CALL I2C_TXACK ;發(fā)送NAK
CALL I2C_STOP ;讀取完成
CALL UART_TXDATA ;將讀到的數(shù)據(jù)發(fā)送到串口
;將R0的數(shù)據(jù)寫(xiě)入I2C設(shè)備IDATA 80H
CALL I2C_START ;開(kāi)始寫(xiě)
MOV A,#00H
CALL I2C_TXBYTE ;發(fā)送地址數(shù)據(jù)+寫(xiě)信號(hào)
CALL I2C_RXACK ;接收ACK
MOV A,R0
CALL I2C_TXBYTE ;寫(xiě)數(shù)據(jù)
CALL I2C_RXACK ;接收ACK
CALL I2C_STOP ;寫(xiě)完成
JMP MAIN
;----------------------------
;等待串口數(shù)據(jù)
;----------------------------
UART_RXDATA:
JNB RI,$ ;等待接收完成標(biāo)志
CLR RI ;清除標(biāo)志
MOV A,SBUF ;保存數(shù)據(jù)
RET
;----------------------------
;發(fā)送串口數(shù)據(jù)
;----------------------------
UART_TXDATA:
JNB TI,$ ;等待上一個(gè)數(shù)據(jù)發(fā)送完成
CLR TI ;清除標(biāo)志
MOV SBUF,A ;發(fā)送數(shù)據(jù)
RET
;----------------------------
;發(fā)送I2C起始信號(hào)
;----------------------------
I2C_START:
CLR SDA ;數(shù)據(jù)線下降沿
CALL I2C_DELAY ;延時(shí)
CLR SCL ;時(shí)鐘->低
CALL I2C_DELAY ;延時(shí)
RET
;----------------------------
;發(fā)送I2C停止信號(hào)
;----------------------------
I2C_STOP:
CLR SDA
SETB SCL ;時(shí)鐘->高
CALL I2C_DELAY ;延時(shí)
SETB SDA ;數(shù)據(jù)線上升沿
CALL I2C_DELAY ;延時(shí)
RET
;----------------------------
;發(fā)送ACK/NAK信號(hào)
;----------------------------
I2C_TXACK:
MOV SDA,C ;送ACK數(shù)據(jù)
SETB SCL ;時(shí)鐘->高
CALL I2C_DELAY ;延時(shí)
CLR SCL ;時(shí)鐘->低
CALL I2C_DELAY ;延時(shí)
SETB SDA ;發(fā)送完成
RET
;----------------------------
;接收ACK/NAK信號(hào)
;----------------------------
I2C_RXACK:
SETB SDA ;準(zhǔn)備讀數(shù)據(jù)
SETB SCL ;時(shí)鐘->高
CALL I2C_DELAY ;延時(shí)
MOV C,SDA ;讀取ACK信號(hào)
CLR SCL ;時(shí)鐘->低
CALL I2C_DELAY ;延時(shí)
RET
;----------------------------
;接收一字節(jié)數(shù)據(jù)
;----------------------------
I2C_TXBYTE:
MOV R7,#8 ;8位計(jì)數(shù)
TXNEXT:
RLC A ;移出數(shù)據(jù)位
MOV SDA,C ;數(shù)據(jù)送數(shù)據(jù)口
SETB SCL ;時(shí)鐘->高
CALL I2C_DELAY ;延時(shí)
CLR SCL ;時(shí)鐘->低
CALL I2C_DELAY ;延時(shí)
DJNZ R7,TXNEXT ;送下一位
RET
;----------------------------
;發(fā)送一字節(jié)數(shù)據(jù)
;----------------------------
I2C_RXBYTE:
MOV R7,#8 ;8位計(jì)數(shù)
RXNEXT:
SETB SCL ;時(shí)鐘->高
CALL I2C_DELAY ;延時(shí)
MOV C,SDA
RLC A
CLR SCL ;時(shí)鐘->低
CALL I2C_DELAY ;延時(shí)
DJNZ R7,RXNEXT ;收下一位
RET
;----------------------------
I2C_DELAY: ;6
PUSH 0 ;4
MOV R0,#1 ;2 6(200K) 1(400K) [18'432'000/400'000=46]
DJNZ R0,$ ;4
POP 0 ;3
RET ;4
;----------------------------
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -