|
Appunti informatica |
|
Visite: 1171 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:Protezione e SicurezzaProtezione e Sicurezza Si parla di protezione in presenza di meccanismi, messi Algoritmo del banchiereALGORITMO DEL BANCHIERE Il nome di questo algoritmo di deve al fatto che esso Controlli a logica programmataCONTROLLI A LOGICA PROGRAMMATA SISTEMI A LOGICA CABLATA Per realizzare |
CODICE SORGENTE
list p=16f684 ; list directive to define processor
#include <P16F684.inc> ; processor specific variable definitions
__CONFIG 0x3FC4
RS equ .5
EN equ .4
DB4 equ .0
DB5 equ .3
DB6 equ .1
DB7 equ .2
cblock 0x020
conta
conta1
cifra
asterix
combinazione
cifre
temp
puntatore
pin
num
n_sec
endc
ORG 0x000
goto inizio
ORG 0x005
inizio
clrf PORTA
clrf PORTC
movlw .7
movwf CMCON0
bsf STATUS,RP0
movlw b'10000011'
movwf OPTION_REG
movlw b'00010000'
movwf ADCON1
movlw b'000001';RA0 analogico
movwf ANSEL
clrf TRISC
movlw b'101101'
movwf TRISA
bcf STATUS,RP0
clrf PORTA
clrf PORTC
;inserimento codice PIN di confronto nella memoria (non utilizzo EEPROM per cambiare codice)
movlw .1
movwf 0x030
movlw .2
movwf 0x031
movlw .3
movwf 0x032
movlw .4
movwf 0x033
movlw .5
movwf 0x034
;INIZIALIZZAZIONE LCD
movlw .50
call delay
bcf PORTC,RS
bsf PORTC,DB4
bsf PORTC,DB5
bcf PORTC,DB6
bcf PORTC,DB7
bsf PORTC,EN
movlw .5
call delay
bcf PORTC,EN
movlw .1
call delay
bsf PORTC,EN
movlw .1
call delay
bcf PORTC,EN
movlw .1
call delay
bsf PORTC,EN
movlw .1
call delay
bcf PORTC,EN
movlw .1
call delay
bcf PORTC,DB4
bsf PORTC,DB5
bcf PORTC,DB6
bcf PORTC,DB7
bsf PORTC,EN
movlw .1
call delay
bcf PORTC,EN
movlw .1
call delay
movlw 0x028 ;USO MULTIPLEX
call invia
movlw 0x006 ;INCREMENTA CARATTERE
call invia
movlw 0x00C ;SPOSTAMENTO A SX AD OGNI DATO
call invia
;SCRITTE INIZIALI
;AZZERA DISPLAY
movlw .1
call invia
movlw .2
call delay
;INSERIMENTO SCRITTA A SCORRERE
movlw 0x082
call invia
movlw 'F'
call dati
movlw 'E'
call dati
movlw 'D'
call dati
movlw 'E'
call dati
movlw 'R'
call dati
movlw 'I'
call dati
movlw 'C'
call dati
movlw 'O'
call dati
movlw ' '
call dati
movlw 'L'
call dati
movlw 'A'
call dati
movlw ' '
call dati
movlw 'M'
call dati
movlw 'A'
call dati
movlw 'T'
call dati
movlw 'T'
call dati
movlw 'I'
call dati
movlw 'N'
call dati
movlw 'A'
call dati
movlw 0x0C2 ; CARATTERI SULLA SECONDA RIGA DELL'LCD
call invia
movlw 'B'
call dati
movlw 'E'
call dati
movlw 'N'
call dati
movlw 'T'
call dati
movlw 'O'
call dati
movlw 'R'
call dati
movlw 'N'
call dati
movlw 'A'
call dati
movlw 'T'
call dati
movlw 'O'
movlw .10
call sec ;mantenimento scritte iniziali per 10s
;GESTIONE TASTIERA
programma
clrf PORTA
movlw 0x040
movwf FSR
clrf cifre
movlw 0x0C7 ;posizionamento primo *
movwf asterix
;AZZERA DISPLAY
movlw .1
call invia
movlw .2
call delay
;INSERIMENTO SCRITTA A SCORRERE
movlw 0x080
call invia
movlw 'I'
call dati
movlw 'N'
call dati
movlw 'S'
call dati
movlw 'E'
call dati
movlw 'R'
call dati
movlw 'I'
call dati
movlw 'R'
call dati
movlw 'E'
call dati
movlw ' '
call dati
movlw 'C'
call dati
movlw 'O'
call dati
movlw 'D'
call dati
movlw 'I'
call dati
movlw 'C'
call dati
movlw 'E'
call dati
movlw ' '
call dati
movlw 'P'
call dati
movlw 'I'
call dati
movlw 'N'
call dati
;accensione convertitore A/D
movlw b'00000001'
movwf ADCON0
movlw .50
call delay
;lettura tastiera
tastiera
A_D
bsf ADCON0,GO
btfsc ADCON0,GO
goto $-1
movfw ADRESH
movwf combinazione
;DECIFRAZIONE TASTO PREMUTO
movlw .10
subwf combinazione,0
btfss STATUS,C
goto tastiera
;nessun tasto premuto:si torna alla lettura
;se viene premuto un tasto attendo 200ms perchč si assesti la tensione all'ingresso dell'A/D e poi rifaccio la conversione
movlw .200
call delay
bsf ADCON0,GO
btfsc ADCON0,GO
goto $-1
movfw ADRESH
movwf combinazione
;confronti in sucessione per trovare il pulsante premuto
movlw .20
subwf combinazione,0
btfss STATUS,C
goto tasto_1
movlw .40
subwf combinazione,0
btfss STATUS,C
goto tasto_2
movlw .70
subwf combinazione,0
btfss STATUS,C
goto tasto_3
movlw .90
subwf combinazione,0
btfss STATUS,C
goto tasto_4
movlw .120
subwf combinazione,0
btfss STATUS,C
goto tasto_5
movlw .140
subwf combinazione,0
btfss STATUS,C
goto tasto_6
movlw .165
subwf combinazione,0
btfss STATUS,C
goto tasto_7
movlw .190
subwf combinazione,0
btfss STATUS,C
goto tasto_8
goto tasto_9 ; il tasto 9 non necessita di un range per il controllo
;Assegnazione cifra tasto premuto
tasto_0
movlw .0
movwf cifra
goto asterisco
tasto_1
movlw .1
movwf cifra
goto asterisco
tasto_2
movlw .2
movwf cifra
goto asterisco
tasto_3
movlw .3
movwf cifra
goto asterisco
tasto_4
movlw .4
movwf cifra
goto asterisco
tasto_5
movlw .5
movwf cifra
goto asterisco
tasto_6
movlw .6
movwf cifra
goto asterisco
tasto_7
movlw .7
movwf cifra
goto asterisco
tasto_8
movlw .8
movwf cifra
goto asterisco
tasto_9
movlw .9
movwf cifra
goto asterisco
asterisco
;ho tolto questa parte di programma lasciandola vuota; se volessi aggiungerla metto asterisco al posto di asterix
;all' inizio
;nella dichiarazione delle variabili
;inserisco le cifre nella memoria in modo indiretto a partire da 0x040
movfw cifra
movwf INDF
incf FSR,1
;sull'LCD faccio comparire degli asterisco al posto delle cifre (tolto nel programma base)
bsf PORTA,1 ;accendi buzzer
movlw .100
call delay
movfw asterix ;posiziona sull'LCD l'inserimento di un carattere
call invia
movlw .48
iorwf cifra,0 ;istruzione di prova visualizza le cifre
; movlw '*' ;inserisce * al posto delle cifre digitate
call dati
incf asterix,1 ;incrementa sull'LCD la posizione dell'*
incf cifre,1
bcf PORTA,1 ;spegni buzzer
movlw .300
call delay
movlw .5
xorwf cifre,0 ;verifica inserzione completa codice pin
btfsc STATUS,Z
goto test_pin
goto tastiera
test_pin
;inserisco programma di confronto tra pin digitato e quello memorizzato
movlw 0x040
movwf pin
movlw 0x030
movwf puntatore
controllo
movfw puntatore
movwf FSR
movfw INDF
movwf num
movfw pin
movwf FSR
movfw num
xorwf INDF,0
btfss STATUS,Z
goto programma
incf pin,1
incf puntatore,1
movlw 0x035
xorwf puntatore,0
btfss STATUS,Z
goto controllo
;apertura cassaforte (LED VERDE + eventuale scatto relais)
bsf PORTA,2
movlw .10
call sec
goto programma
;GESTIONE DATI E COMANDI DELL'LCD
;invia dati all'LCD
dati
bsf PORTC,RS
call invia_byte
return
;invia comandi all'LCD
invia
bcf PORTC,RS
call invia_byte
return
;salva dati inviati
invia_byte
movwf temp
bcf PORTC,DB4
bcf PORTC,DB5
bcf PORTC,DB6
bcf PORTC,DB7
btfsc temp,4
bsf PORTC,DB4
btfsc temp,5
bsf PORTC,DB5
btfsc temp,6
bsf PORTC,DB6
btfsc temp,7
bsf PORTC,DB7
bsf PORTC,EN
movlw .1
call delay
bcf PORTC,EN
movlw .1
call delay
bcf PORTC,DB4
bcf PORTC,DB5
bcf PORTC,DB6
bcf PORTC,DB7
btfsc temp,0
bsf PORTC,DB4
btfsc temp,1
bsf PORTC,DB5
btfsc temp,2
bsf PORTC,DB6
btfsc temp,3
bsf PORTC,DB7
bsf PORTC,EN
movlw .1
call delay
bcf PORTC,EN
movlw .1
call delay
return
;Ritardo espresso in secondi
sec
movwf n_sec
secondi
clrf conta
ciclo1
bcf INTCON,T0IF
clrf TMR0
btfss INTCON,T0IF
goto $-1
decfsz conta,1
goto ciclo1
decfsz n_sec,1
goto secondi
return
;Ritardo espresso in millisecondi
delay
movwf conta1
clrf conta
ciclo
nop
nop
decfsz conta,1
goto ciclo
decfsz conta1,1
goto ciclo
return
END ; directive 'end of program'
Appunti su: |
|