⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.txt

📁 有用的单片机程序,包括8279和E2ROM的读写
💻 TXT
字号:

;24c02的1、2、3、4、7脚接地,5脚接P3.5,6脚接p3.4,8脚接5V电源


SDA BIT P3.5                ;p3.5作数据线
SCL BIT P3.4                ;p3.4作时钟线

NUMBYT EQU 54H           ; 存发送或接收字节数
MTD EQU 50H              ;发送数据的首址
MRD EQU 51H              ;接收到的数据存放首址
SLAW EQU 52H             ;存写的控制字
SLAR EQU 53H             ;存读的控制字 
ORG 0000H
SJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH 
RETI
ORG 0023H
RETI

ORG 0040H
START:
         MOV SP,#60H
         MOV SLAW,#0A0H                          ;10100000---写状态控制字
         MOV SLAR,#0A1H                          ;10100001---读状态控制字
         MOV MTD,#30H                            ;发送数据的起始单元为30H
         MOV MRD,#40H                            ;接受到的数据所存放的地址
         MOV NUMBYT,#20H                         ;发送或接收的数据个数
         MOV R0,#30H
         MOV A,#00H
     
LOOP:    MOV @R0,A
         INC A
         INC R0
         CJNE A,#20H,LOOP
     
A1:      LCALL STA                                ;开始发送数据
         NOP
         MOV A,SLAW
         LCALL WRBYT
         LCALL CACK
         JB F0, A1
         NOP

        /*  MOV A,#19H                               ;写一个字节
        LCALL WRBYT
        LCALL CACK
        JB F0,A1  
        MOV A,#25H
        LCALL WRBYT
        LCALL CACK
        JB F0,A1
        LCALL STOP */
        LCALL WRNBYT 
        LCALL DELAY
        
A2:     LCALL STA                                   ;开始从EEPROM读数据
        MOV A,SLAW
        LCALL WRBYT
        LCALL CACK
        JB F0,A2
    
        MOV A,#00H
        LCALL WRBYT
        LCALL CACK
        JB F0,A2
        LCALL STA
        MOV A,SLAR
        LCALL WRBYT
        NOP
        NOP
        NOP
        LCALL RDBYT
        CPL A
        MOV P1,A
        LCALL DELAY
        LCALL MNACK
        LCALL STOP  
        NOP
        NOP
        NOP
        LCALL RDNBYT
        RET
     
 ;///////////////////////////////////////////////////////////////////////////////    
   ;子程序部分 
       
STA:    SETB SDA                 ;启动,当时钟(SCL)为高,数据(SDA)由高到低的变化
                                  ; 为传送开始标志
        NOP
        NOP
        SETB SCL
        NOP
        NOP
        NOP
        NOP
        NOP
        CLR SDA
        NOP
        NOP
        NOP
        CLR SCL
        RET

STOP:   CLR SDA               ;停止,当时钟(SCL)为高时,数据(SDA)由低到高的变化
                              ;为数据停止传送的标志
        NOP
        NOP
        SETB SCL
        NOP
        NOP
        SETB SDA
        NOP
        NOP
        CLR SCL
        RET
MACK:   CLR SDA                 ;发送应答位
        SETB SCL
        NOP
        NOP
        CLR SCL
        SETB SDA
        RET
MNACK:  SETB SDA                ;发送反态应答位
        SETB SCL
        NOP
        NOP
        CLR SCL
        CLR SDA
        RET
       
CACK:   SETB SDA                 ;应答位检查子程序
        SETB SCL
        NOP 
        MOV C, SDA
        MOV F0,C
        CLR SCL
        NOP
        RET
WRBYT:  PUSH 7
        MOV R7,#08H                    ;字节数据发送子程序
WLP:    RLC A
        JC WR1
        CLR SDA
        SETB SCL
        NOP
        NOP
        CLR SCL
        DJNZ R7,WLP
        POP 7
        RET
WR1:    SETB SDA
        SETB SCL
        NOP
        NOP
        CLR SCL
        CLR SDA
        DJNZ R7,WLP
        POP 7
        RET
            
RDBYT:  PUSH 7
        MOV R7,#09H                      ;字节数据接收子程序
RLP:    SETB SDA                         ;准备读
        SETB SCL
        MOV C,SDA
        RLC A
        CLR SCL
        DJNZ R7,RLP   
        POP 7
        RET
/*WRNBYT: LCALL STA                        ;N个字节数据发送子程序,但最多传送8个字节    
       MOV A,SLAW
        LCALL WRBYT
        LCALL CACK
        JB F0,WRNBYT
        MOV A,#00H
        LCALL WRBYT
        LCALL CACK
        JB F0,WRNBYT
        MOV R0,MTD
        MOV R5,NUMBYT                      ;写字节数n
 WRDA:  MOV A,@R0
        LCALL WRBYT
        LCALL CACK
        JB F0,WRNBYT
        INC R0
        DJNZ R5,WRDA
        LCALL STOP
        RET  */
        
 WRNBYT:  PUSH 0                             ;可发送任意多个字节
          PUSH 2
          PUSH 3
          PUSH 5 
          MOV R0,MTD
          MOV R5,NUMBYT                      ;写字节数n
          MOV R2,#00H
          MOV R3,#00H
BYT8:     LCALL STA                        ;N个字节数据发送子程序    
          MOV A,SLAW
          LCALL WRBYT
          LCALL CACK
          JB F0,WRNBYT
          MOV A,R3
          LCALL WRBYT
          LCALL CACK
          JB F0,WRNBYT
          MOV R2,#00H
WRDA:     MOV A,@R0
          LCALL WRBYT
          LCALL CACK
          JB F0,WRNBYT
          INC R0
          INC R2
          INC R3
          DJNZ R5,XIA
          SJMP END1
XIA:      CJNE R2,#08H,WRDA
          LJMP BYT8
          LCALL STOP
END1:     LCALL STOP
          POP 5
          POP 3
          POP 2
          POP 0
          RET  
        

RDNBYT:   PUSH 0 
          PUSH 1
          PUSH 2
          MOV R2,#00H
         ;MOV R0,MRD
          MOV R1,NUMBYT
LOOP1:       
          LCALL STA
          MOV A,SLAW
          LCALL WRBYT
          LCALL CACK
          JB F0,LOOP1
          MOV A,R2
          LCALL WRBYT
          LCALL CACK
          JB F0,LOOP1
          LCALL STA
          MOV A,SLAR
          LCALL WRBYT
          NOP
          NOP
          NOP
          LCALL RDBYT
          LCALL MNACK
          LCALL STOP
          ;MOV @R0,A
          CPL A
          MOV P1,A
          LCALL DELAY
          NOP
          NOP
          LCALL DELAY
          NOP
          NOP
          NOP
          NOP
          NOP
        ;INC R0
          INC R2
          DJNZ R1,LOOP1
          POP 2
          POP 1
          POP 0
          RET
          
       
        
DELAY:    PUSH 0           ;延时子程序(1秒)
          PUSH 1
          PUSH 2                        
          MOV  R0,#0DH
DELAY1:   MOV  R1,#7DH
DELAY2:   MOV  R2,#98H
          DJNZ  R2,$
          DJNZ  R1,DELAY2
          DJNZ  R0,DELAY1
          POP 2
          POP 1
          POP 0
          RET  
          END 
     
        
           

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -