原创 AT24C0x串行EEPROM 驱动

2007-8-18 15:54 2890 4 4 分类: MCU/ 嵌入式

;作者:eleclike
;功能:基于51单片机的AT24C0x串行EEPROM 驱动
;子程序1:SB_WRT 写EEPROM 
; 入口参数:R0,写入数据的RAM的地址,
;    R3,写入数据的个数,
;    RG_ICCADR,IIC EEPROM写入的开始地址 
; 出口参数:  
;子程序2:SB_REA 读EEPROM
; 入口参数:R0,读出数据保存到的RAM的地址,
;    R3,读出数据的个数,
;    RG_ICCADR,IIC EEPROM读出的开始地址
; 出口参数: 读出数据,
;子程序3:被子程序1,2调用
;子程序4:被子程序1,2调用
;其他说明:P3.4--SDA;P3.5--SCL;
;


;=====================;延时使用的寄存器
RG_DLY EQU 2H


BT_SDA EQU P3.4
BT_SCL EQU P3.5
;-------------------------------------------------------- 
;-----子程序使用的RAM----等价符号---开始---------------
RG_PWD1 EQU 51H
RG_PWD2 EQU 52H
RG_PWD3 EQU 53H
RG_IICADR EQU 54H
;-----子程序使用的RAM----等价符号---结束---------------
;------------------------------------------------------


;=====================动态显示部分
PT_DSP_DAT EQU P0;PT_DSP_DT:DiSPlay DATa output PorT
PT_DSP_BT EQU P2;PT_DSP_BT:display port bit select
RG_ADD EQU 40H;保存显示数据的地址;是SB_DSP的入口参数
RG_DAT1 EQU 31H
RG_DAT2 EQU 32H
RG_DAT3 EQU 33H
 
;=================
 ORG 0000H  ;中断矢量表
 LJMP MAI
 ORG 0030H
;==========主程序=====
MAI: MOV SP,#60H


 MOV RG_PWD1,#72H 
 MOV RG_PWD2,#34H
 MOV RG_PWD3,#89H
 MOV P0,#0
 MOV RG_DAT1,#0
 MOV RG_DAT2,#0
 MOV RG_DAT3,#0
 
 MOV RG_IICADR,#00H;写入IIC的页内地址
 
LP1_MAI:NOP
 CPL P0.0
;--------------------主程序调用段---------------------------
 MOV R3,#3 ;写数据的个数
 MOV RG_IICADR,#00H ;从EEPROM的00H开始写数据
 MOV R0,#RG_PWD1;最先写入的数据为的地址为#RG_PWD1
 LCALL SB_WRT 
 MOV R3,#3
 MOV RG_IICADR,#00H ;从EEPROM的00H开始读数据
 MOV R0,#RG_DAT1
 LCALL SB_REA
;------------------------------------------------------------ 
 MOV A,RG_DAT1
 JZ RT_MAI
 CPL P0.1



MAI_DSP:MOV RG_ADD,#RG_DAT1;先送低位RAM的数据
 LCALL SB_DSP
 SETB P1.1
 JB P1.1,MAI_DSP
 MOV R2,#10
 LCALL SB_DLY
 JB P1.1,MAI_DSP
 JNB P1.1,$
 MOV A,RG_PWD1
 ADD A,#1
 DA A
 
 MOV RG_PWD1,A
 CJNE A,#99H,RT_MAI
 MOV RG_PWD1,#0
 
RT_MAI :
 CPL P0.2
 CPL P0.3
 LJMP    LP1_MAI



;-------------------------------------------------------------------
;-----------以下IIC 串行EEPROM 驱动子程序-----------------------------
;===写EEPROM子程序========
SB_WRT: MOV     A,#10100000B 
        SETB    BT_SCL               ; 开始总线
        NOP
 CLR     BT_SDA
        NOP
 CLR     BT_SCL
        NOP
 LCALL   SB_WEE                ; WRITE CODE
        MOV  A,RG_IICADR
        LCALL   SB_WEE                ; 写入地址
 MOV  A,@R0
        LCALL   SB_WEE                ; 写入数据
        CLR     BT_SDA
        NOP 
 SETB    BT_SCL
        NOP
 SETB    BT_SDA               ; 停止总线
        NOP
 MOV     R2,#0CH        ;
        LCALL   SB_DLY                 ; DELAY
 
 INC RG_IICADR
 INC R0
 DJNZ R3,SB_WRT
 
        RET
;==读EEPROM子程序========
SB_REA: MOV     A,#10100000B 
        CLR     BT_SDA                ; START 1
        NOP
 CLR     BT_SCL
        NOP
 LCALL   SB_WEE                ; WRITE CODE
        MOV     A,RG_IICADR
        LCALL   SB_WEE                ; 写入地址
        NOP
        SETB    BT_SCL                ; START 2
        NOP 
 CLR     BT_SDA
        NOP       
 CLR     BT_SCL
        NOP
        MOV     A,#10100001B
        LCALL   SB_WEE                 ; READ CODE
        LCALL   SB_RNK                 ; READ DATA
        MOV     @R0,A             ; WITHOUT ACK
        CLR     BT_SDA                ; 停止总线
        NOP
 SETB    BT_SCL
        NOP
 SETB    BT_SDA
        NOP
 MOV     R2,#0CH         ;
        LCALL   SB_DLY     ; DELAY


 INC R0
 INC RG_IICADR
 DJNZ R3,SB_REA           
 RET
;======================


SB_WEE: MOV     R5,#08H        ; SUB SHIFT WRITE
WEW:    RLC     A                  ; WITH ACK
        MOV     BT_SDA,  C
        SETB    BT_SCL
        NOP
 CLR     BT_SCL
        DJNZ    R5,WEW
        SETB    BT_SDA
WAT:    JB      BT_SDA,WAT
        SETB    BT_SCL
 NOP
        CLR     BT_SCL
        RET
;========================================================


SB_RNK: MOV     R5,    #08H        ; SUB SHIFT WRITE
RNR:    MOV     C,     BT_SDA        ; WITHOUT ACK
        RLC     A
        SETB    BT_SCL
 NOP
        CLR     BT_SCL
        DJNZ    R5,    RNR
        SETB    BT_SCL
 NOP
        CLR     BT_SCL
        RET
;-------------IIC 串行EEPROM 驱动子程序结束---------------------
;---------------------------------------------------------------


;显示子程序
SB_DSP: PUSH ACC
 MOV  R6,#01H ;R6寄存器选择位
 MOV  R7,#3  ;R7寄存位移的次数,即需要显示的RAM的内容的个数
 MOV  R1,RG_ADD ;把最先要显示的内容的寄存器地址送到R1,最先显示低位,即数码管的最后面的位



LP_DSP: MOV  A,R6  ;选择显示的位,使用PT_DSP_BT口
 MOV  PT_DSP_BT,A
 RL   A
 MOV  R6,A
 MOV  A,@R1
  ;送要显示的数到PT_DSP_DAT口
 MOV  PT_DSP_DAT,A
 MOV  RG_DLY, #8 ;调延时子程序
 LCALL  SB_DLY


 MOV  A,R6  ;选择显示的位,使用PT_DSP_BT口
 MOV  PT_DSP_BT,A
 RL   A
 MOV  R6,A
 MOV  A,@R1
 ANL A,#0F0H
 SWAP A  ;送要显示的数到PT_DSP_DAT口
 MOV  PT_DSP_DAT,A
 MOV  RG_DLY, #8 ;调延时子程序
 LCALL  SB_DLY


 INC  R1 
        DEC  R7  ;位选择控制次数减一
 MOV  A,R7
 JZ  RT_DSP
 AJMP  LP_DSP


RT_DSP: POP ACC
 RET
;==========延时子程序==========  
SB_DLY: PUSH    RG_DLY 
LP_DL1: PUSH    RG_DLY
LP_DL2: PUSH    RG_DLY
        DJNZ    R2,$
        POP     RG_DLY
        DJNZ    R2,LP_DL2
        POP     RG_DLY
        DJNZ    R2,LP_DL1
        POP     RG_DLY
        DJNZ    R2,SB_DLY
        RET
END

PARTNER CONTENT

文章评论0条评论)

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