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

学习单片机之---24c02的简单操作 [复制链接]

楼层直达
jswr  
发帖
339
精华
1
金币
264
威望
8
贡献
7
好评
15
注册
2008-06-30
楼主    jswr 发表于: 2008-08-20 15:44:37 
24c02的简单操作


scl_2402   bit p3.5
sda_2402   bit p3.7
sp_begain   equ 60h
      org   0
      mov   sp,#sp_begain
      acall delay
      acall delay
      acall delay
      mov   30h,#0
      mov   31h,#1
      mov   32h,#2
      mov   33h,#3
      mov   34h,#4
      mov   35h,#5
      mov   36h,#6
      mov   37h,#7
write: clr   a   ;address
      mov   r0,#30h     ;point
      mov   r1,#8       ;sum
      acall wrs_2402
      cjne r1,#0ffh,next0
      sjmp err_2402
next0: acall delay
read:   clr   a   ;address
      mov   r0,#38h     ;point
      mov   r1,#8       ;sum
      acall rds_2402
      cjne r1,#0ffh,next1
      sjmp err_2402    
next1: acall delay
write0: mov   a,#8       ;address
      mov   r0,#38h     ;point
      mov   r1,#8       ;sum
      acall wrs_2402
      cjne r1,#0ffh,next2
      sjmp err_2402
next2: acall delay
      sjmp $
err_2402:sjmp $
     
delay: mov   r6,#20       ;24M--5ms----24c02的写入时间间隔
delay_0:djnz r7,$
      djnz r6,delay_0
      ret
;---------------------------------------------
wI2c   equ   0a0h ;器件地址及写操作
rI2c   equ   0a1h ;器件地址及读操作
sta_2402:   ;启始
  setb   sda_2402
  setb   scl_2402
  sjmp   $+2       ;24M至少间隔周期
  sjmp   $+2
  clr   sda_2402
  sjmp   $+2
  sjmp   $+2
  clr   scl_2402
  sjmp   $+2
  sjmp   $+2
  ret
stp_2402:     ;结束
  clr   sda_2402
  setb   scl_2402
  sjmp   $+2
  sjmp   $+2
  setb   sda_2402
  sjmp   $+2
  sjmp   $+2
  ret
wr_2402:       ;写单个字节
  mov   b,#8
wr_2402_0:   rlc   a
  jc     wr_2402_1
  clr   sda_2402
  sjmp   wr_2402_2
wr_2402_1:   setb   sda_2402
wr_2402_2:   setb   scl_2402
  sjmp   $+2
  sjmp   $+2
  clr   scl_2402
  sjmp   $+2
  sjmp   $+2
  djnz   b,wr_2402_0
nmack_2402: setb   sda_2402
nmack_2402_0:setb   scl_2402
  sjmp   $+2
  sjmp   $+2
  mov   c,sda_2402
  clr   scl_2402
  sjmp   $+2
  sjmp   $+2
  ret
mack_2402:   clr   sda_2402
  sjmp   nmack_2402_0
rd_2402:       ;读单个字节
  mov   b,#8
  setb   sda_2402
rd_2402_0: setb   scl_2402
  sjmp   $+2
  sjmp   $+2
  mov   c,sda_2402
  rlc   a
  clr   scl_2402
  sjmp   $+2
  sjmp   $+2
  djnz   b,rd_2402_0
  ret
;---------------------------------------
;24c02的页写为8个字节。
;wrs_2402 写操作(;a--2402指针,r0--变量基址,r1--变量个数少于等于8)
;rds_2402 读操作(;a--2402指针,r0--变量基址,r1--变量个数少于等于8)
;使用a,b,psw,r0,r1 五个变量
wa_2402:   push   acc
        acall   sta_2402
        mov   a,#wI2c
        acall   wr_2402
        pop   acc
        jc     err_2402
        acall   wr_2402
        ret
err_2402: mov   r1,#0ffh
        dec   sp
        dec   sp
        ret   ;2402硬件错误返回
wrs_2402:       ;写多字节
        acall   wa_2402
wrs_2402_0:mov   a,@r0
        acall   wr_2402
        inc   r0
        djnz   01h,wrs_2402_0
        acall   stp_2402
        ret
rds_2402:       ;读多字节
        acall   wa_2402
        acall   sta_2402
        mov   a,#rI2c
        acall   wr_2402
rds_2402_0:acall   rd_2402
        mov   @r0,a
        djnz   01h,rds_2402_1
        acall   nmack_2402
        acall   stp_2402
        ret
rds_2402_1:acall   mack_2402
        inc   r0
        sjmp   rds_2402_0