;internal RAM opmem1 equ 0x30 opmem2 equ 0x31 ;external RAM NVM_address_setup equ 0x111 ;NVM address, depending on wiring of 24Cxx A0-A2 pins ;------------------------------------------------------------------------------------------------------------------------- ;read: dptr: address acc: return value #nvm_address_setup: I2C address of chip ;write: dptr: address acc: value to store #nvm_address_setup: I2C address of chip ReadEEprom: clr ea ;all interrupt disable during read/write operation push opmem1 push opmem2 lcall RecallEEpAddress lcall WriteEEpAddr ; Write address setb SCL ; Preparation to IIC bus restart lcall iic_wait ReadEEpCurrent: lcall iic_start mov a,opmem2 setb acc.0 lcall iic_out lcall iic_in ; receive data byte setb c lcall iic_bitout lcall iic_stop pop opmem2 pop opmem1 setb ea ret WriteEEprom: clr ea push opmem1 push opmem2 push acc lcall RecallEEpAddress lcall WriteEEpAddr pop acc lcall iic_out lcall iic_stop mov a,#0xA lcall wait ; 10 ms waiting pop opmem2 pop opmem1 setb ea ret RecallEEpAddress: push dpl push dph mov dptr,#NVM_address_setup movx a,@dptr mov opmem2,a pop dph pop dpl ret WriteEEpAddr: ;writting device addr+ addr word lcall iic_start mov a,opmem2 clr acc.0 lcall iic_out mov a,dph ; high byte of address lcall iic_out mov a,dpl ; low byte of address lcall iic_out ret ;---------------------------------------------IIC protocoll---------------------------------- ;read: ; input: address: dptr0 ; output: data: a ; ;write: ; inputs: address: dptr0 ; data: a ;used registers: a,cy iic_out: ;sending one byte via IIC bus to EEprom mov opmem1,#8 ; bit counter iic_out1: rlc a ; move bit into carry lcall iic_bitout djnz opmem1,iic_out1 ; device ack is read iic_bitin: setb SDA lcall iic_wait setb SCL lcall iic_wait mov c,SDA ; input bit into carry lcall iic_wait clr SCL ljmp iic_wait iic_in: ;receiving one byte via IIC bus from EEprom mov opmem1,#8 ;bit counter iic_in1: lcall iic_bitin rlc a djnz opmem1,iic_in1 ret iic_bitout: mov SDA, c ; output bit from carry lcall iic_wait setb SCL lcall iic_wait clr SCL ljmp iic_wait iic_start: ;start condition clr SDA lcall iic_wait clr SCL ljmp iic_wait iic_stop: ;stop condition clr SDA lcall iic_wait setb SCL lcall iic_wait setb SDA iic_wait: ;wait nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ret WAIT: push acc mov a,#0 lwt1: nop nop nop nop nop nop nop dec a jnz lwt1 pop acc dec a jnz wait ret ;-------------------------------------------------------------------------------------------------------------------------