Obrigado pelas dicas....
Escrevi o seguinte código em ASM. Através de duas chaves (C_1 e C_2) você configura dois displays. E quando programar o tempo que deseja decrementar, basta apertar a CHAVE_C que o relógio começará a decrementar. Só que por enquanto ele decrementa "internamente" sem mostrar no visor ex: 42, 41, 40... ou seja, se você programar o tempo de 10s, quando for apertada a chave COMEÇA o relógio começará a decrementar e continuará mostrando o tempo 10s até o final, quando aparecerá no display 2 a letra "F" de FIM.
O programa está com a data de janeiro, mas voltei a trabalhar nele ontem.
Segue o programa:
; ---------------- RENATO NOGUEIRA -------------
; PROGRAMA: Cronometro decrescente de 59 / 00s |
; MICRO: 89S52 - 12MHz |
; DATA: 09/01/10 |
; ----------------------------------------------
;
;
;=============================== DECLARACAO DE EQUS ===============================
ORG 00H
D_1 EQU P1
D_2 EQU P2
CHAVE_1 EQU P3.1
CHAVE_2 EQU P3.2
CHAVE_C EQU P3.6
;=============================== INICIO DO PROGRAMA ===============================
INICIO: MOV DPTR, #TABELA_1
MOV R1, #0
MOV A, R1
MOVC A, @A+DPTR
MOV D_1, A
MOV DPTR, #TABELA_2
MOV R2, #0
MOV A,R2
MOVC A, @A+DPTR
MOV D_2,A
MOV R4, #0
;=============================== LEITURA DA CHAVE_1 ===============================
LER_CHAVE_1: JB CHAVE_1, LER_CHAVE_2
INC R1
MOV A, R1
MOV DPTR, #TABELA_1
MOVC A, @A+DPTR
MOV D_1, A
JNB CHAVE_1, $
CJNE R1, #10, LER_CHAVE_2
MOV R1, #0
;=============================== LEITURA DA CHAVE_2 ===============================
LER_CHAVE_2: JB CHAVE_2, LER_CHAVE_C
INC R2
MOV A, R2
MOV DPTR, #TABELA_2
MOVC A, @A+DPTR
MOV D_2, A
JNB CHAVE_2, $
CJNE R2, #7, LER_CHAVE_C
MOV R2, #0
;=============================== LEITURA DA CHAVE_C ===============================
LER_CHAVE_C: JB CHAVE_C, LER_CHAVE_1
MOV A, R2
MOV B, #10
MUL AB
MOV B, R1
ADD A, B
JNB CHAVE_C, $
;===================================== COMECA =====================================
COMECA: INC R4
MOV 30H, R4
CJNE A, 30H, COMECA
DECREMENTA: ACALL TEMPO
DJNZ R4, DECREMENTA
MOV D_2, #1110001B ; MOSTRA UM "F"
;================================= FIM DO PROGRAMA ================================
FIM: AJMP FIM
;================================== ROTINA DE 1S ==================================
TEMPO: MOV R7, #16
TT_1S: MOV TMOD, #00000001B
MOV TH0, #HIGH(15000-65000)
MOV TL0, #LOW(15000-65000)
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
DJNZ R7, TT_1S
RET
;==================================== TABELAS =====================================
TABELA_1:
DB 0111111B ; 0
DB 0000110B ; 1
DB 1011011B ; 2
DB 1001111B ; 3
DB 1100110B ; 4
DB 1101101B ; 5
DB 1111101B ; 6
DB 0000111B ; 7
DB 1111111B ; 8
DB 1100111B ; 9
DB 0111111B ; 0
TABELA_2:
DB 0111111B ; 0
DB 0000110B ; 1
DB 1011011B ; 2
DB 1001111B ; 3
DB 1100110B ; 4
DB 1101101B ; 5
DB 1111101B ; 6
DB 0111111B ; 0
END
---------------------
A minha primeira pergunta é a respeito do tempo de 1 segundo. No caso R7 deveria ser carregado com 20, mas quando faço isso dá um erro de 8/10 segundos quando comparado com o relógio do computador.
Ainda não testei o programa no hardware.
Depois eu posto a foto do esquema no proteus e um outro programa, mas desta vez mostrando o decremento. Tenho uma dúvida nele também!
