Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <REG51F380.H>
- ;-------------------------------------------------------------------------------------------------------------------;
- ;CONSTANT DEFINES FOR CHAR_NUM AND CHAR_STATE
- ;-------------------------------------------------------------------------------------------------------------------;
- CHAR_0 EQU 0C0H ;DEFINE CHARS FOR 8BITSEG
- CHAR_1 EQU 0F9H
- CHAR_2 EQU 0A4H
- CHAR_3 EQU 0B0H
- CHAR_4 EQU 099H
- CHAR_5 EQU 092H
- CHAR_6 EQU 082H
- CHAR_7 EQU 0F8H
- CHAR_8 EQU 080H
- CHAR_9 EQU 090H
- CHAR_L EQU 0C7H
- CHAR_F EQU 68H
- ;-------------------------------------------------------------
- S_RECOVER EQU 0
- S_LOCKED EQU 1
- S_OPEN EQU 2
- S_ENCRYPT EQU 3
- S_DESENCRYPT EQU 4
- S_FAIL EQU 5
- STATE DATA 30H
- N_STATE DATA 31H
- USER_KEY DATA 32H ;XDATA
- SEC_KEY IDATA 50H
- RECOVERY BIT 1
- FECHADO BIT 0
- VALID BIT 0
- MASQ EQU 0A2H
- KEYLEN EQU 4
- KSET EQU P0.6
- KLOAD EQU P0.7
- TB EQU P2.7
- CSEG AT 600H ;caracteres segmento 8bits
- DIGITS_TABLE:
- DB CHAR_0, CHAR_1, CHAR_2, CHAR_3, CHAR_4, CHAR_5, CHAR_6, CHAR_7, CHAR_8, CHAR_9 ;0-9
- CSEG AT 0H
- JMP RESET
- ;-------------------------------------------------------------------------------------------------
- ; INIT_DEVICE
- ;-------------------------------------------------------------------------------------------------
- PCA_Init:
- MOV PCA0MD, #000h
- RET
- Port_IO_Init:
- MOV XBR1, #040h
- RET
- TIMER_INIT:
- MOV FLSCL, #90H
- MOV CLKSEL, #30H
- RET
- Init_Device:
- lcall PCA_Init
- lcall Port_IO_Init
- LCALL TIMER_INIT
- ret
- ;-------------------------------------------------------------------------------------------------
- ; RESET
- ;-------------------------------------------------------------------------------------------------
- RESET:
- ACALL Init_Device
- SETB KSET ;ATIVAR BOTOES
- SETB KLOAD
- SETB TB
- SETB RECOVERY
- CLR FECHADO
- CLR VALID
- MOV R0, #SEC_KEY
- MOV R1, #USER_KEY
- MOV R3, #0H
- MOV A, #0H
- MOV B, #0H
- MOV STATE, #S_RECOVER
- MOV N_STATE, #S_RECOVER
- JMP STATE_MACHINE
- ;-------------------------------------------------------------------------------------------------
- ; STATE MACHINE
- ;-------------------------------------------------------------------------------------------------
- STATE_MACHINE:
- MOV STATE, N_STATE
- MOV A, STATE
- RL A
- MOV DPTR, #JMP_TABLE
- JMP @A+DPTR
- JMP_TABLE:
- AJMP RECOVER
- AJMP LOCKED
- AJMP OPEN
- AJMP ENCRYPT
- AJMP DESENCRYPT
- AJMP FAIL
- ;-------------------------------------------------------------------------------------------------
- ; STATE RECOVERY + STATE LOCKED ----USAM O MESMO CODIGO
- ;-------------------------------------------------------------------------------------------------
- START: ;aguarda que o utilizador carregue no kset para continuar o programa
- JB KSET, START
- JNB KSET, $
- RET
- RECOVER:
- JMP DISPCHARS
- LOCKED:
- MOV R1, #USER_KEY
- MOV P2, #CHAR_L
- CLR TB
- ACALL START
- DISPCHARS:
- MOV DPTR, #DIGITS_TABLE
- MOV R3, #0H
- DISPLAYBCD:
- MOV A, R3
- MOVC A, @A+DPTR
- MOV P2, A
- JNB FECHADO, BUTTONS
- CLR TB
- BUTTONS:
- JNB KLOAD, SETNUM
- JB KSET, BUTTONS
- INCREMENT:
- JNB KSET, $
- INC R3
- CJNE R3, #10, DISPLAYBCD
- MOV R3, #0H
- JMP DISPLAYBCD
- SETNUM:
- JNB KLOAD, $
- JB RECOVERY, RELOAD_KEY
- JB FECHADO, LOCKED_2
- JMP SETNUM
- RELOAD_KEY:
- MOV A, R3
- MOV @R1, A
- INC R1
- CJNE R1, #36H, DISPCHARS ;รจ errado comparar com o endereco de memoria? deveriamos usar r4 para incremento e comparar r4 com keylen?
- CLR RECOVERY
- MOV N_STATE, #S_ENCRYPT
- JMP STATE_MACHINE
- LOCKED_2:
- MOV A, R3
- MOV @R1, A
- INC R1
- CJNE R1, #36H, DISPCHARS ;รจ errado comparar com o endereco de memoria? deveriamos usar r4 para incremento e comparar r4 com keylen?
- MOV N_STATE, #S_DESENCRYPT
- JMP STATE_MACHINE
- ;-------------------------------------------------------------------------------------------------
- ; STATE DESENCRYPT
- ;-------------------------------------------------------------------------------------------------
- DESENCRYPT:
- MOV R0, #SEC_KEY
- MOV R1, #USER_KEY
- MOV R3, #0H
- MOV N_STATE, #S_FAIL
- CLR VALID
- DESENCRYPT_LOOP:
- MOV A, @R0
- MOV B, @R1
- XRL A, #MASQ
- CJNE A, B, STATE_MACHINE
- INC R0
- INC R1
- INC R3
- CJNE R3, #KEYLEN, DESENCRYPT_LOOP
- SETB VALID
- SETB TB
- CLR FECHADO
- MOV N_STATE, #S_OPEN
- JMP STATE_MACHINE
- ;-------------------------------------------------------------------------------------------------
- ; STATE ENCRYPT
- ;-------------------------------------------------------------------------------------------------
- ENCRYPT:
- MOV R0, #SEC_KEY
- MOV R1, #USER_KEY
- MOV R3, #0H
- ENCRYPT_LOOP:
- MOV A, @R1
- XRL A, #MASQ
- MOV @R0, A
- INC R3
- INC R1
- INC R0
- CJNE R3, #KEYLEN, ENCRYPT_LOOP ;precisamos checkar o kload(segundo fluxograma)??? ou outra coisa antes de ir para estado locked
- MOV N_STATE, #S_LOCKED
- SETB FECHADO
- JMP STATE_MACHINE
- ;-------------------------------------------------------------------------------------------------
- ; STATE FAIL
- ;-------------------------------------------------------------------------------------------------
- FAIL:
- MOV P2, #CHAR_F
- CLR TB ;OU PODEMOS IGNORAR O TB NO CASO DE BLOQUEIO?
- ;engodo do timer
- JMP FAIL
- MOV N_STATE, #S_LOCKED
- JMP STATE_MACHINE
- ;-------------------------------------------------------------------------------------------------
- ; STATE OPEN
- ;-------------------------------------------------------------------------------------------------
- OPEN:
- JNB VALID, $
- MOV P2, #CHAR_0
- JNB KLOAD, CLOSE
- JB KSET, OPEN
- JNB KSET, $
- NEW_PASSWORD:
- CLOSE:
- JNB KLOAD, $
- MOV N_STATE, #S_LOCKED
- JMP STATE_MACHINE
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement