como converter hexa para BCD no Keil.

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

como converter hexa para BCD no Keil.

Mensagempor gafar » 31 Jul 2008 09:23

Galera preciso converter um byte hexa em bcd no keil e não sei como fazer.
Tenho uma rotininha pronta em assembly que faz isto, mas tb não sei como misturar C com ASM no Keil.
Alguém pode me dá um help.
Abraços
Avatar do usuário
gafar
Bit
 
Mensagens: 26
Registrado em: 23 Out 2006 08:07
Localização: São Paulo SP

Mensagempor Ander_sil » 31 Jul 2008 10:53

Testa essas rotinas ai...

Código: Selecionar todos
unsigned char Hex2Bcd(unsigned char hex_data)
{
   unsigned int bcd_data;
   unsigned char temp;
   
   temp=hex_data%100;
   bcd_data=((unsigned int)hex_data)/100<<8;
   bcd_data=bcd_data|temp/10<<4;   
   bcd_data=bcd_data|temp%10;
   return bcd_data;
}

unsigned char Bcd2Hex(unsigned char bcd_data)
{
   unsigned char temp;
   temp=((bcd_data>>4)*10)+(bcd_data&0x0f);
   return temp;
}


Para converter um int para bcd tem essa macro
#define bcd(x) ((x)%10 + 16*((int)(x)/10))

ainda não testei hehe...

Falow.
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor brasilma » 31 Jul 2008 13:19

Belê Ronaldo,

Tirei estes segmentos de código de uma aplicação que funciona belezura, e dei uma comentada, eles servem para ajustar os dados que são escritos e lidos de um RTC.

Provavelmente após postar a formatação vai virar uma bagunça, copie e cole num editor de texto para arrumar e entender.

Basicamente a conversão consiste em dividir ou multiplicar por 10, para ajustar a base, sem esquecer do resto (o sistema cuida disso).

Em hexa em 2s digitos dá para escrever até 255 (0xFF) em BCD no máximo 99.

Qualquer coisa estamos ai.

Abraços,
MArcos.



; ************************************************************
; Converte de BCD para HEXA
; ************************************************************

BCD2HEXA: MOV 0FH,A ; esse 0FH é um endereço de memória para guardar o valor temporariamente
ANL A,#0F0H ; elimina a parte + significativa
SWAP A
MOV B,#10
MUL AB
MOV B,A
MOV A,0FH
ANL A,#0FH
ADD A,B

; ************************************************************
; Converte de HEXA para BCD
; ************************************************************

MOV A,R2
MOV B,#0AH
DIV AB ;divide por 10
SWAP A
ADD A,B
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor Ander_sil » 31 Jul 2008 13:41

Para colocar codigo assembly no C basta usar
Código: Selecionar todos
#asm

   // codigo

#endasm


falow.
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor gafar » 01 Ago 2008 08:57

Rapaziada obrigado pela ajuda.
usei a função abaixo e blza, porém o keil (V2.23)não entende as duas variáveis declaradas dentro da função, tive que declarar como global, alguém sabe pq?

Qto ao assembly não funcionou no keil, já usei desta maneira no Codevision sem problemas.
Abraços

Código: Selecionar todos
unsigned char Hex2Bcd(unsigned char hex_data)
{
   unsigned int bcd_data;
   unsigned char temp;
   
   temp=hex_data%100;
   bcd_data=((unsigned int)hex_data)/100<<8;
   bcd_data=bcd_data|temp/10<<4;   
   bcd_data=bcd_data|temp%10;
   return bcd_data;
}
Avatar do usuário
gafar
Bit
 
Mensagens: 26
Registrado em: 23 Out 2006 08:07
Localização: São Paulo SP

Mensagempor brasilma » 01 Ago 2008 11:56

Bom dia Ronaldo,

Quem é muito bom no Keil é o Maurício, posso ajudar com algumas referencias:

Aqui tem um exemplo http://www.keil.com/support/docs/2892.htm

void myfunc (void) {
#pragma ASM
/* My comment in assembler */
mov a, #0 // I'm using another comment
#pragma ENDASM
}

Abraços,
MArcos.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor Maurício » 01 Ago 2008 19:47

Fala, brasilma.

Nem tanto assim, eheheheheheh

Gafar!
Essa operação de declarar variáveis dentro de uma função, é padrão da linguagem C, e o Keil aceita normalmente.

Tem que ver seu programa completo, pra analisar o que está acontecendo.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x