原创 AT24C04 读写程序

2008-3-25 20:16 5312 2 2 分类: MCU/ 嵌入式

2404 是一个4KB的EEPROM,具有1,000,000次擦写周期,数据保存100年不变,非挥发性存 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


;介质,I2C总线形式,页面存储方式,能方便地读写数据,数据保存安全可靠。


;本程序主要为AT24C04的读写程序,具有单字节读、写;多字节连续读、写等方式。


 


        BEEP        BIT        P3.7                 ;蜂鸣器定义


        MDIO        BIT        P2.5                 ;EEPROM数据输入输出口


        MCLK        BIT        P2.4                 ;EEPROM时钟口线


        MEM_R1      EQU        0BH                  ;延时寄存器1


        MEM_R2      EQU        0CH                  ;延时寄存器2


 


        WP           BIT        P2.3                  ;EEPROM写保护,高电平保护


    


        AD0          BIT        P2.0                   ;EEPROM地址A0


        AD1          BIT        P2.1                   ;EEPROM地址A1


        AD2          BIT        P2.2                   ;EEPROM地址A2


 


        DATA_A       EQU        20H                    ;地址缓冲区


 


        ORG 00H                                        ;程序开始


        JMP MAIN                                       ;主程序


       


         ORG 30H                                      ;主程序开始 30H


 


MAIN:     MOV SP,#30H                                 ;设置堆栈


          LCALL REST                                  ;初始化


          MOV DATA_A,#00H                             ;数据在AT24C04中的首地址                         


          MOV R1,#0                                   ;待存数据首地址


          MOV R0,#255                                 ;需要存储的数据数量


LP:       MOV A,R1                                    ;获得首地址


          MOV DPTR,#TAB                               ;查数据表


          MOVC A,@A+DPTR                              ;得到数据


          JZ LPE                                      ;如果为0返回


          MOV B,A                                     ;寄存


          MOV DPH,DATA_A                              ;数据在AT24C04中的地址


          Lcall wt_mem                                ;写入一个字节数据


          INC DATA_A                                  ;准备下一个地址


          INC R1                                      ;准备下一个数据


          JMP LP                                      ;重复写入


LPE:  MOV DPH,#00H                                    ;要读取的数据地址


          MOV B,#00H                                  ;寄存器清零


          LCALL RD_MEM                                ;读取数据从AT24C04


          MOV P1,B                                    ;数据从P1口反映出来


          JMP $                                       ;停止


 


REST:                                                    ;初始化


           CLR AD0                                       ;给AT24C04的地址端清零


           CLR AD1                                       ;


           CLR AD2                                       ;


           CLR WP                                        ;清除写保护


           CLR MCLK                                      ;时钟为低


           CLR MDIO                                      ;数据为低


           MOV P0,#00H                                   ;禁止数码管显示


           CLR BEEP                                      ;禁止蜂鸣器           


         RET


;****************  AT24C04  操作程序  ****************


WT_MEM:                                              ;写入的地址在DPH中,数据在B中


      ACALL MEM_START                                ;给AT24C04开始信号


      MOV A,#0A0H                                    ;"写"命令字+片选地址信息


      ACALL WR1                                      ;写入以上信息


MWRITE2:             


      MOV A,DPH                                      ;准备写入片内地址信息


      ACALL WR1                                      ;写入


      MOV A,B                                        ;准备数据


      ACALL WR1                                      ;写入数据


      ACALL MEM_STOP                                 ;发送停止信号,


                                                     ;如果要重复写,可以不发结束信号,


                                                     ;返回MWRITE2继续写下一个数据


                                                     ;写完后发送结束信号。


      RET                                            ;返回,一个字节写结束


 


;**********  AT24CXX  读字节程序   ***************************


; 要读入的地址信息在DPH中,返回的读取数据在B中


 


RD_MEM:       


      ACALL MEM_START                     ;发送开始信号


      MOV   A,#0A0H                       ;"写"命令字+片选地址信号


      ACALL WR1                           ;写入以上信息


      MOV   A,DPH                         ;准备片内信息


      ACALL WR1                           ;写入片地址信息


      ACALL MEM_START                     ;重复发送开始信号,这里和写不同


      MOV A,#0A1H                         ;准备命令字(读)+片选地值


      ACALL WR1                           ;写入以上信息


      CLR    A                            ;准备接收读取的数据


      MOV   DPL,#08H                      ;数据位数


      CLR MCLK                            ;时钟为低


RD1: SETB  MCLK                           ;时钟上跳


      NOP                                 ;等待数据出现


      LCALL MDELAY                        ;延时等待


      MOV   C,MDIO                        ;数据移入C


      RLC   A                             ;数据移入寄存器A


      CLR   MCLK                          ;时钟下跳,准备读取下一位数据


      LCALL MDELAY  


      DJNZ  DPL,RD1                       ;没有读完则继续,否则返回


      MOV   B,A                           ;数据送B


      ACALL MEM_STOP                      ;发送结束信号


      RET                                 ;返回,


 


WR1: MOV   MEM_R1,#08H                   ;写入8个字节数


  WR2: RLC   A                            ;A带进位左移


       MOV   MDIO,C                       ;数据输出一位


       SETB  MCLK                         ;向AT24C04锁存数据


       ACALL MDELAY                       ;等待


       CLR   MCLK                         ;准备写入下一个字节数据


       ACALL MDELAY                       ;等待


       DJNZ  MEM_R1,WR2                   ;没有写完,继续


                                                          ;


WR4:      LCALL MDELAY                   ;等待写完8字节信息


           SETB MCLK                      ;发送第9个时钟作为应答信号


           LCALL MDELAY                   ;等待,AT24C04应答信号


           CLR    MCLK                    ;完成,清除时钟


       RET                                ;返回


 


;***********  发送开始信号  ********************


;开始信号:在时钟为高电平,数据线出现下跳;


 


MEM_START:           SETB  MDIO            ;数据线高电平


                     SETB   MCLK           ;时钟提高        


                     NOP                   ;等待电平稳定


                     CLR   MDIO            ;数据下跳作为开始信号


                     ACALL MDELAY          ;延时


                     CLR   MCLK            ;时钟下跳


                     ACALL MDELAY          ;等待一段时间


                     RET                           ;返回


;**********  发送停止信号   *********************


;停止信号:在时钟为高电平,数据线出现上跳;


MEM_STOP:           SETB MCLK                      ;时钟线高                   


                    ACALL MDELAY                   ;等待电平稳定


                    SETB MDIO                      ;数据线高,停止信号    


                    ACALL MDELAY                   ;等待


                    LCALL DELAY20MS                ;写周期延时


                   ; LCALL DELAY20MS                ;延时


                   RET                             ;返回


 


MDELAY:                                            ;短时间延时


               MOV MEM_R2,#04H      


LOOP:          NOP


               DJNZ MEM_R2,LOOP


               RET


 


DELAY20MS:                                        ;20ms延时


           MOV    R5,#40


  DELAY1:  MOV    R4,#00H


  DELAY2:  DJNZ   R4,DELAY2


           DJNZ   R5,DELAY1


           RET


; ************  这张表格位要写入AT24C04的数据  ***********************


;  "  HEJOIN "


;  "  LiZaoping"


;  "  ZHEJIANGHAIYAN"


;  "  HTTP://WWW.HEJOIN.COM"


;  "  Email:Hejoin@163.net"


 


TAB:       DB  ‘H‘,  ‘E‘,  ‘J‘,  ‘O‘,  ‘I‘,  ‘N‘, 0AH


           DB  ‘L‘,  ‘i‘,  ‘Z‘,  ‘a‘,  ‘o‘,  ‘p‘,  ‘i‘,   ‘n‘,  ‘g‘, 0AH


           DB  ‘Z‘,  ‘H‘,  ‘E‘,  ‘J‘,  ‘I‘,  ‘A‘,  ‘N‘,   ‘G‘,  ‘H‘, ‘A‘,  ‘I‘,  ‘Y‘,  ‘A‘,  ‘N‘,0AH


           DB  ‘H‘,  ‘T‘,  ‘T‘,  ‘P‘,  ‘/‘,  ‘/‘,   ‘:‘,   ‘W‘, ‘W‘, ‘W‘,  ‘.‘,  ‘H‘,  ‘E‘,  ‘J‘,  ‘O‘,  ‘I‘,  ‘N‘,  ‘.‘,  ‘C‘, ‘O‘,  ‘M‘,0AH


           DB  ‘E‘,  ‘m‘,  ‘a‘,  ‘i‘,   ‘l‘,  ‘:‘,  ‘H‘,  ‘e‘,  ‘j‘, ‘o‘,  ‘i‘,  ‘n‘,  ‘@‘, ‘1‘,  ‘6‘, ‘3‘,  ‘.‘,  ‘n‘,  ‘e‘,  ‘t‘,0AH


           db   00h   


END

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条