como converter hexa para BCD no Keil.

Enviado:
31 Jul 2008 09:23
por gafar
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

Enviado:
31 Jul 2008 10:53
por Ander_sil
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.

Enviado:
31 Jul 2008 13:19
por brasilma
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

Enviado:
31 Jul 2008 13:41
por Ander_sil
Para colocar codigo assembly no C basta usar
- Código: Selecionar todos
#asm
// codigo
#endasm
falow.

Enviado:
01 Ago 2008 08:57
por gafar
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;
}

Enviado:
01 Ago 2008 11:56
por brasilma
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.

Enviado:
01 Ago 2008 19:47
por Maurício
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