;****************************************************************************** Start .title "Prog ST6 (A.d.p. Gusmini Claudio 5^Ben 2004/2005)" ;****************************************************************************** Dichiarazione & impostazione variabili ;---------------------------------- Registri x .def 080h ; Decodificazione tasto premuto y .def 081h ; Contatore nelle subroutine di ritardo v .def 082h ; Ripristino port B dopo cambio codice w .def 083h ; Ripristino accumulatore dopo subroutine di ritardo ;---------------------------------- Port data register dra .def 0c0h drb .def 0c1h drc .def 0c2h ;---------------------------------- Port direction register ddra .def 0c4h ddrb .def 0c5h ddrc .def 0c6h ;---------------------------------- Port option register ora .def 0cch orb .def 0cdh orc .def 0ceh ;---------------------------------- WatchDog register dwdr .def 0d8h ;---------------------------------- Accumulatore a .def 0ffh ;---------------------------------- Variabili cod1 .def 084h ; Primo numero del codice cod2 .def 085h ; Secondo numero del codice cod3 .def 086h ; Terzo numero del codice cod4 .def 087h ; Quarto numero del codice cod5 .def 088h ; Quinto numero del codice cont .def 089h ; Contatore numeri inseriti err .def 08ah ; Segnalatore di errori nel codice inserito sg .def 08bh ; Segnalatore di sgami codprv1 .def 08ch ; Primo numero del codice provvisorio nel cambio codice codprv2 .def 08dh ; Secondo numero del codice provvisorio nel cambio codice codprv3 .def 08eh ; Terzo numero del codice provvisorio nel cambio codice codprv4 .def 08fh ; Quarto numero del codice provvisorio nel cambio codice codprv5 .def 090h ; Quinto numero del codice provvisorio nel cambio codice contcamb .def 091h ; Contatore numeri inseriti nel cambio codice errcamb .def 092h ; Segnalatore di diversità tra i 2 codici del cambio codice ;---------------------------------- Program counter partenza prog .org 080h ;---------------------------------- Partenza da vettore reset reset: ldi dwdr,0ffh reti ;---------------------------------- Impostazione port ldi ddra,00h ; Port A = ingresso standard --> Sensori (0-3), Colonne (4-7) ldi ora,00h ldi dra,0ffh ldi ddrb,0ffh ; Port B = uscita push-pull --> Righe (0-3), Led VGR (4-6), Buzzer (7) ldi orb,0ffh ldi ddrc,0ffh ; Port C = uscita push-pull --> Allarme (4) ldi orc,0ffh ;---------------------------------- Impostazione variabili ldi cod1,00000000b ; Impostazione primo numero del codice (1) ldi cod2,00000001b ; Impostazione secondo numero del codice (2) ldi cod3,00000010b ; Impostazione terzo numero del codice (3) ldi cod4,00000100b ; Impostazione quarto numero del codice (4) ldi cod5,00000101b ; Impostazione quinto numero del codice (5) ldi drb,00h ; Azzeramento righe (PB0-3), led VGR (PB4-6) e buzzer (PB7) ldi drc,00h ; Azzeramento allarme (PC4,PC5) ldi x,00h ; Azzeramento tasto premuto (0-15) ldi cont,00h ; Azzeramento contatore numeri inseriti ldi err,00h ; Azzeramento segnalatore errori nel codice inserito ldi sg,00h ; Azzeramento segnalatore di sgami ldi codprv1,0ffh ; Azzeramento primo numero del codice provvisorio ldi codprv2,0ffh ; Azzeramento secondo numero del codice provvisorio ldi codprv3,0ffh ; Azzeramento terzo numero del codice provvisorio ldi codprv4,0ffh ; Azzeramento quarto numero del codice provvisorio ldi codprv5,0ffh ; Azzeramento quinto numero del codice provvisorio ldi contcamb,00h ; Azzeramento contatore numeri inseriti nel cambio codice ldi errcamb,00h ; Azzeramento segnalatore di diversità tra i 2 codici nel cambio codice ;---------------------------------- Segnali in avvio call rit50 call rit50 call rit50 set 5,drc call rit50 call rit50 call rit50 res 5,drc set 4,drb ; Led verde 0,1 sec call rit50 call rit50 call rit50 res 4,drb set 5,drb ; Led giallo 0,1 sec call rit50 call rit50 call rit50 res 5,drb set 6,drb ; Led rosso 0,1 sec call rit50 call rit50 call rit50 res 6,drb call beep ; Doppio beep call rit50 call rit50 call rit50 call beep ;****************************************************************************** PROGRAMMA! ;---------------------------------- Controllo x pressione tasto main: ldi dwdr,0ffh res 3,drb res 2,drb res 1,drb set 0,drb jrs 4,dra,read jrs 5,dra,read jrs 6,dra,read jrs 7,dra,read res 0,drb set 1,drb jrs 4,dra,read jrs 5,dra,read jrs 6,dra,read jrs 7,dra,read res 1,drb set 2,drb jrs 4,dra,read jrs 5,dra,read jrs 6,dra,read jrs 7,dra,read res 2,drb set 3,drb jrs 4,dra,read jrs 5,dra,read jrs 6,dra,read jrs 7,dra,read jrr 5,drb,main ; Esegue scansione dei sensori se antifurto = set jrs 0,sg,main ; Inibisce scansione dei sensori se ci sono stati sgami ;---------------------------------- Scansione sensori jrr 0,dra,sgamo jrr 1,dra,sgamo jrr 2,dra,sgamo jrr 3,dra,sgamo jp main ;---------------------------------- SGAMATO!!! sgamo: ldi dwdr,0ffh call beep set 0,sg ; sgami = set set 4,drb ; Led verde set 6,drb ; Led rosso (Led giallo già set) set 4,drc ; Attivazione sirena call rit50 call rit50 res 4,drc jp main ;---------------------------------- Decodificazione in x del tasto premuto (numero) read: ldi dwdr,0ffh ldi x,00h jrs 7,dra,abcd ; Se colonna delle lettere = set vai alla decodifica della lettera inc cont jrs 0,drb,riga1 jrs 1,drb,riga2 jrs 2,drb,riga3 jrs 3,drb,riga4 riga1: res 3,x res 2,x jrs 4,dra,col1 jrs 5,dra,col2 jrs 6,dra,col3 riga2: res 3,x set 2,x jrs 4,dra,col1 jrs 5,dra,col2 jrs 6,dra,col3 riga3: set 3,x res 2,x jrs 4,dra,col1 jrs 5,dra,col2 jrs 6,dra,col3 riga4: set 3,x set 2,x jrs 4,dra,col1 jrs 5,dra,col2 jrs 6,dra,col3 col1: res 1,x res 0,x jp ctrl col2: res 1,x set 0,x jp ctrl col3: set 1,x res 0,x jp ctrl abcd: jp abcd2 ; jp di passaggio ;---------------------------------- Controllo codice (x5) ctrl: ldi dwdr,0ffh call beep ld a,cont cpi a,01h jrnz ctrl2 ld a,x cp a,cod1 jrnz err1 call attendi jp main err1: set 0,err call attendi jp main ctrl2: ld a,cont cpi a,02h jrnz ctrl3 ld a,x cp a,cod2 jrnz err2 call attendi jp main err2: set 0,err call attendi jp main ctrl3: ld a,cont cpi a,03h jrnz ctrl4 ld a,x cp a,cod3 jrnz err3 call attendi jp main err3: set 0,err call attendi jp main ctrl4: ld a,cont cpi a,04h jrnz ctrl5 ld a,x cp a,cod4 jrnz err4 call attendi jp main err4: set 0,err call attendi jp main ctrl5: ld a,cont cpi a,05h jrnz err5 ld a,x cp a,cod5 jrnz err5 call attendi jp main err5: set 0,err call attendi jp main ;---------------------------------- Codice esatto codex: ldi dwdr,0ffh ldi cont,00h ; Azzeramento contatore res 0,err ; Azzeramento errori res 0,sg ; Azzeramento sgami res 6,drb ; Spegne Led rosso set 4,drb ; Led verde 2 sec call rit2 res 4,drb jrr 5,drb,attiva ; Commuta Led giallo (attiva/disattiva antifurto) set 5,drc ; Spegne la sirena se accesa res 5,drb call rit50 call rit50 call rit50 res 5,drc jp main attiva: jrr 0,dra,codex2 ; Attiva l'antifurto solo se i sensori sono ok jrr 1,dra,codex2 jrr 2,dra,codex2 jrr 3,dra,codex2 set 5,drb codex2: jp main ;---------------------------------- Codice errato coder: ldi dwdr,0ffh ldi cont,00h ; Azzeramento contatore res 0,err ; Azzeramento errori res 4,drb ; Spegne Led verde set 6,drb ; Led rosso 2 sec call rit2 jrs 0,sg,cersg ; Se sgami = set riaccendi Led verde e Led rosso res 6,drb jp main cersg: set 4,drb jp main ;---------------------------------- Decodificazione in x del tasto premuto (lettera) abcd2: ldi dwdr,0ffh set 1,x set 0,x jrs 0,drb,leta jrs 1,drb,letb jrs 2,drb,letc jrs 3,drb,letd leta: res 4,x ; Lettera A (invio codice) res 3,x call beep ld a,cont cpi a,00h jrz leta2 cpi a,01h jrz leta2 cpi a,02h jrz leta2 jrnz leta3 leta2: jp leta5 ; jp di passaggio leta3: cpi a,03h jrz leta5 cpi a,04h jrz leta5 call attendi jrs 0,err,coder ; Se errori = set vai a Codice errato jrr 0,err,leta4 ; Se errori = res vai a Codice esatto leta4: jp codex ; jp di passaggio leta5: call attendi jp coder ; Se contatore < 5 vai a Codice errato letb: res 4,x ; Lettera B (ripristina normalità dopo sgamo) set 3,x call beep jrs 0,sg,letb2 call attendi jp main letb2: jrr 0,dra,letb3 ; Riattiva la scansione solo se i sensori sono ok jrr 1,dra,letb3 jrr 2,dra,letb3 jrr 3,dra,letb3 ldi cont,00h res 0,err res 0,sg res 4,drb ; Spegne il led verde res 6,drb ; Spegne il led rosso letb3: call attendi jp main letc: set 4,x ; Lettera C (azzera numeri inseriti) res 3,x call beep ldi cont,00h res 0,err call attendi jp main letd: set 4,x ; Lettera D (cambio codice) set 3,x call beep ld a,cont cpi a,00h jrz letd2 cpi a,01h jrz letd2 cpi a,02h jrz letd2 cpi a,03h jrz letd2 cpi a,04h jrz letd2 jrr 0,err,letd3 letd2: call attendi jp coder ;---------------------------------- Cambio codice letd3: ldi contcamb,00h ldi errcamb,00h call attendi ld a,drb ld v,a res 6,drb ; Spegne Led rosso res 5,drb ; Spegne Led giallo set 4,drb ; Led verde 2 sec call rit2 res 4,drb call rit50 call rit50 call rit50 set 4,drb ; 3 Led 0,1 sec + beep set 5,drb set 6,drb call beep res 4,drb res 5,drb res 6,drb call rit50 call rit50 call rit50 set 4,drb ; 3 Led 0,1 sec + beep set 5,drb set 6,drb call beep res 4,drb res 5,drb res 6,drb cambcd: ldi dwdr,0ffh ; Scansione tastiera res 3,drb res 2,drb res 1,drb set 0,drb jrs 4,dra,rdnwcd jrs 5,dra,rdnwcd jrs 6,dra,rdnwcd jrs 7,dra,notnr res 0,drb set 1,drb jrs 4,dra,rdnwcd jrs 5,dra,rdnwcd jrs 6,dra,rdnwcd jrs 7,dra,notnr res 1,drb set 2,drb jrs 4,dra,rdnwcd jrs 5,dra,rdnwcd jrs 6,dra,rdnwcd jrs 7,dra,cancod res 2,drb set 3,drb jrs 4,dra,rdnwcd jrs 5,dra,rdnwcd jrs 6,dra,rdnwcd jrs 7,dra,notnr jp cambcd notnr: call beep ; Lettera A, B o D (solo beep) call attendi jp cambcd cancod: call beep ; Lettera C (azzera numeri inseriti) ldi contcamb,00h res 0,errcamb call attendi jp cambcd rdnwcd: ldi dwdr,0ffh ; Decodificazione in x del numero premuto ldi x,00h inc contcamb jrs 0,drb,r1 jrs 1,drb,r2 jrs 2,drb,r3 jrs 3,drb,r4 r1: res 3,x res 2,x jrs 4,dra,c1 jrs 5,dra,c2 jrs 6,dra,c3 r2: res 3,x set 2,x jrs 4,dra,c1 jrs 5,dra,c2 jrs 6,dra,c3 r3: set 3,x res 2,x jrs 4,dra,c1 jrs 5,dra,c2 jrs 6,dra,c3 r4: set 3,x set 2,x jrs 4,dra,c1 jrs 5,dra,c2 jrs 6,dra,c3 c1: res 1,x res 0,x jp mem c2: res 1,x set 0,x jp mem c3: set 1,x res 0,x jp mem mem: ldi dwdr,0ffh ; Memorizzazione nuovo codice (x5) (x2) call beep jrs 7,codprv1,memprv ; Se il codice provvisorio non è ancora stato inserito vai alla memorizzazione del codice provvisorio jrs 7,codprv2,memprv jrs 7,codprv3,memprv jrs 7,codprv4,memprv jrs 7,codprv5,memprv ld a,contcamb cpi a,01h jrnz mem2 ld a,x cp a,codprv1 ; Confronta il primo numero del secondo codice col codice provvisorio jrnz coddiv1 call attendi jp cambcd coddiv1: set 0,errcamb call attendi jp cambcd mem2: ld a,contcamb cpi a,02h jrnz mem3 ld a,x cp a,codprv2 ; Confronta il secondo numero del secondo codice col codice provvisorio jrnz coddiv2 call attendi jp cambcd coddiv2: set 0,errcamb call attendi jp cambcd mem3: ld a,contcamb cpi a,03h jrnz mem4 ld a,x cp a,codprv3 ; Confronta il terzo numero del secondo codice col codice provvisorio jrnz coddiv3 call attendi jp cambcd coddiv3: set 0,errcamb call attendi jp cambcd mem4: ld a,contcamb cpi a,04h jrnz mem5 ld a,x cp a,codprv4 ; Confronta il quarto numero del secondo codice col codice provvisorio jrnz coddiv4 call attendi jp cambcd coddiv4: set 0,errcamb call attendi jp cambcd mem5: call attendi ld a,x cp a,codprv5 ; Confronta il quinto numero del secondo codice col codice provvisorio jrnz cddv5 jrz cdok5 cddv5: jp coddiv5 memprv: jp memprv1 ; jp di passaggio cdok5: jrs 0,errcamb,coddiv5 ; Se errori = set vai a Codice diverso set 5,drb ; Led giallo 2 sec call rit2 res 5,drb call rit50 call rit50 call rit50 set 4,drb ; Led verde 0,1 sec + beep call beep res 4,drb call rit50 call rit50 call rit50 set 4,drb ; Led verde 0,1 sec + beep call beep res 4,drb call rit2 ld a,codprv1 ; Sostituzione vecchio codice ld cod1,a ld a,codprv2 ld cod2,a ld a,codprv3 ld cod3,a ld a,codprv4 ld cod4,a ld a,codprv5 ld cod5,a ldi codprv1,0ffh ; Azzeramento variabili ldi codprv2,0ffh ldi codprv3,0ffh ldi codprv4,0ffh ldi codprv5,0ffh res 0,errcamb ldi contcamb,00h res 0,err ldi cont,00h ld a,v ; Ripristina Port B ld drb,a jp main coddiv5: set 5,drb ; Codici non corrispondenti call rit2 ; Led giallo 2 sec res 5,drb call rit50 call rit50 call rit50 set 6,drb ; Led rosso 0,1 sec + beep call beep res 6,drb call rit50 call rit50 call rit50 set 6,drb ; Led rosso 0,1 sec + beep call beep res 6,drb call rit2 ldi codprv1,0ffh ; Azzeramento variabili ldi codprv2,0ffh ldi codprv3,0ffh ldi codprv4,0ffh ldi codprv5,0ffh res 0,errcamb ldi contcamb,00h res 0,err ldi cont,00h ld a,v ; Ripristina Port B ld drb,a jp main memprv1: ld a,contcamb ; Memorizzazione codice provvisorio cpi a,01h jrnz memprv2 ld a,x ld codprv1,a call attendi jp cambcd memprv2: ld a,contcamb cpi a,02h jrnz memprv3 ld a,x ld codprv2,a call attendi jp cambcd memprv3: ld a,contcamb cpi a,03h jrnz memprv4 ld a,x ld codprv3,a call attendi jp cambcd memprv4: ld a,contcamb cpi a,04h jrnz memprv5 ld a,x ld codprv4,a call attendi jp cambcd memprv5: ld a,x ld codprv5,a call attendi set 5,drb ; Led giallo 2 sec call rit2 res 5,drb ldi contcamb,00h jp cambcd ;****************************************************************************** Subroutine call ;---------------------------------- Call attendi (+ rit50 per antirimbalzo) attendi: ldi dwdr,0ffh jrs 4,dra,attendi jrs 5,dra,attendi jrs 6,dra,attendi jrs 7,dra,attendi ;---------------------------------- Call rit50 rit50: ld w,a ldi y,07h rit51: ldi a,0ffh rit52: ldi dwdr,0ffh dec a cpi a,0 jrnz rit52 dec y ld a,y cpi a,0 jrnz rit51 ld a,w ret ;---------------------------------- Call rit2 rit2: ld w,a ldi y,0ffh rit21: ldi a,0ffh rit22: ldi dwdr,0ffh dec a cpi a,0 jrnz rit22 dec y ld a,y cpi a,0 jrnz rit21 ld a,w ret ;---------------------------------- Call beep beep: ldi dwdr,0ffh set 7,drb call rit50 call rit50 call rit50 res 7,drb ret ;****************************************************************************** Fine ;---------------------------------- Subroutine reset .org 0ffeh jp reset .end