Advertisement
Guest User

Untitled

a guest
Dec 8th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <REG51F380.H>
  2.  
  3. MAX_CHANCES         EQU 5           // 5
  4. KEY_LEN             EQU 4           // 4
  5. DEF_FAIL_TICKS_H    EQU 0           // 30 s
  6. DEF_FAIL_TICKS_L    EQU 2         // ...
  7. DEF_OPEN_TICKS      EQU 120         // 30 s
  8. DEF_BUZZER_TICKS    EQU 2           // f(buzzer) = (1/(125u*DEF_BUZZER_TICKS*2)) = 2 KHz
  9. QTUM_TEMP           EQU -125        // T(T0overflow) = 125 us
  10.    
  11.  
  12. DEF_T0_MULT3    EQU 0FFH
  13. DEF_T0_MULT2    EQU 0FFH
  14. DEF_T0_MULT1    EQU 0F8H
  15. DEF_T0_MULT0    EQU 030H
  16.  
  17.  
  18. CHAR_L      EQU 47H
  19. CHAR_O      EQU 40H
  20. CHAR_F      EQU 0EH
  21. CHAR_B      EQU 03H
  22. CHAR_E      EQU 06H
  23.  
  24. S_LOCKED    EQU 0
  25. S_DECRYPT   EQU 1
  26. S_FAIL      EQU 2
  27. S_BLOCKED   EQU 3
  28. S_OPEN      EQU 4
  29. S_ENCRYPT   EQU 5
  30. S_ERROR     EQU 6
  31.    
  32. HW_FLAG     EQU P0.3
  33. BUZZER      EQU P0.4
  34. LOCK_T      EQU P0.5
  35. KLOAD       EQU P0.6
  36. KSET        EQU P0.7
  37. LEDS        EQU P1
  38. DISPLAY     EQU P2
  39. BLINK_LED   EQU P2.7
  40.    
  41.    
  42. STATE           DATA 30H
  43. NSTATE          DATA 31H
  44. INDEX           DATA 32H
  45. CHANCES         DATA 33H
  46.    
  47. // TIMER WHEEL
  48. FAIL_TICKS_H    DATA 34H
  49. FAIL_TICKS_L    DATA 35H
  50. OPEN_TICKS      DATA 37H
  51. BUZZER_TICKS    DATA 38H
  52.  
  53.  
  54. DSEG AT 50H
  55. T0_MULT0:       DS 1
  56. T0_MULT1:       DS 1
  57. T0_MULT2:       DS 1
  58. T0_MULT3:       DS 1
  59.  
  60.  
  61. FSET            BIT 0H
  62. FVALID          BIT 1H
  63. ELAPSED_250_MS  BIT 2H
  64. TIMER_OVER      BIT 3H          // para FAIL_TICKS e OPEN_TICKS
  65.    
  66.  
  67. ISEG AT 090H
  68. DEF_KEY:    DS 1
  69. DEFK1:      DS 1    ; LSB
  70. DEFK2:      DS 1
  71. DEFK3:      DS 1
  72. DEFK4:      DS 1    ; 84H
  73.    
  74. ISEG AT 0A0H
  75. SEC_KEY:    DS 1
  76. SECK1:      DS 1    ; LSB
  77. SECK2:      DS 1
  78. SECK3:      DS 1
  79. SECK4:      DS 1    ; 94H
  80.    
  81. ISEG AT 0B0H
  82. USER_KEY:   DS 1
  83. USRK1:      DS 1    ; LSB
  84. USRK2:      DS 1
  85. USRK3:      DS 1
  86. USRK4:      DS 1    ; A4H
  87.  
  88.  
  89. CSEG AT 1500H
  90.    
  91. FORWARD_S_BOX:
  92.     DB 063H, 07CH, 077H, 07BH, 0F2H, 06BH, 06FH, 0C5H, 030H, 001H, 067H, 02BH, 0FEH, 0D7H, 0ABH, 076H
  93.     DB 0CAH, 082H, 0C9H, 07DH, 0FAH, 059H, 047H, 0F0H, 0ADH, 0D4H, 0A2H, 0AFH, 09CH, 0A4H, 072H, 0C0H
  94.     DB 0B7H, 0FDH, 093H, 026H, 036H, 03FH, 0F7H, 0CCH, 034H, 0A5H, 0E5H, 0F1H, 071H, 0D8H, 031H, 015H
  95.     DB 004H, 0C7H, 023H, 0C3H, 018H, 096H, 005H, 09AH, 007H, 012H, 080H, 0E2H, 0EBH, 027H, 0B2H, 075H
  96.     DB 009H, 083H, 02CH, 01AH, 01BH, 06EH, 05AH, 0A0H, 052H, 03BH, 0D6H, 0B3H, 029H, 0E3H, 02FH, 084H
  97.     DB 053H, 0D1H, 000H, 0EDH, 020H, 0FCH, 0B1H, 05BH, 06AH, 0CBH, 0BEH, 039H, 04AH, 04CH, 058H, 0CFH
  98.     DB 0D0H, 0EFH, 0AAH, 0FBH, 043H, 04DH, 033H, 085H, 045H, 0F9H, 002H, 07FH, 050H, 03CH, 09FH, 0A8H
  99.     DB 051H, 0A3H, 040H, 08FH, 092H, 09DH, 038H, 0F5H, 0BCH, 0B6H, 0DAH, 021H, 010H, 0FFH, 0F3H, 0D2H
  100.     DB 0CDH, 00CH, 013H, 0ECH, 05FH, 097H, 044H, 017H, 0C4H, 0A7H, 07EH, 03DH, 064H, 05DH, 019H, 073H
  101.     DB 060H, 081H, 04FH, 0DCH, 022H, 02AH, 090H, 088H, 046H, 0EEH, 0B8H, 014H, 0DEH, 05EH, 00BH, 0DBH
  102.     DB 0E0H, 032H, 03AH, 00AH, 049H, 006H, 024H, 05CH, 0C2H, 0D3H, 0ACH, 062H, 091H, 095H, 0E4H, 079H
  103.     DB 0E7H, 0C8H, 037H, 06DH, 08DH, 0D5H, 04EH, 0A9H, 06CH, 056H, 0F4H, 0EAH, 065H, 07AH, 0AEH, 008H
  104.     DB 0BAH, 078H, 025H, 02EH, 01CH, 0A6H, 0B4H, 0C6H, 0E8H, 0DDH, 074H, 01FH, 04BH, 0BDH, 08BH, 08AH
  105.     DB 070H, 03EH, 0B5H, 066H, 048H, 003H, 0F6H, 00EH, 061H, 035H, 057H, 0B9H, 086H, 0C1H, 01DH, 09EH
  106.     DB 0E1H, 0F8H, 098H, 011H, 069H, 0D9H, 08EH, 094H, 09BH, 01EH, 087H, 0E9H, 0CEH, 055H, 028H, 0DFH
  107.     DB 08CH, 0A1H, 089H, 00DH, 0BFH, 0E6H, 042H, 068H, 041H, 099H, 02DH, 00FH, 0B0H, 054H, 0BBH, 016H
  108.    
  109.    
  110. CSEG AT 0H
  111.     JMP   INIT
  112.  
  113. CSEG AT 0BH
  114.     JMP   ISR_T0
  115.    
  116. CSEG AT 50H
  117.  
  118. /***************************************************    
  119. * ROTINA:   INIT
  120. ***************************************************/
  121.                     INIT:
  122.                    
  123.                    
  124. INIT_PERIPH:
  125.     MOV   XBR1,    #40H
  126.     MOV   P1MDOUT, #0FH
  127.     MOV   P0MDOUT, #30H
  128. INIT_PCA:
  129.     MOV   PCA0MD, #00H
  130. INIT_CLOCK:
  131.     MOV   CLKSEL, #3                ; 48MHz
  132.     MOV   TMOD,   #2
  133. INIT_TIMER:
  134.     MOV  CKCON, #02H
  135.     MOV  TL0, #QTUM_TEMP
  136.     MOV  TH0, #QTUM_TEMP
  137.     SETB TR0
  138. INIT_SP:
  139.     MOV   SP, #0CFH
  140. INIT_INTERRUPTS:
  141.     SETB  ET0
  142. INIT_MEMORY:
  143.     CLR   BUZZER
  144.     CLR   FSET
  145.     CLR   TIMER_OVER
  146.     SETB  LOCK_T
  147.     MOV   LEDS,    #0
  148.     MOV   DISPLAY, #0FFH
  149.     ACALL INIT_FAIL_TICKS
  150.     ACALL INIT_STATE
  151.     ACALL RESET_T0_MULT
  152.     JMP   MAIN
  153.    
  154.    
  155.     /********************************************************
  156.     * SUBROTINA:    RESET_T0_MULT                           *
  157.     * ENTRADA:      -                                       *
  158.     * SAIDA:        T0_MULT                                 *
  159.     * CHAMA:        -                                       *
  160.     * USO INTERNO:  T0_MULT                                 *
  161.     * DESCRICAO:    repoe o valor de T0_MULT para           *
  162.     *               DEF_TO_MULT                             *           *
  163.     ********************************************************/
  164.                         RESET_T0_MULT:
  165.  
  166.         MOV   T0_MULT0, #DEF_T0_MULT0
  167.         MOV   T0_MULT1, #DEF_T0_MULT1
  168.         MOV   T0_MULT2, #DEF_T0_MULT2
  169.         MOV   T0_MULT3, #DEF_T0_MULT3
  170.         RET
  171.        
  172.     /********************************************************
  173.     * SUBROTINA:    INIT_STATE                               *
  174.     * ENTRADA:      -                                   *
  175.     * SAIDA:                                            *
  176.     * CHAMA:        -                                    *
  177.     * USO INTERNO:                                       *
  178.     * DESCRICAO:                                *    
  179.     ********************************************************/
  180.                         INIT_STATE:
  181.  
  182.         SETB  EA
  183.         MOV   A, STATE
  184.         SUBB  A, #S_BLOCKED
  185.         JZ    STATE_IS_BLOCKED
  186.         MOV   A, STATE
  187.         SUBB  A, #S_FAIL
  188.         JZ    INIT_STATE_EXIT
  189.         MOV   NSTATE,  #S_LOCKED
  190.         CLR   EA
  191.         JMP   INIT_STATE_EXIT
  192.     STATE_IS_BLOCKED:
  193.         MOV   DISPLAY, #CHAR_B
  194.     INIT_STATE_EXIT:
  195.         RET
  196.        
  197.        
  198.      /********************************************************
  199.     * SUBROTINA:    INIT_FAIL_TICKS                          *
  200.     * ENTRADA:      -                                   *
  201.     * SAIDA:                                            *
  202.     * CHAMA:        -                                   *
  203.     * USO INTERNO:                                      *
  204.     * DESCRICAO:                                        *    
  205.     ********************************************************/
  206.                         INIT_FAIL_TICKS:
  207.        
  208.         MOV   A, #MAX_CHANCES
  209.         CLR   C
  210.         SUBB  A, CHANCES
  211.         INC   A
  212.         MOV   B, #DEF_FAIL_TICKS_L
  213.         MUL   AB
  214.         MOV   FAIL_TICKS_H, B
  215.         MOV   FAIL_TICKS_L, A
  216.         RET
  217.        
  218. /***************************************************    
  219. * ROTINA:   MAIN
  220. ***************************************************/
  221.                     MAIN:
  222.  
  223. MAIN_START:
  224.     JNB   HW_FLAG, DO_NOT_RELOAD_DEFK
  225.     ACALL RELOAD_DEFK
  226.     CLR   FSET
  227.     SETB  KSET
  228.     SETB  KLOAD
  229.     MOV   CHANCES, #MAX_CHANCES
  230.     MOV   FAIL_TICKS_H, #DEF_FAIL_TICKS_H
  231.     MOV   FAIL_TICKS_L, #DEF_FAIL_TICKS_L
  232.     JMP   MAIN_ENCODE
  233. DO_NOT_RELOAD_DEFK:
  234.     MOV   R0, #SEC_KEY
  235.     MOV   A,  @R0
  236.     CLR   C
  237.     SUBB  A,  #KEY_LEN
  238. MAIN_WARMSTART:
  239.     JZ    MAIN_ENCODE
  240. MAIN_COLDSTART:
  241.     MOV   STATE,  #S_ERROR
  242.     MOV   NSTATE, #S_ERROR
  243. MAIN_ENCODE:
  244.     JMP   ENCODE_FSM
  245. MAIN_KLOOP:
  246.     ACALL KEY_LOOP
  247.     JMP   MAIN_ENCODE
  248.    
  249.     /********************************************************
  250.     * SUBROTINA:    RELOAD_DEFK                             *
  251.     * ENTRADA:      -                                       *
  252.     * SAIDA:        DEF_KEY, SEC_KEY                        *
  253.     * CHAMA:        -                                       *
  254.     * USO INTERNO:  A, R0, R1, R2, DPTR                     *
  255.     * DESCRICAO:    carrega para SEC_KEY o valor de         *
  256.     *               DEF_KEY                                 *
  257.     ********************************************************/
  258.                         RELOAD_DEFK:
  259.        
  260.        
  261.     RELOAD_DEFK_INIT:
  262.         MOV   R0,  #DEF_KEY
  263.         MOV   R1,  #SEC_KEY
  264.         MOV   @R0, #KEY_LEN
  265.         MOV   @R1, #KEY_LEN
  266.         MOV   R2,  #0
  267.     RELOAD_DEFK_LOOP:
  268.         MOV   DPTR, #DEF_KEY_LOOKUP
  269.         MOV   A, R2
  270.         MOVC  A, @A+DPTR
  271.         INC   R0
  272.         MOV   @R0, A
  273.         INC   R1
  274.         MOV   @R1, A
  275.         INC   R2
  276.         CJNE  R2, #KEY_LEN, RELOAD_DEFK_LOOP
  277.     RELOAD_DEFK_EXIT:
  278.         MOV   NSTATE, #S_LOCKED
  279.         RET
  280.  
  281.     DEF_KEY_LOOKUP:     DB  0BAH, 0BAH, 0BAH, 0BAH
  282.        
  283.        
  284.     /********************************************************
  285.     * SUBROTINA:    ENCODE_FSM                              *
  286.     * ENTRADA:      STATE, NSTATE                           *
  287.     * SAIDA:        -                                       *
  288.     * CHAMA:        -                                       *
  289.     * USO INTERNO:  A, STATE, NSTATE, STATE_JT              *
  290.     * DESCRICAO:    máquina de estados que redireciona     *
  291.     *               o codigo para a subrotina respetiva     *
  292.     *               ao proximo estado (NSTATE)              *
  293.     ********************************************************/
  294.                         ENCODE_FSM:
  295.        
  296.         MOV   C, EA
  297.         CLR   EA
  298.         MOV   STATE, NSTATE
  299.         MOV   A, STATE
  300.         RL    A
  301.         MOV   DPTR, #STATE_JT
  302.         MOV   EA, C
  303.         JMP   @A+DPTR
  304.    
  305.    
  306.     STATE_JT:  
  307.         JMP   STATE_LOCKED
  308.         JMP   STATE_DECRYPT
  309.         JMP   STATE_FAIL
  310.         JMP   STATE_BLOCKED
  311.         JMP   STATE_OPEN
  312.         JMP   STATE_ENCRYPT
  313.         JMP   STATE_ERROR
  314.                
  315.                
  316.     /********************************************************
  317.     * SUBROTINA:    KEY_LOOP                                *
  318.     * ENTRADA:      FSET                                    *
  319.     * SAIDA:        FSET                                    *
  320.     * CHAMA:        -                                       *
  321.     * USO INTERNO:  KSET, KLOAD, FSET                       *
  322.     * DESCRICAO:    espera que o utilizador pressione       *
  323.     *               KLOAD ou KSET e atualiza o valor de     *
  324.     *               FSET de acordo com a tecla premida      *
  325.     ********************************************************/
  326.                         KEY_LOOP:          
  327.    
  328.     KEY_LOOP_START:
  329.         JNB   TIMER_OVER, KEY_LOOP_KEYS
  330.         RET
  331.     KEY_LOOP_KEYS:
  332.         JNB   KSET,  KSET_PRESSED
  333.         JB    KLOAD, KEY_LOOP
  334.     KLOAD_PRESSED:  
  335.         JNB   KLOAD, $
  336.         CLR   FSET
  337.         RET
  338.     KSET_PRESSED:  
  339.         JNB   KSET,  $
  340.         SETB  FSET
  341.         RET
  342.  
  343.  
  344. /************************************************************
  345. * SUBROTINA:    STATE_LOCKED                                *
  346. * ENTRADA:      FSET                                        *
  347. * SAIDA:        NSTATE                                      *
  348. * CHAMA:        -                                           *
  349. * USO INTERNO:  FSET, NSTATE, DISPLAY                       *
  350. ************************************************************/
  351.                     STATE_LOCKED:
  352.  
  353. STATE_LOCKED_START:
  354.     MOV   INDEX, #0FH
  355.     CLR   TIMER_OVER
  356.     JB    FSET, LOCKED_TO_DECRYPT
  357.     MOV   NSTATE,  #S_LOCKED
  358.     MOV   DISPLAY, #CHAR_L
  359.     JMP   MAIN_KLOOP
  360. LOCKED_TO_DECRYPT:
  361.     MOV   NSTATE, #S_DECRYPT
  362.     MOV   R0, #USER_KEY
  363.     MOV   @R0, #0
  364.     JMP   MAIN_ENCODE
  365.    
  366.    
  367. /************************************************************
  368. * SUBROTINA:    STATE_DECRYPT                               *
  369. * ENTRADA:      FSET, USER_KEY, KEY_LEN                     *
  370. * SAIDA:        NSTATE                                      *
  371. * CHAMA:        INSERT_IN_ARRAY, COMP_ARRAYS, UPDATE_LEDS,  *
  372. *               UPDATE_DISPLAY                              *
  373. * USO INTERNO:  A, C, R0, R7, INDEX, NSTATE, FVALID         *
  374. ************************************************************/
  375.                     STATE_DECRYPT:  
  376.  
  377. START_DECRYPT_START:
  378.     JB    FSET, DECRYPT_INC_INDEX
  379.     MOV   R0,   #USER_KEY
  380.     CLR   C
  381.     MOV   A,    #KEY_LEN
  382.     SUBB  A,    @R0
  383.     JC    DECRYPT_REM_PREV_KEY
  384.     JZ    DECRYPT_REM_PREV_KEY
  385. DECRYPT_INSERT_INDEX:
  386.     MOV   R7, INDEX
  387.     ACALL INSERT_IN_ARRAY  
  388. DECRYPT_TEST_KEY_SIZE:
  389.     CLR   C
  390.     MOV   R0, #USER_KEY
  391.     CJNE  @R0, #KEY_LEN, DECRYPT_INDEX_0
  392.     ACALL COMP_ARRAYS
  393.     MOV   LEDS, #0
  394.     SETB  EA
  395.     JNB   FVALID, DECRYPT_NOT_VALID
  396.     MOV   STATE, #S_OPEN
  397.     MOV   NSTATE, #S_OPEN
  398.     MOV   DISPLAY, #CHAR_O
  399.     MOV   OPEN_TICKS, #DEF_OPEN_TICKS
  400.     CLR   LOCK_T
  401.     JMP   MAIN_KLOOP
  402. DECRYPT_NOT_VALID:
  403.     MOV   NSTATE, #S_FAIL
  404.     MOV   DISPLAY, #CHAR_F
  405.     DEC   CHANCES
  406.     JMP   MAIN_ENCODE
  407. DECRYPT_REM_PREV_KEY:
  408.     MOV   @R0, #0
  409. DECRYPT_INDEX_0:
  410.     MOV   INDEX, #0
  411. DECRYPT_UPDT_DISP:
  412.     MOV   R7, INDEX
  413.     MOV   R0, #USER_KEY
  414.     ACALL UPDATE_DISPLAY
  415.     ACALL UPDATE_LEDS
  416.     MOV   NSTATE, #S_DECRYPT
  417.     JMP   MAIN_KLOOP
  418. DECRYPT_INC_INDEX:
  419.     CLR   FSET
  420.     INC   INDEX
  421.     ANL   INDEX, #0FH
  422.     JMP   DECRYPT_UPDT_DISP
  423.  
  424.  
  425.     /********************************************************
  426.     * SUBROTINA:    UPDATE_DISPLAY                          *
  427.     * ENTRADA:      R7                                      *
  428.     * SAIDA:        -                                       *
  429.     * CHAMA:        -                                       *
  430.     * USO INTERNO:  A, DPTR                                 *
  431.     * DESCRICAO:    atualiza o display de 7 segmentos       *
  432.     *               para refletir o numero contido em R7    *
  433.     ********************************************************/
  434.                         UPDATE_DISPLAY:
  435.        
  436.        
  437.         MOV   A, R7
  438.         MOV   DPTR, #NUMBER_CHAR_LOOKUP
  439.         MOVC  A, @A+DPTR
  440.         MOV   DISPLAY, A
  441.         RET
  442.  
  443.     NUMBER_CHAR_LOOKUP:     DB      0C0H, 0F9H, 0A4H, 0B0H, 099H, 092H, 082H, 0F8H, 080H, 090H, 088H, 083H, 0C6H, 0A1H, 086H, 08EH
  444.        
  445.  
  446.     /********************************************************
  447.     * SUBROTINA:    UPDATE_LEDS                             *
  448.     * ENTRADA:      USER_KEY                                *
  449.     * SAIDA:        P1                                      *
  450.     * CHAMA:        -                                       *
  451.     * USO INTERNO:  A, LEDS(P1), R0, R2, P1                 *
  452.     * DESCRICAO:    atualiza o display de 7 segmentos       *
  453.     *               para refletir o numero contido em R7    *
  454.     ********************************************************/
  455.                         UPDATE_LEDS:
  456.    
  457.     UPDATE_LEDS_START:
  458.             USING 0
  459.         MOV   AR2, @R0
  460.         INC   R2
  461.         MOV   A,  #1
  462.     ROTT_LOOP:
  463.         DJNZ  R2, ROTATE_A
  464.         ORL   P1, A
  465.         RET
  466.     ROTATE_A:
  467.         RL    A
  468.         JMP   ROTT_LOOP
  469.        
  470.  
  471.     /********************************************************  
  472.     * SUBROTINA:    COMP_ARRAYS                             *
  473.     * ENTRADA:      SEC_KEY, USER_KEY, KEY_LEN              *
  474.     * SAIDA:        FVALID                                  *
  475.     * CHAMA:        -                                       *  
  476.     * USO INTERNO:  A, R0, R1, R5, FVALID                   *
  477.     * DESCRICAO:    compara USER_KEY com SEC_KEY e          *
  478.     *               dá feedback dessa comparacao através  *
  479.     *               de FVALID                               *
  480.     ********************************************************/
  481.                         COMP_ARRAYS:
  482.  
  483.     COMP_ARRAYS_START:
  484.         MOV   R0, #SEC_KEY
  485.         MOV   R1, #USER_KEY
  486.             USING 0
  487.         MOV   AR5, @R0
  488.         SETB  FVALID
  489.         MOV   A,  R1
  490.         ADD   A,  @R0
  491.         MOV   R1, A
  492.         MOV   A,  R0
  493.         ADD   A,  @R0
  494.         MOV   R0, A
  495.     CMP_DIGIT:
  496.         MOV   A,  @R0
  497.         SUBB  A,  @R1
  498.         JZ    CONFIRM
  499.         CLR   FVALID
  500.     CONFIRM:            
  501.         DEC   R5
  502.         MOV   A,  R5
  503.         JNZ   NEXT_CHECK
  504.         RET
  505.     NEXT_CHECK:
  506.         DEC   R0
  507.         DEC   R1
  508.         JMP   CMP_DIGIT
  509.    
  510.    
  511.     /********************************************************
  512.     * SUBROTINA:    INSERT_IN_ARRAY                         *
  513.     * ENTRADA:      R7(elem. a inserir),                    *
  514.     *               R0(array onde inserir)                  *
  515.     * SAIDA:        R0(como estava antes da inserção)     *
  516.     * CHAMA:        -                                       *
  517.     * USO INTERNO:  A, R0, R2, DPTR, INDEX                  *
  518.     * DESCRICAO:    insere o valor contido em R7 no array   *
  519.     *               apontao por R0 e devolve R0 com o mesmo *
  520.     *               valor com que entrou                    *
  521.     ********************************************************/
  522.                     INSERT_IN_ARRAY:
  523.    
  524.        
  525.         MOV   DPTR, #NUMBER_CHAR_LOOKUP
  526.         MOV   A,    INDEX
  527.         MOVC  A,    @A+DPTR
  528.         MOV   DPTR, #FORWARD_S_BOX
  529.         MOVC  A,    @A+DPTR
  530.         MOV   R7,   A
  531.         INC   @R0
  532.             USING 0
  533.         MOV   AR2, R0
  534.         MOV   A,   R0
  535.         ADD   A,   @R0
  536.         MOV   R0,  A
  537.         MOV   @R0, AR7
  538.         MOV   AR0, R2
  539.         RET
  540.    
  541.  
  542. /************************************************************
  543. * SUBROTINA:    STATE_OPEN                                  *
  544. * ENTRADA:      FSET                                        *
  545. * SAIDA:        NSTATE                                      *
  546. * CHAMA:        -                                           *
  547. * USO INTERNO:  NSTATE, FSET                                *
  548. ************************************************************/
  549.                     STATE_OPEN:
  550.                    
  551. STATE_OPEN_START:                  
  552.     JB    FSET,   OPEN_TO_ENCRYPT
  553.     MOV   NSTATE, #S_LOCKED
  554.     JMP   MAIN_ENCODE
  555. OPEN_TO_ENCRYPT:
  556.     CLR   FSET
  557.     MOV   NSTATE, #S_ENCRYPT
  558.     JMP   MAIN_ENCODE
  559.  
  560.  
  561. /************************************************************
  562. * SUBROTINA:    STATE_ENCRYPT                               *
  563. * ENTRADA:      FSET, USER_KEY, KEY_LEN                     *
  564. * SAIDA:        NSTATE                                      *
  565. * CHAMA:        INSERT_IN_ARRAY, UPDATE_LEDS, UPDATE_DISPLAY*
  566. * USO INTERNO:  A, C, R0, R7, INDEX, NSTATE                 *
  567. ************************************************************/
  568.                     STATE_ENCRYPT:
  569.    
  570. STATE_ENCRYPT_START:    
  571.     JNB   TIMER_OVER, ENCRYPT_NOT_BC_TIMER
  572.     CLR   TIMER_OVER
  573.     MOV   R0,   #SEC_KEY
  574.     JMP   ENCRYPT_REM_PREV_KEY
  575. ENCRYPT_NOT_BC_TIMER:
  576.     JB    FSET, ENCRYPT_INC_INDEX
  577. //ENCRYPT_NOT_TO_INC:
  578.     MOV   R0,   #SEC_KEY
  579.     CLR   C
  580.     MOV   A,    @R0
  581.     SUBB  A,    #KEY_LEN
  582.     JZ    ENCRYPT_REM_PREV_KEY
  583. ENCRYPT_INSERT_INDEX:
  584.     ACALL INSERT_IN_ARRAY  
  585. ENCRYPT_TEST_KEY_SIZE:
  586.     CLR   C
  587.     MOV   R0,   #SEC_KEY
  588.     CJNE  @R0,   #KEY_LEN, ENCRYPT_INDEX_0
  589.     MOV   NSTATE, #S_LOCKED
  590.     SETB  LOCK_T
  591.     MOV   LEDS, #0
  592.     JMP   MAIN_ENCODE
  593. ENCRYPT_REM_PREV_KEY:
  594.     MOV   @R0,  #0
  595. ENCRYPT_INDEX_0:
  596.     MOV   INDEX, #0
  597. ENCRYPT_UPDT_DISP:
  598.     ACALL UPDATE_LEDS
  599.     MOV   R7, INDEX
  600.     ACALL UPDATE_DISPLAY
  601.     MOV   NSTATE, #S_ENCRYPT
  602.     JMP   MAIN_KLOOP
  603. ENCRYPT_INC_INDEX:
  604.     CLR   FSET
  605.     INC   INDEX
  606.     ANL   INDEX, #0FH
  607.     MOV   R0, #SEC_KEY
  608.     JMP   ENCRYPT_UPDT_DISP
  609.  
  610.  
  611.  
  612. /************************************************************
  613. * SUBROTINA:    STATE_FAIL                                  *
  614. * ENTRADA:      CHANCES                                     *
  615. * SAIDA:        NSTATE                                      *
  616. * CHAMA:        -                                           *
  617. * USO INTERNO:  A, C, R3, CHANCES, CLKSEL, OSCICN, TMOD,    *
  618. *               CKCON, TCON(TF0, TR0), TH0, TL0, NSTATE     *
  619. ************************************************************/
  620.                     STATE_FAIL:
  621.  
  622. STATE_FAIL_START:  
  623.     MOV   A, CHANCES
  624.     JZ    NO_CHANCES
  625.     JMP   MAIN_KLOOP
  626. NO_CHANCES:
  627.     MOV   NSTATE,  #S_BLOCKED
  628.     MOV   DISPLAY, #CHAR_B
  629.     MOV   CHANCES, #MAX_CHANCES
  630.     MOV   FAIL_TICKS_H, #0
  631.     MOV   FAIL_TICKS_L, #DEF_FAIL_TICKS_L
  632.     JMP   MAIN_ENCODE
  633.    
  634.  
  635. /************************************************************
  636. * SUBROTINA:    STATE_BLOCKED                               *
  637. * ENTRADA:                                              *
  638. * SAIDA:                                                *
  639. * CHAMA:        -                                       *
  640. * USO INTERNO:                                          *
  641. ************************************************************/
  642.                     STATE_BLOCKED:
  643.  
  644.     JMP   MAIN
  645.  
  646.                    
  647. /************************************************************
  648. * SUBROTINA:                                        *
  649. * ENTRADA:                                              *
  650. * SAIDA:                                                *
  651. * CHAMA:        -                                       *
  652. * USO INTERNO:                                          *
  653. ************************************************************/
  654.                     STATE_ERROR:
  655.    
  656.    
  657.     MOV   DISPLAY, #CHAR_E
  658.     SETB  EA
  659.     SETB  LOCK_T
  660.     JMP   MAIN
  661.    
  662.    
  663.  
  664. /************************************************************
  665. * ROTINA:       ISR_T0                                      *
  666. * ENTRADA:      T0_MULT, DEF_TO_MULT, TF0, STATE            *
  667. * SAIDA:        -                                           *
  668. * CHAMA:        RESET_T0_MULT                               *
  669. * USO INTERNO:  T0_MULT, DEF_TO_MULT, TF0, FAIL_TICKS,      *
  670. *               OPEN_TICKS, BLINK_LED                       *
  671. ************************************************************/
  672.                         ISR_T0:
  673.                    
  674.  
  675. ISR_T0_START:
  676.     PUSH  ACC
  677.     PUSH  PSW
  678.     CLR   TF0
  679.     ACALL INC_T0_MULT
  680.     JNB   ELAPSED_250_MS, ISR_TO_DEC_TIMERS
  681.     ACALL RESET_T0_MULT
  682. ISR_TO_DEC_TIMERS:
  683.     JMP  DEC_TIMERS_FSM  
  684. ISR_T0_AFTER_DEC_TIMERS:
  685.     POP   PSW
  686.     POP   ACC
  687.     RETI
  688.  
  689.  
  690.        
  691.        
  692.     /************************************************************
  693.     * ROTINA:                                               *
  694.     * ENTRADA:                  *
  695.     * SAIDA:        -                                           *
  696.     * CHAMA:                                        *
  697.     * USO INTERNO:                          *
  698.     ************************************************************/  
  699.                             INC_T0_MULT:
  700.                                                
  701.         MOV   A, T0_MULT0
  702.         ADD   A, #1
  703.         MOV   T0_MULT0, A
  704.         MOV   A, T0_MULT1
  705.         ADDC  A, #0
  706.         MOV   T0_MULT1, A
  707.         MOV   A, T0_MULT2
  708.         ADDC  A, #0
  709.         MOV   T0_MULT2, A  
  710.         MOV   A, T0_MULT3
  711.         ADDC  A, #0
  712.         MOV   T0_MULT3, A
  713.         JNC   INC_T0_MULT_EXIT
  714.         SETB  ELAPSED_250_MS
  715.     INC_T0_MULT_EXIT:
  716.         RET
  717.  
  718.  
  719.     /************************************************************
  720.     * SUBROTINA:    DEC_TIMERS                                  *
  721.     * ENTRADA:                                              *
  722.     * SAIDA:        -                                       *
  723.     * CHAMA:                                                *
  724.     * USO INTERNO:                                          *
  725.     ************************************************************/  
  726.                                 DEC_TIMERS_FSM:
  727.                                
  728.         MOV   A, STATE
  729.         RL    A
  730.         MOV   DPTR, #DEC_TIMERS_JT
  731.         JMP   @A+DPTR
  732.     FINAL_JUMP:
  733.         JMP   ISR_T0_AFTER_DEC_TIMERS
  734.    
  735.         DEC_TIMERS_JT:
  736.             JMP  FINAL_JUMP             ; S_LOCKED
  737.             JMP  FINAL_JUMP             ; S_DECRYPT
  738.             JMP  DEC_FAIL_TIMER         ; S_FAIL (espera de 30*tentativas segundos)
  739.             JMP  DEC_BLOCKED_TIMER      ; S_BLOCKED
  740.             JMP  DEC_OPEN_TIMER         ; S_OPEN (espera de 30 segundos e blink 2Hz (devia ser 2.5))
  741.             JMP  FINAL_JUMP             ; S_ENCRYPT
  742.             JMP  DEC_ERROR_TIMER        ; S_ERROR
  743.            
  744.            
  745.            
  746.         /********************************************************
  747.         * SUBROTINA:    DEC_FAIL_TIMER                          *
  748.         * ENTRADA:                                          *
  749.         * SAIDA:                                            *
  750.         * CHAMA:        -                                   *
  751.         * USO INTERNO:                                      *
  752.         * DESCRICAO:                                        *
  753.         ********************************************************/
  754.                         DEC_FAIL_TIMER:
  755.  
  756.         DEC_FAIL_TIMER_START:
  757.             JNB   ELAPSED_250_MS, DEC_FAIL_TIMER_EXIT
  758.             CLR   ELAPSED_250_MS
  759.             CLR   C                             // DEC FAIL_TICKS
  760.             MOV   A, FAIL_TICKS_L               //
  761.             SUBB  A, #1                         //
  762.             MOV   FAIL_TICKS_L, A               //
  763.             MOV   A, FAIL_TICKS_H               //
  764.             SUBB  A, #0                         //
  765.             MOV   FAIL_TICKS_H, A               //
  766.             JNC   DEC_FAIL_TIMER_EXIT
  767.             SETB  TIMER_OVER
  768.             MOV   NSTATE, #S_LOCKED
  769.             CLR   C                             // RESET FAIL_TICKS
  770.             MOV   A, #MAX_CHANCES               //
  771.             SUBB  A, CHANCES                    //
  772.             INC   A                             //
  773.             MOV   B, #DEF_FAIL_TICKS_L          //
  774.             MUL   AB                            //
  775.             MOV   FAIL_TICKS_L, A               //
  776.             MOV   FAIL_TICKS_H, B               //  
  777.         DEC_FAIL_TIMER_EXIT:
  778.             JMP   FINAL_JUMP
  779.        
  780.        
  781.        
  782.         /********************************************************
  783.         * SUBROTINA:    DEC_OPEN_TIMER                          *
  784.         * ENTRADA:                                          *
  785.         * SAIDA:                                            *
  786.         * CHAMA:        -                                   *
  787.         * USO INTERNO:                                      *
  788.         * DESCRICAO:                                        *
  789.         ********************************************************/
  790.                         DEC_OPEN_TIMER:
  791.  
  792.         DEC_OPEN_TIMER_START:
  793.             JNB   ELAPSED_250_MS, DEC_OPEN_TIMER_EXIT
  794.             CLR   ELAPSED_250_MS
  795.             CPL   BLINK_LED
  796.             MOV   A, OPEN_TICKS                 // DEC OPEN_TICKS
  797.             DEC   A
  798.             MOV   OPEN_TICKS, A
  799.             JNZ   DEC_OPEN_TIMER_EXIT
  800.             SETB  TIMER_OVER
  801.             MOV   NSTATE, #S_ENCRYPT
  802.             MOV   OPEN_TICKS, #DEF_OPEN_TICKS   // RESET_OPEN_TICKS
  803.         DEC_OPEN_TIMER_EXIT:
  804.             JMP   FINAL_JUMP
  805.        
  806.        
  807.        
  808.         /********************************************************
  809.         * SUBROTINA:    DEC_BLOCKED_TIMER                       *
  810.         * ENTRADA:                                          *
  811.         * SAIDA:                                            *
  812.         * CHAMA:        -                                   *
  813.         * USO INTERNO:                                      *
  814.         * DESCRICAO:                                        *
  815.         ********************************************************/
  816.                         DEC_BLOCKED_TIMER:
  817.  
  818.         DEC_BLOCKED_TIMER_START:
  819.             ACALL BUZZER_WAVE_CONTROL
  820.             JNB   ELAPSED_250_MS, DEC_BLOCKED_TIMER_EXIT
  821.             CLR   ELAPSED_250_MS
  822.             CPL   BLINK_LED
  823.         DEC_BLOCKED_TIMER_EXIT:
  824.             JMP   FINAL_JUMP
  825.        
  826.        
  827.        
  828.         /********************************************************
  829.         * SUBROTINA:    DEC_ERROR_TIMER                     *
  830.         * ENTRADA:                                          *
  831.         * SAIDA:                                            *
  832.         * CHAMA:        -                                   *
  833.         * USO INTERNO:                                      *
  834.         * DESCRICAO:                                        *
  835.         ********************************************************/
  836.                         DEC_ERROR_TIMER:
  837.  
  838.         DEC_ERROR_TIMER_START:
  839.             ACALL BUZZER_WAVE_CONTROL
  840.         DEC_ERROR_TIMER_EXIT:
  841.             JMP   FINAL_JUMP
  842.    
  843.  
  844.                     BUZZER_WAVE_CONTROL:
  845.  
  846.         DEC   BUZZER_TICKS
  847.         MOV   A, BUZZER_TICKS
  848.         JNZ   EXIT
  849.         CPL   BUZZER
  850.         MOV   BUZZER_TICKS, #DEF_BUZZER_TICKS
  851.     EXIT:
  852.         RET
  853.  
  854.        
  855. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement