Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <REG51F380.H>
- MAX_CHANCES EQU 5 // 5
- KEY_LEN EQU 4 // 4
- DEF_FAIL_TICKS_H EQU 0 // 30 s
- DEF_FAIL_TICKS_L EQU 2 // ...
- DEF_OPEN_TICKS EQU 120 // 30 s
- DEF_BUZZER_TICKS EQU 2 // f(buzzer) = (1/(125u*DEF_BUZZER_TICKS*2)) = 2 KHz
- QTUM_TEMP EQU -125 // T(T0overflow) = 125 us
- DEF_T0_MULT3 EQU 0FFH
- DEF_T0_MULT2 EQU 0FFH
- DEF_T0_MULT1 EQU 0F8H
- DEF_T0_MULT0 EQU 030H
- CHAR_L EQU 47H
- CHAR_O EQU 40H
- CHAR_F EQU 0EH
- CHAR_B EQU 03H
- CHAR_E EQU 06H
- S_LOCKED EQU 0
- S_DECRYPT EQU 1
- S_FAIL EQU 2
- S_BLOCKED EQU 3
- S_OPEN EQU 4
- S_ENCRYPT EQU 5
- S_ERROR EQU 6
- HW_FLAG EQU P0.3
- BUZZER EQU P0.4
- LOCK_T EQU P0.5
- KLOAD EQU P0.6
- KSET EQU P0.7
- LEDS EQU P1
- DISPLAY EQU P2
- BLINK_LED EQU P2.7
- STATE DATA 30H
- NSTATE DATA 31H
- INDEX DATA 32H
- CHANCES DATA 33H
- // TIMER WHEEL
- FAIL_TICKS_H DATA 34H
- FAIL_TICKS_L DATA 35H
- OPEN_TICKS DATA 37H
- BUZZER_TICKS DATA 38H
- DSEG AT 50H
- T0_MULT0: DS 1
- T0_MULT1: DS 1
- T0_MULT2: DS 1
- T0_MULT3: DS 1
- FSET BIT 0H
- FVALID BIT 1H
- ELAPSED_250_MS BIT 2H
- TIMER_OVER BIT 3H // para FAIL_TICKS e OPEN_TICKS
- ISEG AT 090H
- DEF_KEY: DS 1
- DEFK1: DS 1 ; LSB
- DEFK2: DS 1
- DEFK3: DS 1
- DEFK4: DS 1 ; 84H
- ISEG AT 0A0H
- SEC_KEY: DS 1
- SECK1: DS 1 ; LSB
- SECK2: DS 1
- SECK3: DS 1
- SECK4: DS 1 ; 94H
- ISEG AT 0B0H
- USER_KEY: DS 1
- USRK1: DS 1 ; LSB
- USRK2: DS 1
- USRK3: DS 1
- USRK4: DS 1 ; A4H
- CSEG AT 1500H
- FORWARD_S_BOX:
- DB 063H, 07CH, 077H, 07BH, 0F2H, 06BH, 06FH, 0C5H, 030H, 001H, 067H, 02BH, 0FEH, 0D7H, 0ABH, 076H
- DB 0CAH, 082H, 0C9H, 07DH, 0FAH, 059H, 047H, 0F0H, 0ADH, 0D4H, 0A2H, 0AFH, 09CH, 0A4H, 072H, 0C0H
- DB 0B7H, 0FDH, 093H, 026H, 036H, 03FH, 0F7H, 0CCH, 034H, 0A5H, 0E5H, 0F1H, 071H, 0D8H, 031H, 015H
- DB 004H, 0C7H, 023H, 0C3H, 018H, 096H, 005H, 09AH, 007H, 012H, 080H, 0E2H, 0EBH, 027H, 0B2H, 075H
- DB 009H, 083H, 02CH, 01AH, 01BH, 06EH, 05AH, 0A0H, 052H, 03BH, 0D6H, 0B3H, 029H, 0E3H, 02FH, 084H
- DB 053H, 0D1H, 000H, 0EDH, 020H, 0FCH, 0B1H, 05BH, 06AH, 0CBH, 0BEH, 039H, 04AH, 04CH, 058H, 0CFH
- DB 0D0H, 0EFH, 0AAH, 0FBH, 043H, 04DH, 033H, 085H, 045H, 0F9H, 002H, 07FH, 050H, 03CH, 09FH, 0A8H
- DB 051H, 0A3H, 040H, 08FH, 092H, 09DH, 038H, 0F5H, 0BCH, 0B6H, 0DAH, 021H, 010H, 0FFH, 0F3H, 0D2H
- DB 0CDH, 00CH, 013H, 0ECH, 05FH, 097H, 044H, 017H, 0C4H, 0A7H, 07EH, 03DH, 064H, 05DH, 019H, 073H
- DB 060H, 081H, 04FH, 0DCH, 022H, 02AH, 090H, 088H, 046H, 0EEH, 0B8H, 014H, 0DEH, 05EH, 00BH, 0DBH
- DB 0E0H, 032H, 03AH, 00AH, 049H, 006H, 024H, 05CH, 0C2H, 0D3H, 0ACH, 062H, 091H, 095H, 0E4H, 079H
- DB 0E7H, 0C8H, 037H, 06DH, 08DH, 0D5H, 04EH, 0A9H, 06CH, 056H, 0F4H, 0EAH, 065H, 07AH, 0AEH, 008H
- DB 0BAH, 078H, 025H, 02EH, 01CH, 0A6H, 0B4H, 0C6H, 0E8H, 0DDH, 074H, 01FH, 04BH, 0BDH, 08BH, 08AH
- DB 070H, 03EH, 0B5H, 066H, 048H, 003H, 0F6H, 00EH, 061H, 035H, 057H, 0B9H, 086H, 0C1H, 01DH, 09EH
- DB 0E1H, 0F8H, 098H, 011H, 069H, 0D9H, 08EH, 094H, 09BH, 01EH, 087H, 0E9H, 0CEH, 055H, 028H, 0DFH
- DB 08CH, 0A1H, 089H, 00DH, 0BFH, 0E6H, 042H, 068H, 041H, 099H, 02DH, 00FH, 0B0H, 054H, 0BBH, 016H
- CSEG AT 0H
- JMP INIT
- CSEG AT 0BH
- JMP ISR_T0
- CSEG AT 50H
- /***************************************************
- * ROTINA: INIT
- ***************************************************/
- INIT:
- INIT_PERIPH:
- MOV XBR1, #40H
- MOV P1MDOUT, #0FH
- MOV P0MDOUT, #30H
- INIT_PCA:
- MOV PCA0MD, #00H
- INIT_CLOCK:
- MOV CLKSEL, #3 ; 48MHz
- MOV TMOD, #2
- INIT_TIMER:
- MOV CKCON, #02H
- MOV TL0, #QTUM_TEMP
- MOV TH0, #QTUM_TEMP
- SETB TR0
- INIT_SP:
- MOV SP, #0CFH
- INIT_INTERRUPTS:
- SETB ET0
- INIT_MEMORY:
- CLR BUZZER
- CLR FSET
- CLR TIMER_OVER
- SETB LOCK_T
- MOV LEDS, #0
- MOV DISPLAY, #0FFH
- ACALL INIT_FAIL_TICKS
- ACALL INIT_STATE
- ACALL RESET_T0_MULT
- JMP MAIN
- /********************************************************
- * SUBROTINA: RESET_T0_MULT *
- * ENTRADA: - *
- * SAIDA: T0_MULT *
- * CHAMA: - *
- * USO INTERNO: T0_MULT *
- * DESCRICAO: repoe o valor de T0_MULT para *
- * DEF_TO_MULT * *
- ********************************************************/
- RESET_T0_MULT:
- MOV T0_MULT0, #DEF_T0_MULT0
- MOV T0_MULT1, #DEF_T0_MULT1
- MOV T0_MULT2, #DEF_T0_MULT2
- MOV T0_MULT3, #DEF_T0_MULT3
- RET
- /********************************************************
- * SUBROTINA: INIT_STATE *
- * ENTRADA: - *
- * SAIDA: *
- * CHAMA: - *
- * USO INTERNO: *
- * DESCRICAO: *
- ********************************************************/
- INIT_STATE:
- SETB EA
- MOV A, STATE
- SUBB A, #S_BLOCKED
- JZ STATE_IS_BLOCKED
- MOV A, STATE
- SUBB A, #S_FAIL
- JZ INIT_STATE_EXIT
- MOV NSTATE, #S_LOCKED
- CLR EA
- JMP INIT_STATE_EXIT
- STATE_IS_BLOCKED:
- MOV DISPLAY, #CHAR_B
- INIT_STATE_EXIT:
- RET
- /********************************************************
- * SUBROTINA: INIT_FAIL_TICKS *
- * ENTRADA: - *
- * SAIDA: *
- * CHAMA: - *
- * USO INTERNO: *
- * DESCRICAO: *
- ********************************************************/
- INIT_FAIL_TICKS:
- MOV A, #MAX_CHANCES
- CLR C
- SUBB A, CHANCES
- INC A
- MOV B, #DEF_FAIL_TICKS_L
- MUL AB
- MOV FAIL_TICKS_H, B
- MOV FAIL_TICKS_L, A
- RET
- /***************************************************
- * ROTINA: MAIN
- ***************************************************/
- MAIN:
- MAIN_START:
- JNB HW_FLAG, DO_NOT_RELOAD_DEFK
- ACALL RELOAD_DEFK
- CLR FSET
- SETB KSET
- SETB KLOAD
- MOV CHANCES, #MAX_CHANCES
- MOV FAIL_TICKS_H, #DEF_FAIL_TICKS_H
- MOV FAIL_TICKS_L, #DEF_FAIL_TICKS_L
- JMP MAIN_ENCODE
- DO_NOT_RELOAD_DEFK:
- MOV R0, #SEC_KEY
- MOV A, @R0
- CLR C
- SUBB A, #KEY_LEN
- MAIN_WARMSTART:
- JZ MAIN_ENCODE
- MAIN_COLDSTART:
- MOV STATE, #S_ERROR
- MOV NSTATE, #S_ERROR
- MAIN_ENCODE:
- JMP ENCODE_FSM
- MAIN_KLOOP:
- ACALL KEY_LOOP
- JMP MAIN_ENCODE
- /********************************************************
- * SUBROTINA: RELOAD_DEFK *
- * ENTRADA: - *
- * SAIDA: DEF_KEY, SEC_KEY *
- * CHAMA: - *
- * USO INTERNO: A, R0, R1, R2, DPTR *
- * DESCRICAO: carrega para SEC_KEY o valor de *
- * DEF_KEY *
- ********************************************************/
- RELOAD_DEFK:
- RELOAD_DEFK_INIT:
- MOV R0, #DEF_KEY
- MOV R1, #SEC_KEY
- MOV @R0, #KEY_LEN
- MOV @R1, #KEY_LEN
- MOV R2, #0
- RELOAD_DEFK_LOOP:
- MOV DPTR, #DEF_KEY_LOOKUP
- MOV A, R2
- MOVC A, @A+DPTR
- INC R0
- MOV @R0, A
- INC R1
- MOV @R1, A
- INC R2
- CJNE R2, #KEY_LEN, RELOAD_DEFK_LOOP
- RELOAD_DEFK_EXIT:
- MOV NSTATE, #S_LOCKED
- RET
- DEF_KEY_LOOKUP: DB 0BAH, 0BAH, 0BAH, 0BAH
- /********************************************************
- * SUBROTINA: ENCODE_FSM *
- * ENTRADA: STATE, NSTATE *
- * SAIDA: - *
- * CHAMA: - *
- * USO INTERNO: A, STATE, NSTATE, STATE_JT *
- * DESCRICAO: máquina de estados que redireciona *
- * o codigo para a subrotina respetiva *
- * ao proximo estado (NSTATE) *
- ********************************************************/
- ENCODE_FSM:
- MOV C, EA
- CLR EA
- MOV STATE, NSTATE
- MOV A, STATE
- RL A
- MOV DPTR, #STATE_JT
- MOV EA, C
- JMP @A+DPTR
- STATE_JT:
- JMP STATE_LOCKED
- JMP STATE_DECRYPT
- JMP STATE_FAIL
- JMP STATE_BLOCKED
- JMP STATE_OPEN
- JMP STATE_ENCRYPT
- JMP STATE_ERROR
- /********************************************************
- * SUBROTINA: KEY_LOOP *
- * ENTRADA: FSET *
- * SAIDA: FSET *
- * CHAMA: - *
- * USO INTERNO: KSET, KLOAD, FSET *
- * DESCRICAO: espera que o utilizador pressione *
- * KLOAD ou KSET e atualiza o valor de *
- * FSET de acordo com a tecla premida *
- ********************************************************/
- KEY_LOOP:
- KEY_LOOP_START:
- JNB TIMER_OVER, KEY_LOOP_KEYS
- RET
- KEY_LOOP_KEYS:
- JNB KSET, KSET_PRESSED
- JB KLOAD, KEY_LOOP
- KLOAD_PRESSED:
- JNB KLOAD, $
- CLR FSET
- RET
- KSET_PRESSED:
- JNB KSET, $
- SETB FSET
- RET
- /************************************************************
- * SUBROTINA: STATE_LOCKED *
- * ENTRADA: FSET *
- * SAIDA: NSTATE *
- * CHAMA: - *
- * USO INTERNO: FSET, NSTATE, DISPLAY *
- ************************************************************/
- STATE_LOCKED:
- STATE_LOCKED_START:
- MOV INDEX, #0FH
- CLR TIMER_OVER
- JB FSET, LOCKED_TO_DECRYPT
- MOV NSTATE, #S_LOCKED
- MOV DISPLAY, #CHAR_L
- JMP MAIN_KLOOP
- LOCKED_TO_DECRYPT:
- MOV NSTATE, #S_DECRYPT
- MOV R0, #USER_KEY
- MOV @R0, #0
- JMP MAIN_ENCODE
- /************************************************************
- * SUBROTINA: STATE_DECRYPT *
- * ENTRADA: FSET, USER_KEY, KEY_LEN *
- * SAIDA: NSTATE *
- * CHAMA: INSERT_IN_ARRAY, COMP_ARRAYS, UPDATE_LEDS, *
- * UPDATE_DISPLAY *
- * USO INTERNO: A, C, R0, R7, INDEX, NSTATE, FVALID *
- ************************************************************/
- STATE_DECRYPT:
- START_DECRYPT_START:
- JB FSET, DECRYPT_INC_INDEX
- MOV R0, #USER_KEY
- CLR C
- MOV A, #KEY_LEN
- SUBB A, @R0
- JC DECRYPT_REM_PREV_KEY
- JZ DECRYPT_REM_PREV_KEY
- DECRYPT_INSERT_INDEX:
- MOV R7, INDEX
- ACALL INSERT_IN_ARRAY
- DECRYPT_TEST_KEY_SIZE:
- CLR C
- MOV R0, #USER_KEY
- CJNE @R0, #KEY_LEN, DECRYPT_INDEX_0
- ACALL COMP_ARRAYS
- MOV LEDS, #0
- SETB EA
- JNB FVALID, DECRYPT_NOT_VALID
- MOV STATE, #S_OPEN
- MOV NSTATE, #S_OPEN
- MOV DISPLAY, #CHAR_O
- MOV OPEN_TICKS, #DEF_OPEN_TICKS
- CLR LOCK_T
- JMP MAIN_KLOOP
- DECRYPT_NOT_VALID:
- MOV NSTATE, #S_FAIL
- MOV DISPLAY, #CHAR_F
- DEC CHANCES
- JMP MAIN_ENCODE
- DECRYPT_REM_PREV_KEY:
- MOV @R0, #0
- DECRYPT_INDEX_0:
- MOV INDEX, #0
- DECRYPT_UPDT_DISP:
- MOV R7, INDEX
- MOV R0, #USER_KEY
- ACALL UPDATE_DISPLAY
- ACALL UPDATE_LEDS
- MOV NSTATE, #S_DECRYPT
- JMP MAIN_KLOOP
- DECRYPT_INC_INDEX:
- CLR FSET
- INC INDEX
- ANL INDEX, #0FH
- JMP DECRYPT_UPDT_DISP
- /********************************************************
- * SUBROTINA: UPDATE_DISPLAY *
- * ENTRADA: R7 *
- * SAIDA: - *
- * CHAMA: - *
- * USO INTERNO: A, DPTR *
- * DESCRICAO: atualiza o display de 7 segmentos *
- * para refletir o numero contido em R7 *
- ********************************************************/
- UPDATE_DISPLAY:
- MOV A, R7
- MOV DPTR, #NUMBER_CHAR_LOOKUP
- MOVC A, @A+DPTR
- MOV DISPLAY, A
- RET
- NUMBER_CHAR_LOOKUP: DB 0C0H, 0F9H, 0A4H, 0B0H, 099H, 092H, 082H, 0F8H, 080H, 090H, 088H, 083H, 0C6H, 0A1H, 086H, 08EH
- /********************************************************
- * SUBROTINA: UPDATE_LEDS *
- * ENTRADA: USER_KEY *
- * SAIDA: P1 *
- * CHAMA: - *
- * USO INTERNO: A, LEDS(P1), R0, R2, P1 *
- * DESCRICAO: atualiza o display de 7 segmentos *
- * para refletir o numero contido em R7 *
- ********************************************************/
- UPDATE_LEDS:
- UPDATE_LEDS_START:
- USING 0
- MOV AR2, @R0
- INC R2
- MOV A, #1
- ROTT_LOOP:
- DJNZ R2, ROTATE_A
- ORL P1, A
- RET
- ROTATE_A:
- RL A
- JMP ROTT_LOOP
- /********************************************************
- * SUBROTINA: COMP_ARRAYS *
- * ENTRADA: SEC_KEY, USER_KEY, KEY_LEN *
- * SAIDA: FVALID *
- * CHAMA: - *
- * USO INTERNO: A, R0, R1, R5, FVALID *
- * DESCRICAO: compara USER_KEY com SEC_KEY e *
- * dá feedback dessa comparacao através *
- * de FVALID *
- ********************************************************/
- COMP_ARRAYS:
- COMP_ARRAYS_START:
- MOV R0, #SEC_KEY
- MOV R1, #USER_KEY
- USING 0
- MOV AR5, @R0
- SETB FVALID
- MOV A, R1
- ADD A, @R0
- MOV R1, A
- MOV A, R0
- ADD A, @R0
- MOV R0, A
- CMP_DIGIT:
- MOV A, @R0
- SUBB A, @R1
- JZ CONFIRM
- CLR FVALID
- CONFIRM:
- DEC R5
- MOV A, R5
- JNZ NEXT_CHECK
- RET
- NEXT_CHECK:
- DEC R0
- DEC R1
- JMP CMP_DIGIT
- /********************************************************
- * SUBROTINA: INSERT_IN_ARRAY *
- * ENTRADA: R7(elem. a inserir), *
- * R0(array onde inserir) *
- * SAIDA: R0(como estava antes da inserção) *
- * CHAMA: - *
- * USO INTERNO: A, R0, R2, DPTR, INDEX *
- * DESCRICAO: insere o valor contido em R7 no array *
- * apontao por R0 e devolve R0 com o mesmo *
- * valor com que entrou *
- ********************************************************/
- INSERT_IN_ARRAY:
- MOV DPTR, #NUMBER_CHAR_LOOKUP
- MOV A, INDEX
- MOVC A, @A+DPTR
- MOV DPTR, #FORWARD_S_BOX
- MOVC A, @A+DPTR
- MOV R7, A
- INC @R0
- USING 0
- MOV AR2, R0
- MOV A, R0
- ADD A, @R0
- MOV R0, A
- MOV @R0, AR7
- MOV AR0, R2
- RET
- /************************************************************
- * SUBROTINA: STATE_OPEN *
- * ENTRADA: FSET *
- * SAIDA: NSTATE *
- * CHAMA: - *
- * USO INTERNO: NSTATE, FSET *
- ************************************************************/
- STATE_OPEN:
- STATE_OPEN_START:
- JB FSET, OPEN_TO_ENCRYPT
- MOV NSTATE, #S_LOCKED
- JMP MAIN_ENCODE
- OPEN_TO_ENCRYPT:
- CLR FSET
- MOV NSTATE, #S_ENCRYPT
- JMP MAIN_ENCODE
- /************************************************************
- * SUBROTINA: STATE_ENCRYPT *
- * ENTRADA: FSET, USER_KEY, KEY_LEN *
- * SAIDA: NSTATE *
- * CHAMA: INSERT_IN_ARRAY, UPDATE_LEDS, UPDATE_DISPLAY*
- * USO INTERNO: A, C, R0, R7, INDEX, NSTATE *
- ************************************************************/
- STATE_ENCRYPT:
- STATE_ENCRYPT_START:
- JNB TIMER_OVER, ENCRYPT_NOT_BC_TIMER
- CLR TIMER_OVER
- MOV R0, #SEC_KEY
- JMP ENCRYPT_REM_PREV_KEY
- ENCRYPT_NOT_BC_TIMER:
- JB FSET, ENCRYPT_INC_INDEX
- //ENCRYPT_NOT_TO_INC:
- MOV R0, #SEC_KEY
- CLR C
- MOV A, @R0
- SUBB A, #KEY_LEN
- JZ ENCRYPT_REM_PREV_KEY
- ENCRYPT_INSERT_INDEX:
- ACALL INSERT_IN_ARRAY
- ENCRYPT_TEST_KEY_SIZE:
- CLR C
- MOV R0, #SEC_KEY
- CJNE @R0, #KEY_LEN, ENCRYPT_INDEX_0
- MOV NSTATE, #S_LOCKED
- SETB LOCK_T
- MOV LEDS, #0
- JMP MAIN_ENCODE
- ENCRYPT_REM_PREV_KEY:
- MOV @R0, #0
- ENCRYPT_INDEX_0:
- MOV INDEX, #0
- ENCRYPT_UPDT_DISP:
- ACALL UPDATE_LEDS
- MOV R7, INDEX
- ACALL UPDATE_DISPLAY
- MOV NSTATE, #S_ENCRYPT
- JMP MAIN_KLOOP
- ENCRYPT_INC_INDEX:
- CLR FSET
- INC INDEX
- ANL INDEX, #0FH
- MOV R0, #SEC_KEY
- JMP ENCRYPT_UPDT_DISP
- /************************************************************
- * SUBROTINA: STATE_FAIL *
- * ENTRADA: CHANCES *
- * SAIDA: NSTATE *
- * CHAMA: - *
- * USO INTERNO: A, C, R3, CHANCES, CLKSEL, OSCICN, TMOD, *
- * CKCON, TCON(TF0, TR0), TH0, TL0, NSTATE *
- ************************************************************/
- STATE_FAIL:
- STATE_FAIL_START:
- MOV A, CHANCES
- JZ NO_CHANCES
- JMP MAIN_KLOOP
- NO_CHANCES:
- MOV NSTATE, #S_BLOCKED
- MOV DISPLAY, #CHAR_B
- MOV CHANCES, #MAX_CHANCES
- MOV FAIL_TICKS_H, #0
- MOV FAIL_TICKS_L, #DEF_FAIL_TICKS_L
- JMP MAIN_ENCODE
- /************************************************************
- * SUBROTINA: STATE_BLOCKED *
- * ENTRADA: *
- * SAIDA: *
- * CHAMA: - *
- * USO INTERNO: *
- ************************************************************/
- STATE_BLOCKED:
- JMP MAIN
- /************************************************************
- * SUBROTINA: *
- * ENTRADA: *
- * SAIDA: *
- * CHAMA: - *
- * USO INTERNO: *
- ************************************************************/
- STATE_ERROR:
- MOV DISPLAY, #CHAR_E
- SETB EA
- SETB LOCK_T
- JMP MAIN
- /************************************************************
- * ROTINA: ISR_T0 *
- * ENTRADA: T0_MULT, DEF_TO_MULT, TF0, STATE *
- * SAIDA: - *
- * CHAMA: RESET_T0_MULT *
- * USO INTERNO: T0_MULT, DEF_TO_MULT, TF0, FAIL_TICKS, *
- * OPEN_TICKS, BLINK_LED *
- ************************************************************/
- ISR_T0:
- ISR_T0_START:
- PUSH ACC
- PUSH PSW
- CLR TF0
- ACALL INC_T0_MULT
- JNB ELAPSED_250_MS, ISR_TO_DEC_TIMERS
- ACALL RESET_T0_MULT
- ISR_TO_DEC_TIMERS:
- JMP DEC_TIMERS_FSM
- ISR_T0_AFTER_DEC_TIMERS:
- POP PSW
- POP ACC
- RETI
- /************************************************************
- * ROTINA: *
- * ENTRADA: *
- * SAIDA: - *
- * CHAMA: *
- * USO INTERNO: *
- ************************************************************/
- INC_T0_MULT:
- MOV A, T0_MULT0
- ADD A, #1
- MOV T0_MULT0, A
- MOV A, T0_MULT1
- ADDC A, #0
- MOV T0_MULT1, A
- MOV A, T0_MULT2
- ADDC A, #0
- MOV T0_MULT2, A
- MOV A, T0_MULT3
- ADDC A, #0
- MOV T0_MULT3, A
- JNC INC_T0_MULT_EXIT
- SETB ELAPSED_250_MS
- INC_T0_MULT_EXIT:
- RET
- /************************************************************
- * SUBROTINA: DEC_TIMERS *
- * ENTRADA: *
- * SAIDA: - *
- * CHAMA: *
- * USO INTERNO: *
- ************************************************************/
- DEC_TIMERS_FSM:
- MOV A, STATE
- RL A
- MOV DPTR, #DEC_TIMERS_JT
- JMP @A+DPTR
- FINAL_JUMP:
- JMP ISR_T0_AFTER_DEC_TIMERS
- DEC_TIMERS_JT:
- JMP FINAL_JUMP ; S_LOCKED
- JMP FINAL_JUMP ; S_DECRYPT
- JMP DEC_FAIL_TIMER ; S_FAIL (espera de 30*tentativas segundos)
- JMP DEC_BLOCKED_TIMER ; S_BLOCKED
- JMP DEC_OPEN_TIMER ; S_OPEN (espera de 30 segundos e blink 2Hz (devia ser 2.5))
- JMP FINAL_JUMP ; S_ENCRYPT
- JMP DEC_ERROR_TIMER ; S_ERROR
- /********************************************************
- * SUBROTINA: DEC_FAIL_TIMER *
- * ENTRADA: *
- * SAIDA: *
- * CHAMA: - *
- * USO INTERNO: *
- * DESCRICAO: *
- ********************************************************/
- DEC_FAIL_TIMER:
- DEC_FAIL_TIMER_START:
- JNB ELAPSED_250_MS, DEC_FAIL_TIMER_EXIT
- CLR ELAPSED_250_MS
- CLR C // DEC FAIL_TICKS
- MOV A, FAIL_TICKS_L //
- SUBB A, #1 //
- MOV FAIL_TICKS_L, A //
- MOV A, FAIL_TICKS_H //
- SUBB A, #0 //
- MOV FAIL_TICKS_H, A //
- JNC DEC_FAIL_TIMER_EXIT
- SETB TIMER_OVER
- MOV NSTATE, #S_LOCKED
- CLR C // RESET FAIL_TICKS
- MOV A, #MAX_CHANCES //
- SUBB A, CHANCES //
- INC A //
- MOV B, #DEF_FAIL_TICKS_L //
- MUL AB //
- MOV FAIL_TICKS_L, A //
- MOV FAIL_TICKS_H, B //
- DEC_FAIL_TIMER_EXIT:
- JMP FINAL_JUMP
- /********************************************************
- * SUBROTINA: DEC_OPEN_TIMER *
- * ENTRADA: *
- * SAIDA: *
- * CHAMA: - *
- * USO INTERNO: *
- * DESCRICAO: *
- ********************************************************/
- DEC_OPEN_TIMER:
- DEC_OPEN_TIMER_START:
- JNB ELAPSED_250_MS, DEC_OPEN_TIMER_EXIT
- CLR ELAPSED_250_MS
- CPL BLINK_LED
- MOV A, OPEN_TICKS // DEC OPEN_TICKS
- DEC A
- MOV OPEN_TICKS, A
- JNZ DEC_OPEN_TIMER_EXIT
- SETB TIMER_OVER
- MOV NSTATE, #S_ENCRYPT
- MOV OPEN_TICKS, #DEF_OPEN_TICKS // RESET_OPEN_TICKS
- DEC_OPEN_TIMER_EXIT:
- JMP FINAL_JUMP
- /********************************************************
- * SUBROTINA: DEC_BLOCKED_TIMER *
- * ENTRADA: *
- * SAIDA: *
- * CHAMA: - *
- * USO INTERNO: *
- * DESCRICAO: *
- ********************************************************/
- DEC_BLOCKED_TIMER:
- DEC_BLOCKED_TIMER_START:
- ACALL BUZZER_WAVE_CONTROL
- JNB ELAPSED_250_MS, DEC_BLOCKED_TIMER_EXIT
- CLR ELAPSED_250_MS
- CPL BLINK_LED
- DEC_BLOCKED_TIMER_EXIT:
- JMP FINAL_JUMP
- /********************************************************
- * SUBROTINA: DEC_ERROR_TIMER *
- * ENTRADA: *
- * SAIDA: *
- * CHAMA: - *
- * USO INTERNO: *
- * DESCRICAO: *
- ********************************************************/
- DEC_ERROR_TIMER:
- DEC_ERROR_TIMER_START:
- ACALL BUZZER_WAVE_CONTROL
- DEC_ERROR_TIMER_EXIT:
- JMP FINAL_JUMP
- BUZZER_WAVE_CONTROL:
- DEC BUZZER_TICKS
- MOV A, BUZZER_TICKS
- JNZ EXIT
- CPL BUZZER
- MOV BUZZER_TICKS, #DEF_BUZZER_TICKS
- EXIT:
- RET
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement