$MOD51 dat10 equ 50h dat11 equ 51h dat12 equ 52h dat13 equ 53h dat14 equ 54h dat15 equ 55h dat16 equ 56h dat17 equ 57h dat18 equ 58h dat19 equ 59h dat20 equ 5Ah crc equ 5Bh adr equ R4 znak equ R5 citac equ R6 rtc_r equ 74h rtc_s equ 75h rtc_ts equ 76h SDA bit P1.6 SCL bit P1.7 ;komunikace s I2C cipem cpuiic bit P1.5 ;cistota sbernice org 0 ajmp rst org 3 reti org 0bh reti org 13h reti org 1bh reti ; nastaveni serioveho portu na 9600b/s rst: mov TMOD, #00100000B; MOV TH1, #0FDh ; ANL PCON, #7Fh ; MOV SCON, #01000000B; SETB TR1 ; CLR RI ; CLR TI ; clr A ; dec A ;perem do registru FF, jestli to funguje mov dat10,A mov dat11,A mov dat12,A mov dat13,A mov dat14,A mov dat15,A mov dat16,A mov dat17,A mov dat18,A mov dat19,A mov dat20,A setb SCL setb SDA ;zapisjem na port 1, pripravujem je na cteni mloop: jb SDA,mloop ; mov A,P1 ; anl A,#11000000b ; cjne A,#10000000b,mloop ; jb SDA,mloop jnb SCL,mloop ;cekame na podminku START na sbernici IIC call shin ;zjisti co prislom je to v A cjne A,#11110000b,mloop ;je to pro mne? F0h? call ack call shin ;zjisti co prislom je to v A mov adr,A call ack call shin ;zjisti co prislom je to v A call ack call nak stop: jnb SDA,stop jnb SCL,stop ;cekame na podminku STOP na sbernici IIC cjne adr,#10,da10 mov dat10,A ajmp mloop da10: cjne adr,#11,da11 mov dat11,A ajmp mloop da11: cjne adr,#12,da12 mov dat12,A ajmp mloop da12: cjne adr,#13,da13 mov dat13,A ajmp mloop da13: cjne adr,#14,da14 mov dat14,A ajmp mloop da14: cjne adr,#15,da15 mov dat15,A ajmp mloop da15: cjne adr,#16,da16 mov dat16,A ajmp mloop da16: cjne adr,#17,da17 mov dat17,A ajmp mloop da17: cjne adr,#18,da18 mov dat18,A ajmp mloop da18: cjne adr,#19,da19 mov dat19,A zaca: ajmp mloop da19: cjne adr,#20,da20 mov dat20,A da20: clr A xrl A,dat10 xrl A,dat11 xrl A,dat12 xrl A,dat13 xrl A,dat14 xrl A,dat15 xrl A,dat16 xrl A,dat17 xrl A,dat18 xrl A,dat19 mov crc,A cjne A,dat20,zaca ;CRC shodne s tim co doslo? mov znak,#'$' call pism mov znak,#'T' call pism mov znak,dat10 call pisme mov znak,dat11 call pisme mov znak,dat12 call pisme mov znak,dat13 call pisme mov znak,dat14 call pisme mov znak,dat15 call pisme mov znak,dat16 call pisme mov znak,dat17 call pisme mov znak,dat18 call pisme mov znak,dat19 call pisme ; mov znak,dat20 ; call pisme ; mov znak,crc ; call pisme mov znak,#13 call pism ; Enter ajmp mloop shin: ; Shift in a byte from the AT24Cxx, most significant bit first. ; SCL expected low on entry. Return with SCL low. ; Returns received data byte in A. push b mov b, #8 ; bit count x43: jb SCL,$ jnb SCL,$ ; cekame na platne hodiny nop mov C, SDA ; input bit rlc a ; move bit into byte djnz b, x43 ; next bit pop b ret ACK: ; Clock out an acknowledge bit (low). ; SCL expected low on entry. Return with SCL, SDA low. jb SCL,$ ; cekame na 0 clr SDA ; ACK bit jnb SCL,$ ; cekame na 1 nop nop setb SDA ;abychom mohli zase cist z portu ret NAK: jb SCL,$ jnb SCL,$ ; cekame na platne hodiny mov c,sda jb SCL,$ jnb SCL,$ ; cekame na platne hodiny ret pisme: mov A,znak mov B,A rr a rr a rr a rr a call konv mov A,B konv: anl A,#0Fh add A,#30h cjne A,#3Ah,ne_A mov A,#41h ;A ne_A: cjne A,#3Bh,ne_B mov A,#42h ;B ne_B: cjne A,#3Ch,ne_C mov A,#43h ;C ne_C: cjne A,#3Dh,ne_D mov A,#44h ;D ne_D: cjne A,#3Eh,ne_E mov A,#45h ;E ne_E: cjne A,#3Fh,ne_F mov A,#46h ;F ne_F: mov znak,A pism: mov A,znak ;vyslani znaku pres seriovy kanal MOV SBUF, A ; JNB TI, $ ; nop nop CLR TI ; ret ;stop: jnb SCL,stop nop nop nop nop ; jb SDA,stop ;cekame na podminku STOP na sbernici IIC end