×
单片机 > 单片机程序设计 > 详情

24C02(EEPROM)以字节读写程序(ASM)

发布时间:2020-06-15 发布时间:
|
24C02以字节读写时序

选择性读时序

.................24c02字节读写程序(已调试过).......................

 


;////////////////////////////////////////////////////
;AT89C52与AT24C02的IIC通信
;控制数码管显示0-P
;AT24C02采用字节写和选择性读
;////////////////////////////////////////////////////
DAUN EQU 18  ;写入字节数,对24C02(256BK)最大为255
ADDR EQU 41H ;24C02操作数据地址
WRDA EQU 42H ;写入数据暂存器
RDDA EQU 43H ;读出数据暂存器

WP BIT P1.0
SCL BIT P1.1
SDA BIT P1.2

ORG 0000H
SJMP MAIN
ORG 0030H
MAIN: CLR WP;开写保护
      MOV SP,70H
      MOV P2,#0F7H
      MOV P0,#0FFH
      LCALL WRIIC;写24C02
      LCALL DE1S
   D1:LCALL RDIIC;读24C02
      LJMP D1
      
;写24C02子程序
WRIIC:MOV DPTR,#TAB
      MOV R0,#DAUN
      MOV ADDR,#00H;地址赋初值
   D2:LCALL START
      MOV WRDA,#0AEH
      LCALL SEND
      LCALL SACK
      MOV A,ADDR
      MOV WRDA,A
      LCALL SEND
      LCALL SACK
      CLR A
      MOVC A,@A+DPTR
      MOV WRDA,A
      LCALL SEND
      LCALL SACK
      LCALL STOP
      INC DPTR;数据表指针加一
      INC ADDR;24C02写入地址加一
      LCALL D50U;写入数据延时,这个时间很重要
      DJNZ R0,D2
      RET
;读24C02子程序
RDIIC:MOV R0,#DAUN
      MOV ADDR,#00H
   D5:LCALL START
      MOV WRDA,#0AEH
      LCALL SEND
      LCALL SACK
      MOV A,ADDR
      MOV WRDA,A
      LCALL SEND
      LCALL SACK
      
      LCALL START
      MOV WRDA,#0AFH
      LCALL SEND
      LCALL SACK
      LCALL READ
      LCALL STOP;不需要读应答案信号
      
      MOV A,RDDA
      MOV P0,A
      LCALL DE1S
      INC ADDR;读24C02数据地址加一
      DJNZ R0,D5
      RET     
;24C02开始子程序
START:SETB SDA
      SETB SCL
      LCALL DE5U
      CLR SDA
      LCALL DE5U
      CLR SCL
      RET
;24C02写一个字节子程序
SEND: MOV R1,#08H
      MOV A,WRDA
   D3:RLC A
      MOV SDA,C
      LCALL DE5U
      SETB SCL
      LCALL DE5U
      CLR SCL
      DJNZ R1,D3
      RET
;24C02读一个字节子程序
READ: MOV R1,#08H
   D6:SETB SDA
      LCALL DE5U
      SETB SCL
      LCALL DE5U
      MOV C,SDA
      RLC A
      CLR SCL
      DJNZ R1,D6
      MOV RDDA,A
      RET              
;24c03写应答子程序
SACK: SETB SDA
      LCALL DE5U
      SETB SCL
      LCALL DE5U
   D4:MOV C,SDA
      JC D4
      CLR SCL
      RET
;24C02通信结束子程序
STOP: CLR SDA
      LCALL DE5U
      SETB SCL
      LCALL DE5U
      SETB SDA
      LCALL DE5U
      CLR SCL
      RET
;5US延时子程序
DE5U: NOP
      NOP
      NOP
      NOP
      NOP
      RET
;1S延时子程序
DE1S: MOV R3,#100
   E1:MOV R4,#20
   E2:MOV R5,#248
      DJNZ R5,$
      DJNZ R4,E2
      DJNZ R3,E1
      RET
;50US延时,让24C02写入片内ROM;      
D50U:MOV R6,250
  E3:NOP
     NOP
     NOP
     NOP
     DJNZ R6,E3
     RET      
;显示数据表
TAB:DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H
    DB 0F8H,080H,090H,088H,083H,0C6H,0A1H
    DB 086H,08EH,089H,08CH

    END 

=====================================================================================

/////////////////////////////
;此程序可历遍整个EEPROM(256个字节)
////////////////////////////
wp equ p1.0  
scl equ p1.1
sda equ p1.2

wrda equ 40h
rdda equ 41h

org 0000h
sjmp main
org 0030h
main:clr wp
  clr p2.0
  clr a
  mov r2,a
  mov r3,a
  mov p0,#020h
  mov sp,#70h
  mov 42H,#020h//要读写的字节数
  mov dptr,#tab
  n1:lcall wriic
  lcall d10m
  djnz 42,n1
     mov 43,#020h
  n2:lcall rdiic
     lcall d10m
  djnz 43,n2
  sjmp $
  
wriic:lcall start
   mov wrda,#10101110b
   lcall send
   mov wrda,r2
   inc r2
   lcall send
   
   w1:clr a   
      movc a,@a+dptr
   mov wrda,a
   lcall send
   inc dptr
   lcall stop
   ret

rdiic:lcall start
   mov wrda,#10101110b
   lcall send
   mov wrda,r3
   inc r3
   lcall send
   lcall start
   mov wrda,#10101111b
   lcall send
   lcall read
   mov p0,rdda
   lcall d1s
   lcall stop
   ret

read: mov r1,#08h
   d1:setb sda
   lcall d3u
   setb scl
   lcall d3u
   mov c,sda
   rlc a
   clr scl
   lcall d3u
   djnz r1,d1
   mov rdda,a
   lcall stop
   ret

start:setb sda
   setb scl
   lcall d3u
   clr sda
   lcall d3u
   clr scl
   ret

send: mov r0,#08h
   mov a,wrda
   s1:rlc a
      mov sda,c
   LCALL D3U
   setb scl
   lcall d3u
   clr scl
   lcall d3u
   djnz r0,s1
   
      setb sda
   lcall d3u
   setb scl
   lcall d3u
   s2:mov c,sda
   jc s2
   clr scl
   ret

stop: clr sda
   lcall d3u
   setb scl
   lcall d3u
   setb sda
   lcall d3u
   clr scl
   ret

d3u: nop
  nop
   ret

TAB:    DB 0C0H,0F9H,0A4H,0B0H
        DB 99H,92H,82H,0F8H
        DB 80H,90H,88H,83H
        DB 0C6H,0A1H,86H,8EH
  DB 0C0H,0F9H,0A4H,0B0H
        DB 99H,92H,82H,0F8H
        DB 80H,90H,88H,83H
        DB 0C6H,0A1H,86H,8EH      
   
D10m:   ;误差 0us
    MOV R7,#01H
DL1:
    MOV R6,#26H
DL0:
    MOV R5,#82H
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R7,DL1
    RET

D1s:   ;误差 0us
    MOV R7,#0A7H
DL4:
    MOV R6,#0ABH
DL3:
    MOV R5,#01H
    DJNZ R5,$
    DJNZ R6,DL3
    DJNZ R7,DL4
    NOP
    RET
       
 END

关键字:24C02  EEPROM  字节读写 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析