網上找來的,可能會有所幫助吧
- /****************************************************************/
- bit iic_start_decide() //IIC 開始判斷
- {
- while(SCL==0); //開始不滿足條件
- while((SCL==1)&&(SDA==1)); //開始條件
- if((SCL==1)&&(SDA==0)) //開始
- {
- while(SCL==1); //等待到時鐘開始低跳變
- return 1;
- }
- else
- return 0;
- }
- /****************************************************************/
- bit iic_stop_decide() //IIC 結束判斷
- {
- while(SCL==0); //結束不滿足條件
- if((SCL==1)&&(0==SDA)) //結束
- {
- while(SDA==0); //等待到數據開始高跳變
- 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); //當時鐘為低時,數據無效,等待
- if(SDA==1)
- rdata++;
- while(SCL==1); //防止在一個高電平時讀8次
- }
- return (rdata);
- }
- /****************************************************************/
- bit iic_ack_decide()
- {
- bit ack_flag; //局部變量
- SDA=0; ////8位發送完畢,釋放數據線SDA,準備接收應答位
- while(SCL==0); //等待SCL變高電平
- //ack_flag=0;
- while(SCL==1); //等待SCL變高電平
- SDA=1;
- ack_flag=1;
- return(ack_flag);
- }
復制代碼
- ;/*------------------------------------------------------------------*/
- ;/* --- 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 ;等待起始信號
- CALL I2C_RXBYTE ;接收地址數據
- CLR C
- CALL I2C_TXACK ;回應ACK
- SETB C ;讀/寫 IDATA[80H - FFH]
- RRC A ;讀/寫位->C
- MOV R0,A ;地址送入R0
- JC READDATA ;C=1(讀) C=0(寫)
- WRITEDATA:
- CALL I2C_RXBYTE ;接收數據
- MOV @R0,A ;寫入IDATA
- INC R0 ;地址+1
- CLR C
- CALL I2C_TXACK ;回應ACK
- CALL I2C_WAITSTOP ;等待停止信號
- JMP RESET
-
- READDATA:
- MOV A,@R0
- INC R0
- CALL I2C_TXBYTE ;發送IDATA數據
- CALL I2C_RXACK ;接收ACK
- CALL I2C_WAITSTOP ;等待停止信號
- JMP RESET
- ;----------------------------
- ;等待起始信號
- ;----------------------------
- I2C_WAITSTART:
- JNB SCL,$ ;等待時鐘->高
- JB SDA,$ ;等待數據線下降沿
- JB SCL,$ ;等待時鐘->低
- RET
- ;----------------------------
- ;等待結束信號
- ;----------------------------
- I2C_WAITSTOP:
- JNB SCL,$ ;等待時鐘->高
- JNB SDA,$ ;等待數據線上升沿
- RET
- ;----------------------------
- ;發送ACK/NAK信號
- ;----------------------------
- I2C_TXACK:
- MOV SDA,C ;送ACK數據
- JNB SCL,$ ;等待時鐘->高
- JB SCL,$ ;等待時鐘->低
- SETB SDA ;發送完成
- RET
- ;----------------------------
- ;接收ACK/NAK信號
- ;----------------------------
- I2C_RXACK:
- SETB SDA ;準備讀數據
- JNB SCL,$ ;等待時鐘->高
- MOV C,SDA ;讀取ACK信號
- JB SCL,$ ;等待時鐘->低
- RET
- ;----------------------------
- ;接收一字節數據
- ;----------------------------
- I2C_RXBYTE:
- MOV R7,#8 ;8位計數
- RXNEXT:
- JNB SCL,$ ;等待時鐘->高
- MOV C,SDA ;讀取數據口
- RLC A ;保存數據
- JB SCL,$ ;等待時鐘->低
- DJNZ R7,RXNEXT ;收下一位
- RET
- ;----------------------------
- ;發送一字節數據
- ;----------------------------
- I2C_TXBYTE:
- MOV R7,#8 ;8位計數
- TXNEXT:
- RLC A ;移出數據位
- MOV SDA,C ;數據送數據口
- JNB SCL,$ ;等待時鐘->高
- JB SCL,$ ;等待時鐘->低
- DJNZ R7,TXNEXT ;送下一位
- RET
- ;----------------------------
- END
復制代碼
|