We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I am trying to use the following code to convert 2 digit ASCII numbers to BCD number, for setting RTC Clock DS1307.
unsigned char ASCII_TO_BCD(unsigned char ascii_text[2]) { unsigned char bcd_value; ascii_text[0] &= 0x0F; // set high nibble(3) to 0 (may not be needed) ascii_text[0] <<= 4; // shift lower nibble to higher ascii_text[1] &= 0x0F; // set high nibble(3) to 0 (may not be needed) bcd_value = ascii_text[0] | ascii_text[1]; // mix both to get BCD return bcd_value; }
When I pass '12' to the function, 0x33 is returned instead of 0x12. Is something wrong in this code? Thanks.
Now if you only use digits (0..9) - why then did you suddenly include the one line that makes use of character 'a' and was intended for the hexadecimal range 'a' .. 'f'?
Next thing - the guy who did give you example code does something I don't like:
bcd_value = ( ascii_text[0] - 48) << 4 ; // 48 for '0' ASCII offset
ascii_text contains characters ('0', '1', ... '9') 48 is a magic number that requires the comment "48 for '0' ASCII offset".
So a comment is explicitly needed just because the code is mixing between characters and the ordinal numbers of characters.
It is way better to write:
bcd_value = ( ascii_text[0] - '0') << 4 ;
Suddenly, no comment is needed since there is no longer any magic value 48 to explain.
There is a big reason why the C language allows us to perform mathematical operations directly using characters.
Thanks Per, I had used wrong line of code. I also changed 48 to '0'. Certainly it is more readable & understandable.
No problem.