Hello
Below are the functions to convert a 3 digit decimal to BCD format and to convert from 3 digit BCD to Binary. Can anyone please explain it clearly??
/************************************************************************/ /* Name : WORDToBCD3 to Converts a 3 digit decimal to BCD format */ *************************************************************************/ u16 WORDToBCD3(u16 value) { u16 bcdhigh = 0; while (value >= 100) { bcdhigh++; value -= 100; } bcdhigh <<= 4; while (value >= 10) { bcdhigh++; value -= 10; } return (bcdhigh << 4) | value; } /************************************************************************/ /* Name : BCD3ToWORD to convert from 3 digit BCD to Binary */ *************************************************************************/ u16 BCD3ToWORD(u16 value) { return (u16)((((value&0xF00)>>8)*100) + (((value&0x0F0)>>4)*10) + (value&0x0F)); }
Mathew;
The code appears straight forward enough. If you don't understand the shift operations and compare operations, I suggest that you look up these operations in a good C manual.
Also, I suggest that you code this in a simple program and step through the code and monitor each operation and var for a full understanding.
Bradford
using '/' and '%' it could be much more efficient.
anyhow as to the OP's question, I totally agree with Al
Erik
"using '/' and '%' it could be much more efficient."
Not always. It depends on processor support for integer division - still lacking in some new processors.
Ok.. i did a small study on th eoperators and here is what i understood. I also tried to do an example s.. see bottom... But i am getting wrong result. Can anyone help??
u16 WORDToBCD3(u16 value) { u16 bcdhigh = 0;// initializing bcdhigh as zero while (value >= 100) //Checking if it is a 3 digit number { bcdhigh++;//If it is a 3 digit number , then value of bcdhigh is incremented i.e now it is = 1 value -= 100; // The variable value has now new content which is value - 100 } bcdhigh <<= 4; // means Bitwise left shift assignment. It shift bcdhigh left by 4 bits while (value >= 10) // Checking if it is a 2 digit number { bcdhigh++;//value of bcdhigh is incremented value -= 10;// means value = value - 10 } return (bcdhigh << 4) | value; // it returns the value of (Bitwise left shift i.e all bits in bcdhigh shifted left by 4 bits) OR each bit in value }
Example lets take value = 102 then while (102 >= 100) bcdhigh= 1 ( in binary 1) value = 102 -100 i.e 2 ( in binary 0010) bcdhigh <<= 4; means 10000
returning value = 10000 OR 0010 which gives a binary value of 0b10011100011000 ( decimal equivalent = 10008) ????
Am i wrong somewhere???
yes, get a 'C' book and study it.
This is about as elementary as it can get
Some suggestions here: blog.antronics.co.uk/.../
View all questions in Keil forum