Sistem Anti-Efracţie
Introducere | Descriere structurala
Descrierea componentelor Sistemului Anti-Efractie | Descriere hardware
Descrierea functionala a Sistemului Anti-Efractie | Soft comentat
Bibliografie

 

 

;variabile
dseg
;liniile si coloanele tastaturii
LD EQU P2.6
LC EQU P2.5
LB EQU P2.4
LA EQU P2.3
KPD EQU P2

;tasta * - 3BH
;tasta # - 3EH

D7 EQU p0.7
E EQU p1.0
RS EQU p1.3
RW EQU p1.2
DAT EQU p0

;cifrele codului
c1 DATA 30H
c2 DATA 31H
c3 DATA 32H
c4 DATA 33H
;cifrele noi ale codului
cn1 DATA 34H
cn2 DATA 35H
cn3 DATA 36H
cn4 DATA 37H

cseg
str1: DB 'INACTIV',0
str2: DB 'ARMAT', 0
str3: db 'ALERTA!', 0
str4: db 'USA 1', 0
str5: db 'USA 2', 0
str6: db 'FEREASTRA', 0
str7: db 'CONFIGURARE', 0
str8: db 'INTRODUCETI', 0
str9: db 'COD NOU:', 0
str10: db 'SCHIMBARE', 0
str11: db 'EFECTUATA', 0

ORG 00H
JMP start
ORG 03H ;INT0 butonul de panica
JMP buton
ORG 1BH
JMP tmr1 ;numara 5 secunde
ORG 38H

start:
;activare/configurare sistem intreruperi
MOV IE, #10001111B
SETB IT0
;activare/configurare ceasuri
MOV TMOD, #00100000B

;valorile codului - implicit 0
MOV c1, #00111101b ;cod prima cifra
MOV c2, #00111101b ;cod a doua cifra
MOV c3, #00111101b ;cod a treia cifra
MOV c4, #00111101b ;cod a patra cifra
;valori cod nou
MOV cn1, #00111101b ;cod nou prima cifra
MOV cn2, #00111101b ;cod nou a doua cifra
MOV cn3, #00111101b ;cod nou a treia cifra
MOV cn4, #00111101b ;cod nou a patra cifra

;initializari
MOV R0, #0 ;adresa la care se afla cifra codului
MOV R1, #0
MOV R2, #0 ;codul tastei apasate
MOV R3, #0 ;contor ceasuri
MOV R4, #0 ;nr de secunde/minute
MOV R5, #0 ;contor delay
MOV R6, #0
MOV R7, #0 ;registru contor validitate cod
LCALL init
JMP standby

standby:
LCALL af_inactiv ;afiseaza INACTIV
SETB p1.1 ;led stins

;se asteapta apasarea unei taste. daca e *, armeaza
;daca e alta tasta, verifica validitatea codului si in cazul
;apasarii tastei #, intra in configurare
LCALL cod
CJNE R2, #3BH, standby_end
MOV R5, #24
CALL delay2min
JMP armare

standby_end:
CJNE R7, #0, standby
;daca s-a apasat # intra in configurare
CJNE R2, #3EH, standby
LJMP config

delay2min:
SETB tr1
DJNZ R5,delay2min
RET

tmr1:
INC R3 ;contor
;pt un cristal cu frecventa 11.059MHz
;65.536 * 14 / 921.583 ~ 1 sec
CJNE R3, #14, tmr1
INC R4 ;nr secunde = 5 secunde
MOV R3, #0
CJNE R4, #5, timer1_end
MOV R4, #0
timer1_end:
RETI

buton:
SETB p3.2
JMP act_alarma ;porneste alarma
RETI

armare:
LCALL af_armat ;afiseara ARMAT
CLR p1.1 ;aprinde ledul de control

;verificare senzori: 1 activ
JB p1.4, delay
JB p1.5, delay
JB p1.6, delay

;iesirea din starea de armare se face prin cod valid
;verifica daca s-a introdus codul corect
LCALL cod
;daca s-a apasat * verifica validit cod; daca nu, inapoi
CJNE R2, #3BH, armare
;daca se introduce un cod invalid de 3 ori, se porneste alarma
CJNE R7, #0, ver1
JMP standby

delay:
SETB tr1 ;porneste timer
;asteapta 20 secunde
INC R5
CJNE R5, #4, delay
JMP act_alarma ;porneste alarma

ver1:
LCALL cod
CJNE R2, #3BH, armare
CJNE R7, #0, ver2
JMP standby

ver2:
LCALL cod
CJNE R2, #3BH, armare
CJNE R7, #0, act_alarma
JMP standby

act_alarma:
CLR p1.7 ;se porneste alarma
LCALL af_alerta ;afiseaza ALERTA
LCALL af_unde ;afiseaza unde s-a deconectat senzorul
CPL p1.1 ;ledul palpaie

;iesirea din starea de alarma activa se face prin cod valid
;verifica daca s-a introdus codul corect si *
LCALL cod
CJNE R2, #3BH, act_alarma
CJNE R7, #0, act_alarma
JMP opreste

af_unde:
JB p1.4, unde1
JB p1.5, unde2
JB p1.6, unde3
JMP undend
unde1:
LCALL af_usa1
JMP undend
unde2:
LCALL af_usa2
JMP undend
unde3:
LCALL af_fer
JMP undend
undend:
RET


opreste:
SETB p1.7 ;opreste alarma
CLR p1.4 ;dezactiveaza semnalele de la senzori
CLR p1.5
CLR p1.6
LJMP standby

;----------------------------------------------------------------
cod:
;la sfarsitul rutinei, daca R7 contine val 0, codul e valid
;in R2 ramane codul ultimei taste apasate sau 0 daca nu s-a apasat nici o tasta
;daca codul a fost valid si nu s-a apasat ultima tasta (in cazul de fata *),
;atunci in R2 returneaza 0 si codul nu este folosit (in starile principale)

MOV R7, #4
MOV R5, #3 ;contor

CALL keypad
;daca prima tasta apasata e *, atunci iese si returneaza R2 = *
;(aceasta optiune se foloseste pt armare)
;daca nu, se continua cu verificarea codului
CJNE R2, #3BH, cifra1
JMP cod_end

cifra1:
;prima cifra
MOV A, R2 ;pune in A codul tastei apasate
MOV R0, #c1 ;pune in R0 adresa codului primei cifre
XRL A, @R0
JNZ cifra234
DEC R7 ;daca cifra e corecta, decrem R7
JMP cifra234

cifra234:
CALL keypad
MOV A, R2 ;pun in A codul tastei apasate
INC R0 ;pun in R0 adresele urm cifre
XRL A, @R0
JNZ cifra234_end
DEC R7 ;daca cifra e corecta, decrem R7
JMP cifra234_end

cifra234_end:
DJNZ R5, cifra234
;ultima tasta face selectia intre moduri si trebuie retinuta in R2
CALL keypad
JMP cod_end

cod_end:
RET

;----------------------------------------------------------------------
;scanarea tastaturii - returneaza daca o tasta a fost apasata
;si pune in R2 codul tastei respective
;daca nu a fost apasata nici o tasta, in R2 va fi 0
;pinul p2.7 este mereu 0
;daca ultimii 3 biti din p2 sunt 1, atunci nici o tasta nu a fost apasata

keypad:
CALL scanare
MOV A, R2
XRL A, #0
JZ keypad
RET

scanare:
MOV KPD, #7Fh ;initializare port

CLR LA ;citirea primei linii
MOV A, KPD
SETB LA
CJNE A, #01110111b, retcode ;verifica daca s-a apasat o tasta
;daca da, returneaza codul tastei in R2
;daca nu, trece la urmatorul rand

MOV KPD, #7Fh ;initializare port

CLR LB ;citirea liniei a doua
MOV A, KPD
SETB LB
CJNE A, #01101111b, retcode ;verifica daca s-a apasat o tasta
;daca da, returneaza codul tastei in R2
;daca nu, trece la urmatorul rand

MOV KPD, #7Fh ;initializare port

CLR LC ;citirea liniei a treia
MOV A, KPD
SETB LC
CJNE A, #01011111b, retcode ;verifica daca s-a apasat o tasta
;daca da, returneaza codul tastei in R2
;daca nu, trece la urmatorul rand

MOV KPD, #7Fh ;initializare port

CLR LD ;citirea liniei a patra
MOV A, KPD
SETB LD
CJNE A, #00111111b, retcode ;verifica daca s-a apasat o tasta
;daca da, returneaza codul tastei in R2
;daca nu, intoarce 0

MOV A, #0
JMP retcode

retcode:
MOV KPD, #7Fh
MOV R2, A ;returneaza in R2 codul tastei apasate
RET

;----------------------------------------------------------
;functiile de lucru cu LCD

;subrutine folosite:
;init - initializarea LCD pentru transfer pe 8 biti
;wait - asteapta terminarea operatiunilor interne ale LCD
;clear - stregere display
;wrcmd - scriere comanda
;wrdat - scriere date

;initializare LCD
init:
;trimite la LCD comanda #38H care seteaza urmatoarele:
;display on, nr linii display = 2, font = 5x8
MOV A, #38H
LCALL wrcmd
CALL delay4ms
MOV A, #38H
CALL wrcmd
NOP
nop
nop
nop
MOV A, #38H
LCALL wrcmd
MOV A, #08H ;display off
LCALL wrcmd
MOV A, #01H ;display clear
LCALL wrcmd
MOV A, #04H ;setare mod
LCALL wrcmd
MOV A, #0CH ;seteaza: blink off, cursor off, display on
LCALL wrcmd
MOV A, #01H ;clear
LCALL wrcmd
RET

wrcmd:
SETB E
CLR RS ;comanda
CLR RW ;scriere
MOV DAT, A
NOP
nop
nop
CLR E
RET

wrdat:
SETB E
SETB RS ;date
CLR RW ;scriere
MOV DAT, A
nop
nop
nop
CLR E
RET

wait:
;verifica busy flag (D7):
;daca BF = 0, LCD e liber ;daca BF = 1, LCD e ocupat
SETB E
CLR RS ;comanda
SETB RW ;citire
JB D7, wait
CLR E
RET

clear:
MOV A, #01H ;display clear
LCALL wrcmd
RET

delay4ms:
MOV R3, #04H
del:
DJNZ R3, del
RET

af_string:
;se afiseaza un string de caractere terminat in null
;se scrie caracter cu caracter
CLR A
MOVC A,@A+DPTR
JZ af_end
LCALL wait
LCALL wrdat
INC DPTR
JMP af_string
af_end:
RET

;---------------------------------------------

af_inactiv:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str1
;mov R6, #7
LCALL af_string
POP dpl
POP dph
RET


af_armat:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str2
LCALL af_string
pop dpl
pop dph
RET

af_alerta:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str3
LCALL af_string
POP dpl
POP dph
RET

af_usa1:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str4
LCALL af_string
POP dpl
POP dph
RET

af_usa2:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str5
LCALL af_string
POP dpl
POP dph
RET

af_fer:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str6
LCALL af_string
POP dpl
POP dph
RET

af_config:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str7
LCALL af_string
POP dpl
POP dph
RET

af_intr:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str8
LCALL af_string
POP dpl
POP dph
RET

af_codnou:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str9
LCALL af_string
POP dpl
POP dph
RET

af_sch:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str10
LCALL af_string
POP dpl
POP dph
RET

af_ef:
LCALL clear
PUSH dph
PUSH dpl
MOV DPTR, #str11
LCALL af_string
POP dpl
POP dph
RET

;------------------------------------

config:
LCALL af_config ;afiseaza CONFIGURARE
SETB p1.1 ;led stins

;se asteapta apasarea unei taste. daca e *
;asteapta introducerea unui nou cod
LCALL cod
CJNE R2, #3BH, config
JMP cod_nou

cod_nou:
;in R2 ramane codul ultimei taste apasate sau 0 daca nu s-a apasat nici o tasta
;daca codul a fost valid si nu s-a apasat ultima tasta (in cazul de fata *),
;atunci in R2 returneaza 0 si se intoarce inapoi (la configurare)
;renuntarea se face prin apasarea tastei #

LCALL af_intr
LCALL af_codnou

MOV R5, #3 ;contor
MOV R0, #cn1 ;adresa primei cifre
JMP cifra

cifra:
CALL keypad
;daca tasta apasata e #, atunci iese si returneaza R2 = #
;daca nu, se continua cu introducerea codului
MOV A, #3EH
XRL A, R2
JZ config

MOV A, R2 ;pune in A codul tastei apasate
MOV @R0, A ;memorare cifra noua
INC R0 ;trece la cifra urmatoare
DJNZ R5, cifra ;pana cand se termina toate cifrele
JMP ultima1

ultima1:
;verifica ultima tasta apasata: daca e * schimba codul
;daca e #, se intoarce in config; pt alta tasta ramane acolo
CALL keypad
MOV A, #3EH
XRL A, R2
JZ config

CJNE R2, #3BH, ultima1
MOV R5, #4
MOV R0, #c1 ;aici e codul vechi
MOV R1, #cn1 ;de aici incepe codul nou
JMP schimba

schimba:
MOV A, @R1
MOV @R0, A
INC R0 ;trece la urm cifra
INC R1 ;trece la urm cifra
DJNZ R5, schimba
JMP sch_ef

sch_ef:
LCALL af_sch
LCALL af_ef
CALL keypad
;daca tasta apasata e #, atunci iese si returneaza R2 = #
;daca nu, ramane acolo
CJNE R2, #3EH, sch_ef
JMP config

END