Eu estou desenvolvendo um novo produto que utiliza o DS1302 para marcar as horas e me deparei com uma coisa muito simples que as vezes confunde a cabeça da gente...Eu necessita de um conversor DECIMAL para BCD e vice versa....Daí fiz essa rotina bem simples e que funciona muito bem, Criticas e sugestões por favor.
Muito obrigado
Von,
Rotina do conversor em Assembler, graças a Deus:
Conversor_Dec_Bcd:
Goto TableBCD
;-----------
Conversor_Bcd_Dec:
Movwf Conversor ; Carrega o valor BCD na variável "CONVERSOR"
Clrf ContadorBCD ; Reinicializa ponteiro do contador de ventos
LoopBCD:
Movf ContadorBCD, w ; Carrega o ponteiro da tabela
Call TableBCD ; Chama os dados contidos na tabela BCD
Subwf Conversor, w ; Verifica se "CONVERSOR" é igual ao dado
;da tabela BCD
Btfsc Status, z ; Faz a comparação!
Goto SaiLoopBcd ; Identificação do valor BCD
;
Incf ContadorBCD, f ; Contador de eventos (0 à 59 = 60 steps)
Movf ContadorBCD, w ; Efetua a verificação de overflon
Sublw .60 ; Se for maior que 59 overflon
Btfsc Status, z ; Efetua comparação
Return ; Houve overflon, retornar sem
; nenhuma ação, mantendo o ultimo dado valido
Goto LoopBCD ; Não é igual continua verificando
SaiLoopBcd:
Movf ContadorBCD, w ; Fim da conversão o resultado esta no
;acumulador no formato Decimal
Return
;-----------
TableBCD:
Addwf Pcl
; MSB LSB
; BCD 4bit ----|----
Retlw B'00000000' ; 00 BCD
Retlw B'00000001' ; 01 BCD
Retlw B'00000010' ; 02 BCD
Retlw B'00000011' ; 03 BCD
Retlw B'00000100' ; 04 BCD
Retlw B'00000101' ; 05 BCD
Retlw B'00000110' ; 06 BCD
Retlw B'00000111' ; 07 BCD
Retlw B'00001000' ; 08 BCD
Retlw B'00001001' ; 09 BCD
Retlw B'00010000' ; 10 BCD
Retlw B'00010001' ; 11 BCD
Retlw B'00010010' ; 12 BCD
Retlw B'00010011' ; 13 BCD
Retlw B'00010100' ; 14 BCD
Retlw B'00010101' ; 15 BCD
Retlw B'00010110' ; 16 BCD
Retlw B'00010111' ; 17 BCD
Retlw B'00011000' ; 18 BCD
Retlw B'00011001' ; 19 BCD
Retlw B'00100000' ; 20 BCD
Retlw B'00100001' ; 21 BCD
Retlw B'00100010' ; 22 BCD
Retlw B'00100011' ; 23 BCD
Retlw B'00100100' ; 24 BCD
Retlw B'00100101' ; 25 BCD
Retlw B'00100110' ; 26 BCD
Retlw B'00100111' ; 27 BCD
Retlw B'00101000' ; 28 BCD
Retlw B'00101001' ; 29 BCD
Retlw B'00110000' ; 30 BCD
Retlw B'00110001' ; 31 BCD
Retlw B'00110010' ; 32 BCD
Retlw B'00110011' ; 33 BCD
Retlw B'00110100' ; 34 BCD
Retlw B'00110101' ; 35 BCD
Retlw B'00110110' ; 36 BCD
Retlw B'00110111' ; 37 BCD
Retlw B'00111000' ; 38 BCD
Retlw B'00111001' ; 39 BCD
Retlw B'01000000' ; 40 BCD
Retlw B'01000001' ; 41 BCD
Retlw B'01000010' ; 42 BCD
Retlw B'01000011' ; 43 BCD
Retlw B'01000100' ; 44 BCD
Retlw B'01000101' ; 45 BCD
Retlw B'01000110' ; 46 BCD
Retlw B'01000111' ; 47 BCD
Retlw B'01001000' ; 48 BCD
Retlw B'01001001' ; 49 BCD
Retlw B'01010000' ; 50 BCD
Retlw B'01010001' ; 51 BCD
Retlw B'01010010' ; 52 BCD
Retlw B'01010011' ; 53 BCD
Retlw B'01010100' ; 54 BCD
Retlw B'01010101' ; 55 BCD
Retlw B'01010110' ; 56 BCD
Retlw B'01010111' ; 57 BCD
Retlw B'01011000' ; 58 BCD
Retlw B'01011001' ; 59 BCD