uint16_t ReadWrite_HEFlash(uint8_t rw, uint16_t data, uint8_t rowstartaddr) { uint8_t addr; Save_INTERRUPT(); if (rw == 1) { addr = rowstartaddr; } else { addr = (rowstartaddr + 0xF); } uint8_t cnt; //Poszukiwanie pierwszej wolnej strony w wierszu for (cnt = 0x10; cnt != 0x0; cnt--) { Read_FLASH(addr); //Odczytaj pamięć if (rw == 1) { //Jeśli prowadzony jest zapis if (PMDATH == 0x3F) { //Sprawdź, czy strona jest dostępna (czy jej treść zawiera 14 jedynek PMDAT = data; //Przygotuj dane użytkownika do zapisu asm(„bsf PMDATH, 5”); //Ustaw flagę zapisu fragmentu pamięci FPM asm(„bcf PMDATH, 4”); Write_FLASH(); //Zapisz pamięć break; } addr++;//przejdź do kolejnej strony //Sprawdź czy cały wiersz został już zapisany if (cnt <= 0x1) { //Jeśli został zapisany cały wiersz, zostanie on teraz wyczyszczony PMCON1 = 0b00010100; PMADR = rowstartaddr; Unlock_FLASH(); //Zapis danych użytkownika po wyczyszczeniu PMDAT = data; //Przygotuj dane użytkownika do zapisu asm(„bsf PMDATH, 5”); //Ustaw flagę zapisu fragmentu pamięci FPM asm(„bcf PMDATH, 4”); Write_FLASH(); //Zapisz pamięć } } else { //W przypadku odczytu odnajdź ostatnią zapisaną stronę if ((PMDATH & 0x20) && (PMDATH != 0x3F)) { //Sprawdź czy strona jest zapisana data = (PMDAT & 0xFFF); //Odczytaj dane ze strony break; } addr--;//przejdź do wcześniej strony } INTCON = SaveInt; } return data; } void Save_INTERRUPT(void) {//Wstrzymywanie obsługi przerwań SaveInt = INTCON; GIE = 0; } void Read_FLASH(uint8_t address) { PMADR = address; PMCON1 = 0b00000001; //Ustawianie operacji na odczyt pamięci Flash while (RD); } void Unlock_FLASH(void) { PMCON2 = 0x55; //Przygotowywanie pamięci do czyszczenia PMCON2 = 0xAA; WR = 1; while (WR); WREN = 0; } void Write_FLASH(void) { //PMCON1 = 0b00100100; //Unlock_FLASH(); PMCON1 = 0b00000100; Unlock_FLASH(); }