I2C程序,这个是无意间网上看到的,未验证过!

[复制链接]
1743|1
手机看帖
扫描二维码
随时随地手机跟帖
cscm007|  楼主 | 2007-4-18 13:32 | 显示全部楼层 |阅读模式
;*****************************
;* System Const Definition *
;*****************************
IIC_SCL_MASK    EQU    1000B    ;OR WITH PORTC, PULL SCL HIGH
IIC_SCL_LOW    EQU    0111B    ;AND WITH PORTC,PULL SCL LOW

IIC_SDA_MASK    EQU    0100B    ;OR WITH PORTC, PULL SDA HIGH
IIC_SDA_LOW    EQU    1011B    ;AND WITH PORTC,PULL SDA LOW

IIC_SDA_INPUT    EQU    1011B    ;AND WITH PCOUT, SET PORT_SDA INPUT
IIC_SDA_OUTPUT    EQU    0100B    ;OR WITH PCOUT,    SET PORT_SDA_OUTPUT

;********************************
;* System Variable Definition *
;********************************
   

;Used for EE_RDByte Function
;EE_RDAddressL    EQU    33H    ;
;EE_RDAddressH    EQU    34H    ;
;EE_RDDataL    EQU    35H    ;
;EE_RDDataH    EQU    36H    ;
EE_RDByteTMP    EQU    37H    ;
;EE_RDByteRTN    EQU    38H    ;

;Used for EE_WRByte Function
;EE_WRAddressL    EQU    33H    ;
;EE_WRAddressH    EQU    34H    ;
;EE_WRDataL    EQU    35H    ;
;EE_WRDataH    EQU    36H    ;
EE_WRByteTMP    EQU    37H    ; 
;EE_WRByteRTN    EQU    38H    ;

;USED FOR WRITE AND READ BYTE FUNCTION
EE_ADDRESSL    EQU    33H    ;
EE_ADDRESSH    EQU    34H    ;
EE_WRCOMMONRTN    EQU    38H    ;

TMP1        EQU    31H
TMP2        EQU    32H
   

EE_RDByte:
       ;LDA    IE_BAK                ;Recover the IE
       ;STA    IE
       
       LDA    EE_RDAddressL,00H
       STA    EE_ADDRESSL,00H
       LDA    EE_RDAddressH,00H
       STA    EE_ADDRESSH,00H
       CALL    EE_WRCOMMON
       STA    EE_WRCOMMONRTN,00H
       BNZ    EE_RDBYTE_EEROR    
       ;***********************************************
       ;GENERATE START
       ;***********************************************        
       ORIM    PORTC,IIC_SDA_MASK
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SDA_LOW
       ANDIM    PORTC,IIC_SCL_LOW    ;START
       ORIM    PORTC,IIC_SDA_MASK
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;1        
       ANDIM    PORTC,IIC_SDA_LOW
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ORIM    PORTC,IIC_SDA_MASK
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;1        
       ANDIM    PORTC,IIC_SDA_LOW    
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ;***********************************************
       ;WRITE ADDR:000
       ;***********************************************        
       ANDIM    PORTC,IIC_SDA_LOW    
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ANDIM    PORTC,IIC_SDA_LOW    
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ANDIM    PORTC,IIC_SDA_LOW    
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ;***********************************************
       ;READ OPCODE BIT:1
       ;***********************************************        
       ORIM    PORTC,IIC_SDA_MASK    
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;1
       ;***********************************************
       ;RECEIVE ACK BIT
       ;***********************************************        
       LDI    PCOUT, 1001B
       ORIM    PORTC,IIC_SDA_MASK    ULL UP
       ORIM    PORTC,IIC_SCL_MASK

       ;LDI    TMP1,IIC_SDA_MASK
       ;AND    PORTC,00H
       ;BNZ    EE_WRCOMMON_EEROR
       LDA    PORTC, 00H
       BA2    $-1
       LDI    PCOUT,1001B        
       LDI    PORTC,0001B
       ;***********************************************
       ;READ BYTE
       ;***********************************************        
       LDI    TMP1,04H
EE_RDBYTE_H1:

       LDA    EE_RDDataH,00H
       ADDM    EE_RDDataH,00H        ;LEFT SHIFT
       ORIM    PORTC,IIC_SCL_MASK
       LDI    TMP2,IIC_SDA_MASK
       AND    PORTC,00H
       BNZ    EE_RDBYTE_H2
       LDI    TMP2,00H
       ADDM    EE_RDDataH,00H        ;READ 0
       JMP    EE_RDBYTE_H3
EE_RDBYTE_H2:
       LDI    TMP2,01H
       ADDM    EE_RDDataH,00H        ;READ 1
EE_RDBYTE_H3:
       ANDIM    PORTC,IIC_SCL_LOW
       ORIM    PORTC,IIC_SDA_MASK    ULL UP
       SBIM    TMP1,01H
       BNZ    EE_RDBYTE_H1        ;DATAH OVER
       
       ;LDI    PCOUT,1001B        
       ;LDI    PORTC,0001B
       LDI    TMP1,04H
EE_RDBYTE_L1:
       LDA    EE_RDDataL,00H
       ADDM    EE_RDDataL,00H
       ORIM    PORTC,IIC_SCL_MASK
       LDI    TMP2,IIC_SDA_MASK
       AND    PORTC,00H
       BNZ    EE_RDBYTE_L2
       LDI    TMP2,00H
       ADDM    EE_RDDataL,00H
       JMP    EE_RDBYTE_L3
EE_RDBYTE_L2:
       LDI    TMP2,01H
       ADDM    EE_RDDataL,00H
EE_RDBYTE_L3:
       ANDIM    PORTC,IIC_SCL_LOW
       ORIM    PORTC,IIC_SDA_MASK    ULL UP
       SBIM    TMP1,01H
       BNZ    EE_RDBYTE_L1        ;DATAL OVER

       ;***********************************************
       ;NO ACK
       ;***********************************************        
       ;ORIM    PCOUT,IIC_SDA_OUTPUT
       LDI    PCOUT, 1101B
       ORIM    PORTC,IIC_SDA_MASK    ;PULL UP
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW
       LDI    TMP1,00H
       STA    EE_RDByteRTN,00H
       JMP    EE_RDBYTE_EXIT                

EE_RDBYTE_EEROR:
       ANDIM    PORTC,IIC_SCL_LOW
       ORIM    PCOUT,IIC_SDA_OUTPUT
       LDI    TMP1,0FH
       STA    EE_WRByteRTN,00H
       
EE_RDBYTE_EXIT:
       ;***********************************************
       ;GENERATE STOP
       ;***********************************************        
       ANDIM    PORTC,IIC_SDA_LOW        
       ORIM    PORTC,IIC_SCL_MASK
       ORIM    PORTC,IIC_SDA_MASK

       ;LDA    IE                ;Protect the IE
       ;STA    IE_BAK
               
       ;LDA    RomBankTMP,00H
       ;STA    ROMBANK
       JMP    I2C_READ_BYTE_OVER        
;        RTNI

;*********************** Function ******************************
;** Name:    EE_WRByte                      **
;** Description:Read one Byte from EEPROM(24C02)        **
;** Input Para:    271H~270H -- EE_WRAddressH,EE_WRAddressL    **
;**        273H~272H -- EE_WRDataH,EE_WRDataL        **
;** Output Para:EE_WRByteRTN -- /0:Success;0:Failed        **
;** Used Var:    EE_WRByteTMP -- temp for Operation        **
;** Used Reg:    DPH/DPM/DPL,TBR,INX                **
;*****************************************************************
EE_WRByte:
       ;LDA    IE_BAK                ;Recover the IE
       ;STA    IE
       
       LDI    IRQ, 00H
       LDI    IE, 00H
       
       LDA    EE_WRAddressL,00H
       STA    EE_ADDRESSL,00H
       LDA    EE_WRAddressH,00H
       STA    EE_ADDRESSH,00H
       CALL    EE_WRCOMMON
       STA    EE_WRCOMMONRTN,00H
       BNZ    EE_WRBYTE_EEROR    
       ;***********************************************
       ;WRITE DATA(8 BITS)
       ;***********************************************        
       LDI    TMP1,04H
EE_WRBYTE_DATAH1:
       LDA    EE_WRDataH,00H
       ADDM    EE_WRDataH,00H
       BC    EE_WRBYTE_DATAH2
       ANDIM    PORTC,IIC_SDA_LOW    ;0
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW
       JMP    EE_WRBYTE_DATAH3
EE_WRBYTE_DATAH2:    
       ORIM    PORTC,IIC_SDA_MASK    ;1
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW
EE_WRBYTE_DATAH3:
       SBIM    TMP1,01H
       BNZ    EE_WRBYTE_DATAH1    ;DATAH OVER
       
       LDI    TMP1,04H
EE_WRBYTE_DATAL1:
       LDA    EE_WRDataL,00H
       ADDM    EE_WRDataL,00H
       BC    EE_WRBYTE_DATAL2
       ANDIM    PORTC,IIC_SDA_LOW    ;0
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW
       JMP    EE_WRBYTE_DATAL3
EE_WRBYTE_DATAL2:    
       ORIM    PORTC,IIC_SDA_MASK    ;1
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW
EE_WRBYTE_DATAL3:
       SBIM    TMP1,01H
       BNZ    EE_WRBYTE_DATAL1    ;DATAL OVER
       ;***********************************************
       ;RECEIVE ACK BIT
       ;***********************************************        
       LDI    PCOUT, 1001B
       ORIM    PORTC,IIC_SDA_MASK    ;PULL UP
       ORIM    PORTC,IIC_SCL_MASK
       ;LDI    TMP1,IIC_SDA_MASK
       ;AND    PORTC,00H
       ;BNZ    EE_WRCOMMON_EEROR
       LDA    PORTC, 00H
       BA2    $-1
       LDI    PCOUT,1101B
       LDI    PORTC,0001B

       LDI    TMP1,00H
       STA    EE_WRByteRTN,00H
       JMP    EE_WRBYTE_EXIT
       
EE_WRBYTE_EEROR:
       ANDIM    PORTC,IIC_SCL_LOW
       ORIM    PCOUT,IIC_SDA_OUTPUT
       ;LDI    TMP1,0FH
       LDI    EE_WRByteRTN,0FH
       
EE_WRBYTE_EXIT:
       ;***********************************************
       ;GENERATE STOP
       ;***********************************************        
       ANDIM    PORTC,IIC_SDA_LOW        
       ORIM    PORTC,IIC_SCL_MASK
       ORIM    PORTC,IIC_SDA_MASK
       ;LDA    IE                ;Protect the IE
       ;STA    IE_BAK
       ;LDI    IRQ, 00H
       ;LDI    IE,0000B
               
       ;LDA    RomBankTMP,00H
       ;STA    ROMBANK
       JMP    I2C_WRITE_BYTE_OVER
;        RTNI
;        
;        
;        
EE_WRCOMMON:
       LDI    PCOUT, 0FH        ;SOME INITIAL SETTING
       LDI    PULL, 1100B
       LDI    PORTC, 0001B        ;VCC, 
   
       LDI    TMP1, 00H
       LDI    TMP2, 00H

       ORIM    PORTC,IIC_SDA_MASK
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SDA_LOW
       ANDIM    PORTC,IIC_SCL_LOW    ;GENERATE START
       ;***********************************************
       ;WRITE COMMAND:1010
       ;***********************************************        
       ORIM    PORTC,IIC_SDA_MASK
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;1        
       ANDIM    PORTC,IIC_SDA_LOW
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ORIM    PORTC,IIC_SDA_MASK
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;1        
       ANDIM    PORTC,IIC_SDA_LOW    
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ;***********************************************
       ;WRITE ADDR:0000
       ;***********************************************        
       ANDIM    PORTC,IIC_SDA_LOW    
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ANDIM    PORTC,IIC_SDA_LOW    
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ANDIM    PORTC,IIC_SDA_LOW    
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ;***********************************************
       ;WRITE OPCODE BIT:0
       ;***********************************************        
       ANDIM    PORTC,IIC_SDA_LOW    
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW    ;0
       ;***********************************************
       ;RECEIVE ACK BIT
       ;***********************************************        
       ;ANDIM    PCOUT,IIC_SDA_INPUT
       ;ORIM    PORTC,IIC_SDA_MASK    ;PULL UP
       LDI    PCOUT, 1001B
       ORIM    PORTC, IIC_SDA_MASK
       ORIM    PORTC,IIC_SCL_MASK
       ;LDI    TMP1,IIC_SDA_MASK
       ;AND    PORTC,00H
       LDA    PORTC, 00H
       BA2    $-1
       ;BNZ    EE_WRCOMMON_EEROR
       ;ORIM    PCOUT,IIC_SDA_OUTPUT
       LDI    PCOUT, 1101B
       LDI    PORTC,0001B
       ;ANDIM    PORTC,IIC_SCL_LOW
       ;ORIM    PORTC, IIC_SDA_MASK

       ;***********************************************
       ;WRITE ADDRESS(8 BITS)
       ;***********************************************        
       LDI    TMP1,04H
EE_WRCOMMON_ADDRH1:
       LDA    EE_ADDRESSH,00H
       ADDM    EE_ADDRESSH,00H
       BC    EE_WRCOMMON_ADDRH2
       ANDIM    PORTC,IIC_SDA_LOW    ;0
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW
       JMP    EE_WRCOMMON_ADDRH3
EE_WRCOMMON_ADDRH2:    
       ORIM    PORTC,IIC_SDA_MASK    ;1
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW
EE_WRCOMMON_ADDRH3:
       SBIM    TMP1,01H
       BNZ    EE_WRCOMMON_ADDRH1    ;ADDRH OVER
       
       LDI    TMP1,04H
EE_WRCOMMON_ADDRL1:
       LDA    EE_ADDRESSL,00H
       ADDM    EE_ADDRESSL,00H
       BC    EE_WRCOMMON_ADDRL2
       ANDIM    PORTC,IIC_SDA_LOW    ;0
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW
       JMP    EE_WRCOMMON_ADDRL3
EE_WRCOMMON_ADDRL2:    
       ORIM    PORTC,IIC_SDA_MASK    ;1
       ORIM    PORTC,IIC_SCL_MASK
       ANDIM    PORTC,IIC_SCL_LOW
EE_WRCOMMON_ADDRL3:
       SBIM    TMP1,01H
       BNZ    EE_WRCOMMON_ADDRL1    ;ADDRL OVER
       ;***********************************************
       ;RECEIVE ACK BIT
       ;***********************************************        
       ;ANDIM    PCOUT,IIC_SDA_INPUT
       LDI    PCOUT, 1001B
       ORIM    PORTC,IIC_SDA_MASK    ;PULL UP
       ORIM    PORTC,IIC_SCL_MASK
       
       ;LDI    TMP1,IIC_SDA_MASK
       ;AND    PORTC,00H
       ;BNZ    EE_WRCOMMON_EEROR
       LDA    PORTC, 00H
       BA2    $-1
       LDI    PCOUT,1101B
       LDI    PORTC,0001B
       ;ANDIM    PORTC,IIC_SCL_LOW
       LDI    TMP1,00H
       STA    EE_WRCOMMONRTN,00H
       RTNI
       
EE_WRCOMMON_EEROR:
       ;LDI    TMP1,0FH
       LDI    EE_WRCOMMONRTN,0FH
       RTNI
iammercy| | 2007-4-24 17:12 | 显示全部楼层

看我的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

35

帖子

1

粉丝