Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;$INCLUDE (reg_c51.INC)
- transmit_completed BIT 20H.1; software flag
- serial_data DATA 08H
- data_save DATA 09H
- data_example DATA 0AH;
- ; SPI
- SPCON DATA 0C3H
- SPSTA DATA 0C4H
- SPDAT DATA 0C5H
- ; WATCHDOG TIMER
- IEN1 DATA 0B1H
- ORG 0000h
- JMP SET_INTERRUPT
- ORG 4Bh ; Endereço da interrupção SPI
- LJMP it_SPI ; Programa para onde vai a rotina de interrupção
- ORG 0100h
- SET_INTERRUPT:
- MOV data_example,#55h; /* data example */
- ORL SPCON,#10h; /* Master mode */
- SETB P1.1; /* enable master */
- ORL SPCON,#82h; /* Fclk Periph/128 */
- ANL SPCON,#0F7h; /* CPOL=0; transmit mode example */
- ORL SPCON,#04h; /* CPHA=1; transmit mode example */
- ORL IEN1,#04h; /* enable spi interrupt */
- ORL SPCON,#20h ; DESABILITA SS
- ORL SPCON,#40h; /* run spi */
- CLR transmit_completed; /* clear software transfert flag */
- SETB EA; /* enable interrupts */
- BEGIN:
- MOV P2, #0xFF ; Inicializa a porta P2
- MOV A, #0xFE
- MOV P2, A
- NOP
- MOV A, P2
- CJNE A, #0xFE, LINHA4
- MOV A, #0xFD
- MOV P2, A
- NOP
- MOV A, P2
- CJNE A, #0xFD, LINHA3
- MOV A, #0xFB
- MOV P2, A
- NOP
- MOV A, P2
- CJNE A, #0xFB, LINHA2
- MOV A, #0xF7
- MOV P2, A
- NOP
- MOV A, P2
- CJNE A, #0xF7, LINHA1
- JMP BEGIN
- LINHA4:
- CALL DEBOUNCE
- JNB P2.7, ASTERICO
- JNB P2.6, ZERO
- JNB P2.5, HASH
- JNB P2.4, DDD
- JMP BEGIN
- DDD:
- ;MOV A, #44h ; D ASCII
- JMP BEGIN
- ZERO:
- ;MOV A, #30h ; 1 ASCII
- JMP BEGIN
- HASH:
- ;MOV A, #23h ; # ASCII
- JMP BEGIN
- ASTERICO:
- ;MOV A, #2Ah ; * ASCII
- LJMP TRANSMIT
- LINHA3:
- CALL DEBOUNCE
- JNB P2.7, SETE
- JNB P2.6, OITO
- JNB P2.5, NOVE
- JNB P2.4, CCC
- JMP BEGIN
- SETE:
- ;MOV A, #37h ; 7 ASCII
- MOV A, #07h
- JMP BEGIN
- OITO:
- ;MOV A, #38h ; 8 ASCII
- MOV A, #08h
- JMP BEGIN
- NOVE:
- ;MOV A, #39h ; 9 ASCII
- MOV A, #09h
- JMP BEGIN
- CCC:
- ;MOV A, #43h ; C ASCII
- JMP BEGIN
- LINHA2:
- CALL DEBOUNCE
- JNB P2.7, QUATRO
- JNB P2.6, CINCO
- JNB P2.5, SEIS
- JNB P2.4, BBB
- JMP BEGIN
- QUATRO:
- ;MOV A, #34h ; 4 ASCII
- MOV A, #04h
- JMP BEGIN
- CINCO:
- ;MOV A, #35h ; 5 ASCII
- MOV A, #05h
- JMP BEGIN
- SEIS:
- ;MOV A, #36h ; 6 ASCII
- MOV A, #06h
- JMP BEGIN
- BBB:
- ;MOV A, #42h ; B ASCII
- JMP BEGIN
- LINHA1:
- CALL DEBOUNCE
- JNB P2.7, UM
- JNB P2.6, DOIS
- JNB P2.5, TRES
- JNB P2.4, AAA
- JMP BEGIN
- UM:
- ;MOV A, #31h ; 1 ASCII
- MOV A, #01h
- JMP BEGIN
- DOIS:
- ;MOV A, #32h ; 2 ASCII
- MOV A, #02h
- JMP BEGIN
- TRES:
- ;MOV A, #33h ; 3 ASCII
- MOV A, #03h
- JMP BEGIN
- AAA:
- ;MOV A, #41h ; A ASCII
- JMP BEGIN
- CALC_FREQ:
- TRANSMIT:
- MOV R0, #06h
- MOV SPDAT, R0
- JNB transmit_completed,$; /* wait end of transmition */
- CLR transmit_completed; /* clear software transfert flag */
- MOV SPDAT,#00h; /* data is send to generate SCK signal */
- JNB transmit_completed,$; /* wait end of transmition */
- CLR transmit_completed; /* clear software transfert flag */
- MOV data_save,serial_data; /* save receive data */
- JMP BEGIN
- MINI_DELAY:
- MOV R3, #0FFH
- DJNZ R3, $
- RET
- DEBOUNCE:
- CALL DELAY
- MOV R1, #250 ; VARIAVEL DE CONTROLE PARA 20 LEITURAS SUCESSIVAS
- LOOPDEBOUNCE:
- MOV A, P2 ; MOVE O BYTE LIDO NO P2 PARA O ACUMULADOR P/ COMPARAÇÃO
- NOP
- CJNE A, P2, DEBOUNCEFAIL
- ;CALL MINI_DELAY
- DJNZ R1, LOOPDEBOUNCE ; CASO A LEITURA SEJA CONFIRMADA, PARTE PARA AS LEITURAS SUCESSIVAS RESTANTES
- RET ; CASO FIM DE DEBOUNCE COM SUCESSO, RETORNA PARA VALIDAR A TECLA
- DEBOUNCEFAIL:
- JMP BEGIN ;
- DELAY:
- MOV R3, #2 ; CARREGA O REGISTRO DE CONTROLE DE TEMPO PARA APROXIMADAMENTE 200MS
- LOOP3:
- MOV R4, #0FFH ; CARREGA O VALOR MAXIMO EM R4
- LOOP4:
- MOV R2, #0FFH ; CARREGA O VALOR MAXIMO EM R2
- DJNZ R2, $ ; DECREMENTA R2 PARA GASTAR TEMPO
- DJNZ R4, LOOP4 ; DECREMENTA R4 APÓS 255 DECREMENTOS DE R2 PARA GASTAR TEMPO
- DJNZ R3, LOOP3 ; DECREMENTA R3 APÓS 255 DECREMENTOS DE R4 PARA GASTAR TEMPO
- RET
- ;/**
- ; * FUNCTION_PURPOSE:interrupt
- ; * FUNCTION_INPUTS: void
- ; * FUNCTION_OUTPUTS: transmit_complete is software transfert flag
- ; */
- it_SPI:; /* interrupt address is 0x004B */
- MOV R7,SPSTA;
- MOV ACC,R7
- JNB ACC.7,break1;case 0x80:
- MOV serial_data,SPDAT; /* read receive data */
- SETB transmit_completed; /* set software flag */
- break1:
- JNB ACC.4,break2;case 0x10:
- ; /* put here for mode fault tasking */
- break2:;
- JNB ACC.6,break3;case 0x40:
- ; /* put here for overrun tasking */
- break3:;
- RETI
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement