Progetto per PIC16c57 che monitorizza la situazione di un parcheggio privato.
Il sistema ha 4 ingressi a 1 bit ciascuno: UP, Down, Show e Clock e un’uscita a N bit Q.
Ogni volta che entra una macchina Up va ad 1 per un ciclo di clock, ogni volta che ne esce una va ad uno Down. Quando è attivo Show il sistema deve mostrare in uscita il numero di macchine attuali.
Il parcheggio può contenere al massimo 200 macchine e i segnali d’ingresso non possono mai essere contemporaneamente attivi.

; sistema di controllo parcheggio, max 200 macchine
; per ogni Up incrementa, Down decrementa, Show mostra lo stato (Q)
; 4 entrate: UP, Down, Show, Clock
; 1 uscita da 8 bit
; RA<0> : UP ; RA<1> : DOWN ; RA<2> : SHOW; RC<0> : CK
; l'incremento e il decremento devono essere mutuamente escludenti per un ciclo di ck
list p=16c57
#include

__CONFIG _XT_OSC & _CP_OFF & _WDT_OFF

RADIX DEC
UP EQU 0
DOWN EQU 1
SHOW EQU 2
CK EQU 0 ; sulla porta C
MAX EQU 200
CKP EQU 0x08
Q EQU 0x09

ORG 0x7FF
GOTO START

ORG 0x00
START
CLRW
TRIS PORTB ; output
MOVLW b'0111'
TRIS PORTA ; 3 ingressi
CLRF Q
MOVLW 1
TRIS PORTC ; RC<0> = IN DI CK
MOVF PORTC,W
MOVWF CKP ; salva il CK di partenza (bit 3)

MAINLOOP
BTFSC PORTA,SHOW
GOTO STAMPA ; MOSTRA Q SE SHOW=1
BTFSC PORTA,UP
GOTO INC ; INCREMENTA Q SE UP=1
BTFSC PORTA,DOWN
GOTO DEC
GOTO WAIT

WAIT
MOVF PORTC,W ; metto il ciclo attuale nell'accumulatore
SUBWF CKP,0 ; confronta i due valori di clock
BTFSC STATUS,Z
GOTO WAIT ; se uguali attendi
MOVF PORTC,CKP
GOTO MAINLOOP ; se diversi torna a controllare

STAMPA
MOVF Q,PORTB ; mostra q al pubblico
GOTO WAIT

INC
MOVF MAX,W
SUBWF Q,0
BTFSC STATUS,Z
GOTO WAIT ; parcheggio pieno
INCF Q,1
GOTO WAIT
DEC
BTFSS Q,0
GOTO WAIT; parcheggio già vuoto
DECF Q,1
GOTO WAIT

END