|
網(wǎng)上找來(lái)的,可能會(huì)有所幫助吧
- /****************************************************************/
- bit iic_start_decide() //IIC 開(kāi)始判斷
- {
- while(SCL==0); //開(kāi)始不滿(mǎn)足條件
- while((SCL==1)&&(SDA==1)); //開(kāi)始條件
- if((SCL==1)&&(SDA==0)) //開(kāi)始
- {
- while(SCL==1); //等待到時(shí)鐘開(kāi)始低跳變
- return 1;
- }
- else
- return 0;
- }
- /****************************************************************/
- bit iic_stop_decide() //IIC 結(jié)束判斷
- {
- while(SCL==0); //結(jié)束不滿(mǎn)足條件
- if((SCL==1)&&(0==SDA)) //結(jié)束
- {
- while(SDA==0); //等待到數(shù)據(jù)開(kāi)始高跳變
- return 1;
- }
- else
- {
- return 0;
- }
- }
- /****************************************************************/
- uchar iic_receive()
- {
- uchar i;
- uchar rdata='0';
- SDA=1;
- for(i=0;i<8;i++)
- {
- rdata<<=1;
- while(SCL==0); //當(dāng)時(shí)鐘為低時(shí),數(shù)據(jù)無(wú)效,等待
- if(SDA==1)
- rdata++;
- while(SCL==1); //防止在一個(gè)高電平時(shí)讀8次
- }
- return (rdata);
- }
- /****************************************************************/
- bit iic_ack_decide()
- {
- bit ack_flag; //局部變量
- SDA=0; ////8位發(fā)送完畢,釋放數(shù)據(jù)線(xiàn)SDA,準(zhǔn)備接收應(yīng)答位
- while(SCL==0); //等待SCL變高電平
- //ack_flag=0;
- while(SCL==1); //等待SCL變高電平
- SDA=1;
- ack_flag=1;
- return(ack_flag);
- }
復(fù)制代碼
- ;/*------------------------------------------------------------------*/
- ;/* --- STC MCU International Limited -------------------------------*/
- ;/* --- STC 1T Series MCU Simulate I2C Slave 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
- RESET:
- SETB SCL
- SETB SDA
-
- CALL I2C_WAITSTART ;等待起始信號(hào)
- CALL I2C_RXBYTE ;接收地址數(shù)據(jù)
- CLR C
- CALL I2C_TXACK ;回應(yīng)ACK
- SETB C ;讀/寫(xiě) IDATA[80H - FFH]
- RRC A ;讀/寫(xiě)位->C
- MOV R0,A ;地址送入R0
- JC READDATA ;C=1(讀) C=0(寫(xiě))
- WRITEDATA:
- CALL I2C_RXBYTE ;接收數(shù)據(jù)
- MOV @R0,A ;寫(xiě)入IDATA
- INC R0 ;地址+1
- CLR C
- CALL I2C_TXACK ;回應(yīng)ACK
- CALL I2C_WAITSTOP ;等待停止信號(hào)
- JMP RESET
-
- READDATA:
- MOV A,@R0
- INC R0
- CALL I2C_TXBYTE ;發(fā)送IDATA數(shù)據(jù)
- CALL I2C_RXACK ;接收ACK
- CALL I2C_WAITSTOP ;等待停止信號(hào)
- JMP RESET
- ;----------------------------
- ;等待起始信號(hào)
- ;----------------------------
- I2C_WAITSTART:
- JNB SCL,$ ;等待時(shí)鐘->高
- JB SDA,$ ;等待數(shù)據(jù)線(xiàn)下降沿
- JB SCL,$ ;等待時(shí)鐘->低
- RET
- ;----------------------------
- ;等待結(jié)束信號(hào)
- ;----------------------------
- I2C_WAITSTOP:
- JNB SCL,$ ;等待時(shí)鐘->高
- JNB SDA,$ ;等待數(shù)據(jù)線(xiàn)上升沿
- RET
- ;----------------------------
- ;發(fā)送ACK/NAK信號(hào)
- ;----------------------------
- I2C_TXACK:
- MOV SDA,C ;送ACK數(shù)據(jù)
- JNB SCL,$ ;等待時(shí)鐘->高
- JB SCL,$ ;等待時(shí)鐘->低
- SETB SDA ;發(fā)送完成
- RET
- ;----------------------------
- ;接收ACK/NAK信號(hào)
- ;----------------------------
- I2C_RXACK:
- SETB SDA ;準(zhǔn)備讀數(shù)據(jù)
- JNB SCL,$ ;等待時(shí)鐘->高
- MOV C,SDA ;讀取ACK信號(hào)
- JB SCL,$ ;等待時(shí)鐘->低
- RET
- ;----------------------------
- ;接收一字節(jié)數(shù)據(jù)
- ;----------------------------
- I2C_RXBYTE:
- MOV R7,#8 ;8位計(jì)數(shù)
- RXNEXT:
- JNB SCL,$ ;等待時(shí)鐘->高
- MOV C,SDA ;讀取數(shù)據(jù)口
- RLC A ;保存數(shù)據(jù)
- JB SCL,$ ;等待時(shí)鐘->低
- DJNZ R7,RXNEXT ;收下一位
- RET
- ;----------------------------
- ;發(fā)送一字節(jié)數(shù)據(jù)
- ;----------------------------
- I2C_TXBYTE:
- MOV R7,#8 ;8位計(jì)數(shù)
- TXNEXT:
- RLC A ;移出數(shù)據(jù)位
- MOV SDA,C ;數(shù)據(jù)送數(shù)據(jù)口
- JNB SCL,$ ;等待時(shí)鐘->高
- JB SCL,$ ;等待時(shí)鐘->低
- DJNZ R7,TXNEXT ;送下一位
- RET
- ;----------------------------
- END
復(fù)制代碼
|
|