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_A EQU 088H
- CHAR_B EQU 083H
- CHAR_C EQU 0C6H
- CHAR_D EQU 0A1H
- CHAR_E EQU 086H
- CHAR_F EQU 08EH
- ;-------------------------------------------------------------
- AND_OP EQU 88H
- OR_OP EQU 0C0H
- NOT_OP EQU 0ABH
- XOR_OP EQU 89H
- ADD_OP EQU 8CH
- SUB_OP EQU 0EAH
- ROTL_OP EQU 0C7H
- ROTR_OP EQU 0CEH
- S_READY EQU 0
- S_SELECT EQU 1
- S_PROCESS EQU 2
- OP_1 DATA 30H
- OP_2 DATA 31H
- OPER DATA 32H
- STATE DATA 33H
- N_STATE DATA 34H
- MASQ EQU 0FH
- FLAG_OP1 BIT 1
- FLAG_OP2 BIT 0
- KSET EQU P0.6
- KLOAD EQU P0.7
- CSEG AT 400H
- OP_TABLE: ;OPERADORES
- DB AND_OP, OR_OP, NOT_OP, XOR_OP, ADD_OP, SUB_OP, ROTL_OP, ROTR_OP
- CSEG AT 500H ;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, CHAR_A, CHAR_B, CHAR_C, CHAR_D, CHAR_E, CHAR_F ;0-F
- CSEG AT 0H
- JMP RESET
- ;-------------------------------------------------------------------------------------------------
- ; INIT_DEVICE
- ;-------------------------------------------------------------------------------------------------
- PCA_Init:
- MOV PCA0MD, #000h
- RET
- Port_IO_Init:
- MOV XBR1, #040h
- RET
- Init_Device:
- lcall PCA_Init
- lcall Port_IO_Init
- ret
- ;-------------------------------------------------------------------------------------------------
- ; RESET
- ;-------------------------------------------------------------------------------------------------
- RESET:
- ACALL Init_Device
- SETB KSET ;ATIVAR BOTOES
- SETB KLOAD
- SETB FLAG_OP1
- CLR FLAG_OP2
- MOV R3, #0H
- MOV A, #0H
- MOV OP_1, #0H
- MOV OP_2, #0H
- MOV OPER, #0H
- MOV STATE, #S_READY
- MOV N_STATE, #S_READY
- JMP STATE_MACHINE
- ;-------------------------------------------------------------------------------------------------
- ; STATE MACHINE
- ;-------------------------------------------------------------------------------------------------
- DOISOPERADORES:
- MOV N_STATE, #S_READY
- JMP STATE_MACHINE
- SINGLE:
- MOV N_STATE, #S_PROCESS
- STATE_MACHINE:
- MOV STATE, N_STATE
- MOV A, STATE
- RL A
- MOV DPTR, #JMP_TABLE
- JMP @A+DPTR
- JMP_TABLE:
- AJMP READY
- AJMP SELECT
- AJMP PROCESS
- ;-------------------------------------------------------------------------------------------------
- ; STATE READY - selecao do op1 e op2
- ;-------------------------------------------------------------------------------------------------
- READY:
- MOV DPTR, #DIGITS_TABLE
- JB FLAG_OP1, READY_OP1
- JB FLAG_OP2, READY_OP2
- READY_OP1:
- MOV P2, #0AFH
- ACALL START
- JMP DISPLAYBCD
- READY_OP2:
- MOV P2, #0A4H
- ACALL START
- DISPLAYBCD:
- MOV A, R3
- MOVC A, @A+DPTR
- MOV P2, A
- BUTTONS:
- JNB KLOAD, OPERANDO
- JB KSET, BUTTONS
- INCREMENT:
- JNB KSET, $
- INC R3
- CJNE R3, #16, DISPLAYBCD
- MOV R3, #0H
- JMP DISPLAYBCD
- START: ;aguarda que o utilizador carregue no kset para iniciar programa
- JB KSET, START
- JNB KSET, $
- RET
- OPERANDO:
- JNB KLOAD, $
- JB FLAG_OP1, OPER1
- JB FLAG_OP2, OPER2
- OPER1:
- MOV OP_1, R3
- MOV P1, OP_1
- CLR FLAG_OP1
- SETB FLAG_OP2
- MOV N_STATE, #S_SELECT
- JMP STATE_MACHINE
- OPER2:
- MOV OP_2, R3
- MOV P1, OP_2
- MOV N_STATE, #S_PROCESS
- JMP STATE_MACHINE
- ;-------------------------------------------------------------------------------------------------
- ; STATE SELECT
- ;-------------------------------------------------------------------------------------------------
- SELECT:
- MOV DPTR, #OP_TABLE
- MOV R3, #0H
- SELECT_2:
- MOV A, R3
- MOVC A, @A+DPTR
- MOV P2, A
- BUTT_OPER:
- JNB KLOAD, OPERADOR
- JB KSET, BUTT_OPER
- INC_OPER:
- JNB KSET, $
- INC R3
- CJNE R3, #8, SELECT_2
- JMP SELECT
- OPERADOR:
- JNB KLOAD, $
- MOV OPER, R3
- ;--------------------------------------------------
- /* CJNE OPER, #2, AUX
- MOV N_STATE, #S_PROCESS
- JMP STATE_MACHINE
- AUX:
- CJNE OPER, #6, AUX_2
- MOV N_STATE, #S_PROCESS
- JMP STATE_MACHINE
- AUX_2:
- CJNE OPER, #6, AUX_3
- MOV N_STATE, #S_PROCESS
- JMP STATE_MACHINE
- AUX_3:
- MOV N_STATE, #S_READY
- JMP STATE_MACHINE*/
- ;--------------------------------------------------
- MOV A, OPER
- RL A
- MOV DPTR, #OPERJMP_TABLE
- JMP @A+DPTR
- OPERJMP_TABLE:
- AJMP DOISOPERADORES
- AJMP DOISOPERADORES
- AJMP SINGLE
- AJMP DOISOPERADORES
- AJMP DOISOPERADORES
- AJMP DOISOPERADORES
- AJMP SINGLE
- AJMP SINGLE
- ;-------------------------------------------------------------------------------------------------
- ; STATE PROCESS
- ;-------------------------------------------------------------------------------------------------
- PROCESS:
- CLR AC
- MOV A, OPER
- RL A
- MOV DPTR, #FUNC_JMP_TABLE
- JMP @A+DPTR
- FUNC_JMP_TABLE:
- AJMP AND_FUNC
- AJMP OR_FUNC
- AJMP NOT_FUNC
- AJMP XOR_FUNC
- AJMP ADD_FUNC
- AJMP SUB_FUNC
- AJMP RL_FUNC
- AJMP RR_FUNC
- AND_FUNC:
- MOV A, OP_1
- ANL A, OP_2 ;A AND OP_2
- JMP IMPRIMIR
- OR_FUNC:
- MOV A, OP_1
- ORL A, OP_2
- JMP IMPRIMIR
- NOT_FUNC:
- MOV A, #0FH ;TB PODEMOS USAR O COMANDO CPL A
- SUBB A, OP_1
- INC A
- JMP IMPRIMIR
- XOR_FUNC:
- MOV A, OP_1
- XRL A, OP_2
- JMP IMPRIMIR
- ADD_FUNC:
- MOV A, OP_1
- ADD A, OP_2
- JB AC, OVERFLOW
- JMP IMPRIMIR
- SUB_FUNC:
- MOV A, OP_1
- SUBB A, OP_2
- INC A
- JB AC, OVERFLOW
- JMP IMPRIMIR
- RL_FUNC:
- MOV A, OP_1
- RL A
- JB AC, OVERFLOW
- JMP IMPRIMIR
- RR_FUNC:
- MOV A, OP_1
- RR A
- JB AC, OVERFLOW
- JMP IMPRIMIR
- OVERFLOW:
- ANL A, MASQ
- IMPRIMIR:
- MOV DPTR,#DIGITS_TABLE
- MOVC A, @A+DPTR
- MOV P2, A
- JB AC, PONTO
- JMP ENGODO
- PONTO:
- CLR P2.7
- CLR AC
- ENGODO:
- JNB KSET, ENGODO
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement