赞助论坛
  • 4490阅读
  • 0回复

学习单片机之---X24C02 WRITING AND READING SUBROUTINE [复制链接]

楼层直达
jswr  
发帖
339
精华
1
金币
264
威望
8
贡献
7
好评
15
注册
2008-06-30
楼主    jswr 发表于: 2008-08-20 16:24:53 
;**************** X24C02 WRITING AND READING SUBROUTINE *************************************

COUNTER   EQU   25H       ;COUNTER UNIT USED TO SAVE THE CIRCLE_TIMES
BYTEADD   EQU   24H       ;WRITING&READ BYTE_ADDRESS OF 24C02
SENDDATA   EQU   R1
SDA       BIT   P3.4
SCL       BIT   P3.5
;===============================WRITE     SUBROUTINE==========================================
;=========           SEND WRITING_ADDRESS TO 24H UNIT   AND SENDDATA TO R1           ==========
;=============================================================================================
WRITE:   LCALL   START    
        MOV   A,#0A0H   ;SENDING THE SLAVE ADDRESS AND WRITE SIGNAL TO 24C02(A0/A1/A2=0)  
        NOP
        LCALL   SENDBYTE
        NOP
        LCALL   ACK       ;SENDING ACK SIGNAL
        NOP
        MOV   A, BYTEADD    
        LCALL   SENDBYTE
        NOP
        LCALL   ACK
        MOV   A,SENDDATA ;SENDING THE DATA WANTED TO BE WRITEN
        LCALL   SENDBYTE
        LCALL   ACK
        NOP
        LCALL   STOP     ;SROP THE OPREATION
        NOP
        RET
        NOP
;==================================START     PROCESS==========================================
;==SENDING A DOWN_EDGE DURING SCL HOLDING HIGH LEVEL,USE TO START A WRITE OR READ OPREATION===
;=============================================================================================
START:   SETB   SDA          
        SETB   SCL          
        NOP
        NOP
        NOP
        NOP
        CLR   SDA
        NOP
        NOP
        NOP
        NOP
        CLR   SCL
        NOP
        NOP
        RET
        NOP
        NOP

STOP:     CLR   SDA
        SETB   SCL
        NOP
        NOP
        NOP
        NOP
        SETB   SDA
        NOP
        NOP
        NOP
        NOP
        CLR   SCL
        NOP
        NOP
        RET
        NOP
        NOP

SENDBYTE: MOV   COUNTER,#08H  
CYCLE1:   RLC   A
        MOV   SDA, C
        LCALL   CLOCK
        DJNZ   COUNTER,CYCLE1  
        NOP
        NOP  
        RET
        NOP
        NOP

CLOCK:   NOP
        SETB   SCL
        NOP
        NOP
        NOP
        MOV   C,   SDA
        CLR   SCL
        NOP
        NOP
        RET
        NOP
        NOP

ACK:       SETB   SDA
        LCALL   CLOCK
        NOP
        NOP
        RET
        NOP
        NOP
;====================================READ       SUBROUTINE=====================================
;====== SEND THE READ_ADDRESS TO THE 24H UNIT AND THE RETURN DATA IS LOCATED IN ACC ==========
;=============================================================================================
READ:     SETB   SDA     ;Make SDA as an imput pin
        LCALL   START   ;
        MOV   A,#0A0H   ;SENDING THE SLAVE ADDRESS AND READ SIGNAL TO 24C02(A0/A1/A2=0)  
        NOP
        LCALL   SENDBYTE
        NOP
        LCALL   ACK       ;SENDING ACK SIGNAL
        NOP
        MOV   A, BYTEADD    
        LCALL   SENDBYTE
        NOP
        LCALL   ACK
        LCALL   START    
        MOV   A,#0A1H   ;SENDING THE SLAVE ADDRESS AND READ SIGNAL TO 24C02(A0/A1/A2=0)  
        NOP
        LCALL   SENDBYTE
        NOP
        LCALL   ACK       ;SENDING ACK SIGNAL
        NOP
        MOV   COUNTER,#08H
CYCLE2:   LCALL CLOCK
        RLC A
        DJNZ COUNTER,CYCLE2
        NOP
        NOP
        RET  
END