module i2c_ee symbol sda = porta.0 'inserire qui pin assegnato ad sda symbol scl = porta.1 'inserire qui pin assegnato ad scl symbol direz_sda = trisa.0 'inserire qui bit direzione dati per sda symbol direz_scl = trisa.1 'inserire qui bit direzione dati per scl dim x, dato, conta, ack, nb, bit7, nr_chr as byte dim txt1 as char[16] dim indirizzo_soft as word dim indirizzo_hard, indiriz_low, indiriz_hi, control_code as byte sub procedure scrivo_ee() sub procedure leggo_ee() sub procedure start() sub procedure indirizzamento() sub procedure invia() sub procedure ack_rx() sub procedure stopp() sub procedure ricevi() sub procedure clock() implements '========== INIZIO PROCEDURA DI SCRITTURA ============ sub procedure scrivo_ee() direz_sda=0 direz_scl=0 ' direz. dati ' da qui inizio a scrivere l'indirizzo della eeprom start indirizzamento ' da qui inizio a scrivere 16 valori all'indirizzo specificato for conta = 0 to (nr_chr - 1) dato = txt1[conta] invia ack_rx ' verifico ack next conta stopp ' qui termino di scrivere i 16 valori. return end sub '========== TERMINE PROCEDURA DI SCRITTURA ============ '========== INIZIO PROCEDURA DI LETTURA ============ sub procedure leggo_ee() direz_sda=0 direz_scl=0 ' direz. dati ' da qui inizio a scrivere l'indirizzo della eeprom start indirizzamento ' da qui preparo la eeprom alla lettura start ' ripete start dato= control_code or indirizzo_hard or 1 ' seleziona dispoitivo in lettura invia ' trasmette dato ack_rx ' verifico ack dato = 0 conta = 0 ancora: ricevi ' ricevo 8 bit txt1[conta] = dato conta = conta + 1 if conta < nr_chr then direz_sda = 0 ' predispone sda come output sda = 0 clock ' invio_ack = 0 goto ancora else direz_sda = 0 ' predispone sda come output sda = 1 clock ' invio_ack = 1 end if stopp return end sub '===== TERMINE PROCEDURA DI LETTURA ============ '===== INIZIO DELLE SUB ROUTINE EEPROM ======== sub procedure ritardo() Delay_us(3) return end sub sub procedure clock() ritardo scl = 1 ritardo scl = 0 ritardo return end sub sub procedure ack_rx() sda = 1 direz_sda = 1 ' preparo sda come input ritardo ack = sda clock ' leggo ack direz_sda = 0 ' riprirtina sda come output ritardo return end sub sub procedure start() sda = 1 scl = 1 ritardo sda = 0 ritardo scl = 0 ritardo return end sub sub procedure stopp() sda = 0 ritardo scl = 1 ritardo sda = 1 ritardo return end sub sub procedure invia() direz_sda = 0 ' preparo sda come output For nb = 0 To 7 bit7 = dato and 128 If bit7 = 0 Then sda = 0 Else sda = 1 end if clock dato = dato << 1 Next nb return end sub sub procedure ricevi() dato=0 direz_sda = 1 ' preparo sda come input ritardo For nb = 0 To 7 dato = dato << 1 dato.0 = sda clock ' leggo bit in arrivo Next nb return end sub sub procedure indirizzamento() dato = control_code or indirizzo_hard 'identificativo + indirizzo_hard invia ' trasmette dato ack_rx ' verifico ack indiriz_hi = indirizzo_soft / 256 indiriz_low = indirizzo_soft mod 256 dato= indiriz_hi ' indirizzo alto invia ' trasmette dato ack_rx ' verifico ack dato= indiriz_low ' indirizzo basso invia ' trasmette dato ack_rx ' verifico ack return end sub '========FINE DELLE SUB ROUTINE EEPROM ========= end.