;
;         "lan_i2c.txt"     I2C
;              DS1307
;
;------------------------------------------------------
;        I2C
;   ,       .
;
; ------------  ------------ 
;
; wr_1307   equ 0b11010000 ;  "  DS1307"
; rd_1307   equ 0b11010001 ;  "  DS1307"
; SDA       equ 0 ;    SDA
; SCL       equ 1 ;    SCL
; SQVOUT    equ 2 ;    SQVOUT
; port_i2c  equ P3 ;  
;
; ------------  ------------ 
;
;  .DSEG
; adr2i:   .ds 1 ;    / 
; tm2i:    .ds 1 ;   1/4 
; cnt2i:   .ds 1 ;   /
; cnte2i:  .ds 1 ;   / 
; data2i:  .ds 1 ;  /  ??
;
; ------------  ------------ 
;
;  .BSEG
; err2i: .dbit 1 ;   
;          ;    
; fask:  .dbit 1 ;    ACK
;          ;    
;
; -----   -----
;
  .CSEG
;-------------------------------------------------
; 1/4  - /
tm4i:
  mov tm2i,#8
  djnz tm2i,$
  ret
;
;-------------------------------------------------
;start2 - /  -   2
; acall start2 ,   tm2i, 
; ,    dout_P3=0xFF
;     SDA=SCL=0 
start2: 
  acall tm4i
  clr port_i2c.SDA
  acall tm4i
  acall tm4i
  clr port_i2c.SCL
  acall tm4i
  ret
;
;-------------------------------------------------
;stop2 - /  -   2
; acall stop2 ,   tm2i, 
; ,   dout_P3=0bnnnnnn??
;     SDA=SCL=1
stop2:
  anl port_i2c,#0b11111100
  acall tm4i
  setb port_i2c.SCL
  acall tm4i
  acall tm4i
  setb port_i2c.SDA
  acall tm4i
  ret
;
;-------------------------------------------------
;" " (Sr-)  I2C
;(    /   I2C,   ""
;  LCALL   strob)
restar:
  setb port_i2c.SDA ; 
  acall tm4i
 lwait:
  mov c,port_i2c.SDA
  jnc lwait ;   
  acall tm4i
  setb port_i2c.SCL
  acall tm4i
  acall tm4i
  clr port_i2c.SDA
  acall tm4i
  clr port_i2c.SCL
  acall tm4i
  ret
;
;-------------------------------------------------
;  ---- strob SCL ----
strob2i:
   acall tm4i
   setb port_i2c.SCL
   acall tm4i
   acall tm4i
   clr port_i2c.SCL
   acall tm4i
  ret
;
;-------------------------------------------------
;rxb2 -       2
; = acall rxb2
;       
;  ACK=0   ,    rxb2  
; fask=1 (    rxb2   ACK=1 / fask=0/)
;   SDA=1,SCL=0
rxb2:
   mov cnt2i,#8 ;    
   setb port_i2c.SDA ;  3.SDA   (SDA=1)
   nop
   nop
loopr2:
    acall tm4i ;   1/4 -
    setb port_i2c.SCL ;  -
		acall tm4i ;   1/4 -
		mov c,port_i2c.SDA
		rlc a
		acall tm4i ;   1/4 -
		clr port_i2c.SCL ;  - SDA   1
		acall tm4i ;   1/4 -
		djnz cnt2i,loopr2
	 jbc fask,off0
noack:
    acall tm4i ;   1/4 -
    acall strob2i
		acall tm4i ;   1/4 -
	 ret
off0:
    clr port_i2c.SDA ;  SDA=0
    acall tm4i ;   1/4 -
    acall strob2i
		acall tm4i ;   1/4 -
		acall tm4i ;   1/4 -
		setb port_i2c.SDA ;  SDA=1
    nop
    nop
   ret
;
;-------------------------------------------------
; txb2 -       2
;  = acall txb2
;  ---      
;   fask=1      "  "
;  SDA=1,SCL=0
txb2:
   clr fask ;  fask
   mov cnte2i,#0x5F ;    
   mov cnt2i,#8 ;    
   nop
   nop
loopt2:
    rlc a
    mov port_i2c.SDA,c ;     SDA
    acall strob2i ;   
    djnz cnt2i,loopt2 ;   LOOPT2   - 
askont:
   setb port_i2c.SDA ;  3.SDA   (SDA=1)
lpask1:
    acall tm4i ;   1/4 -
    mov c,port_i2c.SDA ;     (SDA=0)
    jnc eask ;   SDA=0
    djnz cnte2i,lpask1 ;   lpask1   - 
 extbof:
     setb fask ;    
  txbof:
	    ret ;   SDA=1,SCL=0
 eask:
   mov cnte2i,#0x5F ;   
   acall strob2i ;  9-   (  AK)
lpask2:
  mov c,port_i2c.SDA ;     (SDA=1)
  jc txbof ;      TXBOFF
  djnz cnte2i,lpask2
  sjmp extbof ;       ETXBOF
;
;-------------------------------------------------
; ---       ---
;    1307   
;      data2i
;(   1 ,    
;    adr2i (   DS1307 ))
rdsdt:
   acall start2
   mov a,#wr_1307
   acall txb2
   jbc fask,erclk ;   I2C
   mov a,adr2i ;  ()   
               ;   adr2i
   acall txb2 ;   
   jbc fask,erclk ;   I2C
   acall restar
   mov a,#rd_1307
   acall tr1307
   clr fask ;  ask=1
	      ; (      )
	 acall rxb2
;	 mov data2i,a ;    -
	 acall stop2
	 ret
erclk:
    setb err2i ;    I2C
    acall stop2
    ret
;
;-------------------------------------------------
; tr1307 -      
;        
;   DS1307 -  = acall tr1307
;  ---      
;    =0   -
;   FASK  !
;  SDA=1,SCL=0
tr1307:
    clr fask ;  FASK
    mov cnte2i,#0x5F ;    
    mov cnt2i,#8 ;   
    anl port_i2c,#0b11111100
    nop
    nop
lopt2:
    rlc a
    mov port_i2c.SDA,c ;     SDA
    acall strob2i ;   
    djnz cnt2i,lopt2 ;   LOPT2   - 
	;---------------------------------------------------
	; - DS1307    !!!
	   clr port_i2c.SDA ;  SDA=0
     acall tm4i ;   1/4 -
     acall strob2i ;   
     acall tm4i ;   1/4 -
     setb port_i2c.SDA ;  SDA=1
     acall tm4i ;   1/4 -
	;---------------------------------------------------
		ret
;
;-------------------------------------------------
;
; erw_1307     DS1307/I2c
erw_1307:
       clr err2i
       nop ;    ( )
       ret
;
;-------------------------------------------------
;
; rd_hdr  ""  DS1307
;   R2 -  
;   R0-    
;
rd_hdr:
    push PSW
    setb RS0 ; sel RB1
  .using 1 ;   "  RB1"
      mov r0,#mlans
      mov r2,#15
       acall start2
       mov a,#wr_1307
       acall txb2
       jbc fask,erclk2 ;   I2C
       clr a
       acall txb2 ;   
       jbc fask,erclk2 ;   I2C
      acall restar
      mov a,#rd_1307
      acall tr1307
 rd_loop:
      setb fask
      acall rxb2
      mov @r0,a
      inc r0
      djnz r2,rd_loop
     clr fask ;     
     acall rxb2
     mov @r0,a
 rhdr:
    acall stop2
    pop PSW
  .using 0 ;   "  RB0"
    ret
erclk2:
    setb err2i ;    I2C
   acall erw_1307 ;    I2C DS1307
    sjmp rhdr
;
;-------------------------------------------------
;
; wr_hdr  ""  DS1307
;   R2 -  
;   R0-    
wr_hdr:
     push PSW
     setb RS0 ; sel RB1
   .using 1 ;   "  RB1"
       mov r0,#mlans
       mov r2,#16
        acall start2
        mov a,#wr_1307
        acall txb2
        jbc fask,erclk1 ;   I2C
        clr a
        acall txb2 ;   
        jbc fask,erclk1 ;   I2C
 wr_loop:
       mov a,@r0
       acall txb2
       jbc fask,erclk1 ;   I2C
       inc r0
       djnz r2,wr_loop
 whdr:
     acall stop2
     pop PSW
   .using 0 ;   "  RB0"
     ret
erclk1:
    setb err2i ;    I2C
    acall erw_1307 ;    I2C DS1307
    sjmp whdr
;
;-------------------------------------------------
; reclok -  RTC   /
;    datclock.txt
reclok:
  acall start2
   mov a,#wr_1307
   acall txb2
   jbc fask,er_clk_wr ;   I2C
   clr a ;  ()    =0
   acall txb2 ;   
   jbc fask,er_clk_wr ;   I2C
    clr a
    acall txb2 ;  
    jbc fask,er_clk_wr ;   I2C
    mov a,(mlans+rtc_min)
    acall txb2 ;   
    jbc fask,er_clk_wr ;   I2C
    mov a,(mlans+rtc_hours)
    acall txb2 ;    24- 
    jbc fask,er_clk_wr ;   I2C
    acall stop2
	ret
er_clk_wr:
   setb err2i ;    I2C
   acall stop2
 acall erw_1307 ;    I2C DS1307
  ret
;
;-------------------------------------------------
;
; wr_newcor      DS1307
wr_newcor:
     acall start2
    mov a,#wr_1307
    acall txb2
    jbc fask,er_clk_wr ;   I2C
     mov a,#rtc_cor_l ;  ()   
     acall txb2 ;   
     jbc fask,er_clk_wr ;   I2C
     mov a,corsek
     acall txb2 ;    
     jbc fask,er_clk_wr ;   I2C
     mov a,corsek+1
     acall txb2 ;    
     jbc fask,er_clk_wr ;   I2C
    acall stop2
   ret
;
;-------------------------------------------------
;
; wrustbo      DS1307
wrustbo:
    acall start2
      mov a,#wr_1307
      acall txb2
      jbc fask,er_clk_wr ;   I2C
      mov a,#rtc_bdm1 ;  ()   
      acall txb2 ;   
      jbc fask,er_clk_wr ;   I2C
   mov a,bodun1
   acall txb2 ;  
   jbc fask,er_clk_wr ;   I2C
   mov a,bodun1+1
   acall txb2 ;  
   jbc fask,er_clk_wr ;   I2C
   mov a,bodun2
   acall txb2 ;  
   jbc fask,er_clk_wr ;   I2C
   mov a,bodun2+1
   acall txb2 ;  
   jbc fask,er_clk_wr ;   I2C
   mov a,bodunf
   acall txb2 ;  
   jbc fask,er_clk_wr ;   I2C
     acall stop2
    ret
;
;-------------------------------------------------
;
; wrustbl     
; bodunf   DS1307
wrustbl:
   acall start2
  mov a,#wr_1307
  acall txb2
  jbc fask,er_clk_wr ;   I2C
  mov a,#rtc_bodus ;  ()   
  acall txb2 ;   
  jbc fask,er_clk_wr ;   I2C
  mov a,bodunf
  acall txb2 ;  
  jbc fask,er_clk_wr ;   I2C
   acall stop2
    ret
;
;-------------------------------------------------
;       RTC
tm_wrt:
    acall start2
  mov a,#wr_1307
  acall txb2
  jbc fask,erclk3 ;   I2C
  mov a,#rtc_setu0 ;  ()   
  acall txb2 ;   
  jbc fask,erclk3 ;   I2C
  mov a,setibu0
  acall txb2 ;  
  jbc fask,erclk3 ;   I2C
  mov a,setibu1
  acall txb2 ;  
  jbc fask,erclk3 ;   I2C
  mov a,setibu2
  acall txb2 ;  
  jbc fask,erclk3 ;   I2C
   acall stop2
    ret
;
;-------------------------------------------------
;   RTC    
tm_rd:
   acall start2
   mov a,#wr_1307
   acall txb2
   jbc fask,erclk3 ;   I2C
   mov a,#rtc_setu0 ;  ()   
               ;   adr2i
   acall txb2 ;   
   jbc fask,erclk3 ;   I2C
   acall restar
   mov a,#rd_1307
   acall tr1307
   setb fask
   acall rxb2
   mov setibu0,a
   setb fask
   acall rxb2
   mov setibu1,a
   clr fask ;  ask=1
	      ; (   /   )
	 acall rxb2
	 mov setibu2,a
	  acall stop2
	   ret
erclk3:
    setb err2i ;    I2C
    acall stop2
    acall erw_1307 ;    I2C DS1307
    ret
;
;-------------------------------------------------
;       (mlans)   RTC
 wre_kald:
      acall start2
      mov a,#wr_1307
      acall txb2
      jbc fask,erclk3 ;   I2C
      mov a,#rtc_day ;  ()   
      acall txb2 ;   
      jbc fask,erclk3 ;   I2C
       mov a,(mlans+rtc_day)
       acall txb2 ;
       jbc fask,erclk3 ;   I2C
       mov a,(mlans+rtc_date)
       acall txb2 ;
       jbc fask,erclk3 ;   I2C
       mov a,(mlans+rtc_mons)
       acall txb2 ;
       jbc fask,erclk3 ;   I2C
       mov a,(mlans+rtc_year)
       acall txb2 ;
       jbc fask,erclk3 ;   I2C
     acall stop2
	    ret
;
;-------------------------------------------------
;
; rtc_cold_init     
rtc_cold_init:
   mov r0,#mlans
;   mov @r0,#0x80 ;  ,   /0
   mov @r0,#0 ;  ,   /0
   inc r0
   mov @r0,#0 ;    /1
   inc r0
   mov @r0,#0 ;   ,  24-   /2
   inc r0
   mov @r0,#1 ; 1=, 2=... 7=
	          ;    /3
	 inc r0
   mov @r0,#1 ;   =01 /4
   inc r0
   mov @r0,#1 ; 1=, 2=... 12=
	          ;   /5
	 inc r0
   mov @r0,#0x14 ;     (2014)
	          ;    /6
	 inc r0
   mov @r0,#0x80 ;   SQVOUT  1
	          ;    SQVOUT /7
	 inc r0
   mov @r0,#0 ; bodun1=0
	          ;  1=0 /8
	 inc r0
   mov @r0,#0 ; bodun1+1=0
	          ;  1=0 /9
	 inc r0
   mov @r0,#0 ; bodun2=0
	          ;  2=0 /A
	 inc r0
   mov @r0,#0 ; bodun2+1=0
	          ;  2=0 /B
	 inc r0
   mov @r0,#0 ;   ( bodunf )  /C
   inc r0
   mov @r0,#low(mark2) ;      
            ; " "  /D
   inc r0
   mov @r0,#high(mark2) ;      
            ; " "  /E
   inc r0
   mov @r0,#1 ;  rtce    RTC /F
   ;     
   acall wr_hdr
   ret
;
;-------------------------------------------------
;