converter BCD para ASCII

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

converter BCD para ASCII

Mensagempor deniro » 05 Set 2007 07:50

Alo galera, alguem poderia me ajudar numa função em linguagem C que converta o codigo BCD para ASCII eu esotu ultilizando MC at89s8253.
Avatar do usuário
deniro
Byte
 
Mensagens: 135
Registrado em: 19 Out 2006 20:18
Localização: Rio de Janeiro

Mensagempor veioloko » 05 Set 2007 09:24

valor = valor + 0x30;

serve?
veioloko
Byte
 
Mensagens: 348
Registrado em: 10 Nov 2006 06:01
Localização: São Bernardo do Campo

Mensagempor Maia » 05 Set 2007 13:15

PS. Depois de enviar é que eu vi que não era isso, mas fica aí pra quem precisar



Essa eu uso nos PIC. Vê se serve.

void hex_to_bcd(unsigned int hx)
{
union {
struct {
unsigned long low; // 4 bytes (3210)
unsigned long high; // 4 bytes (7654)
} lng;
unsigned char bytes[8]; // bytes 76543210
} cdec;

signed char c;
unsigned char d;

cdec.lng.low = hx; // input
cdec.lng.high = 0; // becomes output after conversion

for (c = 0; c < 32; c++) { // 32 bits to shift (see notes)
d = cdec.bytes[3];
cdec.lng.low <<= 1; // 4 bytes (bytes 3210)
cdec.lng.high <<= 1; // 4 bytes (bytes 7654)
if ((d & 0x80) == 0x80)
cdec.bytes[4] |= 1; // shift low(byte3)>>high(byte4)

for ( d = 4; d < 8; d++) {
if ((cdec.bytes[d] & 0x0F) >= 0x05)
cdec.bytes[d] += 0x03; // conversion (see notes)
if ((cdec.bytes[d] & 0xF0) >= 0x50)
cdec.bytes[d] += 0x30; // conversion (see notes)
}
}
UMSB = (cdec.lng.high >> 12) & 0x0F; // pick outputs from correct location
LMSB = (cdec.lng.high >> 8 ) & 0x0F;
ULSB = (cdec.lng.high >> 4 ) & 0x0F;
LLSB = (cdec.lng.high) & 0x0F;

if (UMSB >= 8 ) UMSB -= 3; // correction for dec output after conversion
if (LMSB >= 8 ) LMSB -= 3; //
if (ULSB >= 8 ) ULSB -= 3; //
if (LLSB >= 8 ) LLSB -= 3; //
UMSB |= 0x30;
LMSB |= 0x30;
ULSB |= 0x30;
LLSB |= 0x30;

}

Abraços,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor ftegon » 06 Set 2007 16:20

Ola!

Vê se te serve.

Código: Selecionar todos
//---------------------------------------------------------------------------
unsigned char hex2bcd(unsigned char hex)
{
unsigned char bcd;

bcd = ((hex / 10) << 4) + (hex % 10);
return(bcd);
}//hex2bcd
//---------------------------------------------------------------------------
unsigned char bcd2hex(unsigned char DataBCD){
 return ((DataBCD / 16) * 10 + DataBCD % 16);
}
//---------------------------------------------------------------------------


//------  bcd2ascii ------
unsigned char digito[2];
 
digito[0] = (bcd >> 4) + 0x30;         
digito[1] = ((bcd & 0x0F ) | (unsigned char)0x30);       
 


Até+

Fabio Tegon
Editado pela última vez por ftegon em 07 Set 2007 13:41, em um total de 2 vezes.
ftegon
Bit
 
Mensagens: 36
Registrado em: 13 Out 2006 09:05

Mensagempor Maurício » 06 Set 2007 17:42

Experimenta isto. Vc passa o BCD para a função, ela devolve as dezenas como um valor de retorno e as unidades são devolvidas pela própria variável de entrada:

Código: Selecionar todos
char BCD2ASCII ( char * dado )
{
    char var;

    var = *dado;
    *dado = (var & 0x0F) + '0';
    return ( (var & 0xF0) >> 4 + '0' );
}

void main ( void )
{
    char dezenas, dado_BCD;

    dado_BCD = 0x78;
    dezenas = BCD2ASCII ( &dado_BCD );
    // UNIDADES EM dado_BCD; DEZENAS EM dezenas;
    while(1);
}


[]'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