;=======================================================
; Проект 34. Логгер показаний в EEPROM
; PIC16F84A, 4 МГц. Кнопка RA0 — записать значение,
; кнопка RA1 — пролистать записи, вывод на RB0..RB7
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        d1, d2, wraddr, rdaddr, value
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0
        clrf    TRISB
        movlw   b'00011111'
        movwf   TRISA
        bcf     STATUS,RP0
        clrf    wraddr
        clrf    rdaddr
        clrf    value

Main
        incf    value,f         ; имитация измеряемой величины
        movf    value,w
        movwf   PORTB

        btfss   PORTA,0
        call    SaveValue
        btfss   PORTA,1
        call    ReadNext
        call    Delay
        goto    Main

;--- запись текущего значения в EEPROM ---
SaveValue
        call    Debounce
        btfsc   PORTA,0
        return
        movf    wraddr,w
        bsf     STATUS,RP0
        movwf   EEADR
        bcf     STATUS,RP0
        movf    value,w
        bsf     STATUS,RP0
        movwf   EEDATA
        bsf     EECON1,WREN     ; разрешаем запись
        movlw   0x55            ; обязательная последовательность
        movwf   EECON2
        movlw   0xAA
        movwf   EECON2
        bsf     EECON1,WR       ; старт записи
WWait
        btfsc   EECON1,WR       ; ждём окончания
        goto    WWait
        bcf     EECON1,WREN
        bcf     STATUS,RP0
        incf    wraddr,f        ; следующая ячейка
        movlw   .64
        subwf   wraddr,w
        btfsc   STATUS,C
        clrf    wraddr          ; по кругу: у 16F84A 64 байта EEPROM
WRel
        btfss   PORTA,0
        goto    WRel
        return

;--- чтение очередной записи ---
ReadNext
        call    Debounce
        btfsc   PORTA,1
        return
        movf    rdaddr,w
        bsf     STATUS,RP0
        movwf   EEADR
        bsf     EECON1,RD       ; чтение
        bcf     STATUS,RP0
        bsf     STATUS,RP0
        movf    EEDATA,w
        bcf     STATUS,RP0
        movwf   PORTB           ; показываем сохранённое значение
        incf    rdaddr,f
        movlw   .64
        subwf   rdaddr,w
        btfsc   STATUS,C
        clrf    rdaddr
        call    DelayLong
RRel
        btfss   PORTA,1
        goto    RRel
        return

Debounce
        movlw   .26
        movwf   d1
DB1     movlw   .255
        movwf   d2
DB2     decfsz  d2,f
        goto    DB2
        decfsz  d1,f
        goto    DB1
        return

Delay
        movlw   .150
        movwf   d1
DA1     movlw   .250
        movwf   d2
DA2     nop
        decfsz  d2,f
        goto    DA2
        decfsz  d1,f
        goto    DA1
        return

DelayLong
        call    Delay
        call    Delay
        call    Delay
        return

        END
