Tänker jag rätt nu? HEX till BCD
Postat: 9 oktober 2008, 16:12:58
Till o börja med vill jag be om ursäkt till de personer som får scrolla i sidled. Hoppas det går bra ändå.
Jag håller på att programmera ett program till en MCU där jag får in ett hexadecimalt värde från ett register (från en A/D-omvandlare i detta fall) och vill omvandla det till BCD för att kunna lägga ut det på en 7-segments LCD.
Detta är den kod jag har skrivt för omvandlingen. Tyvärr har jag inte fårr displayerna än så jag kan inte se resultatet. Men någon här kanske kan se om jag har gjort någon tankevurpa. Själv är jag osäker på om jag har gett varblerna rätt datatyper för ändamålet samt om jag castar rätt.
Jag håller på att programmera ett program till en MCU där jag får in ett hexadecimalt värde från ett register (från en A/D-omvandlare i detta fall) och vill omvandla det till BCD för att kunna lägga ut det på en 7-segments LCD.
Detta är den kod jag har skrivt för omvandlingen. Tyvärr har jag inte fårr displayerna än så jag kan inte se resultatet. Men någon här kanske kan se om jag har gjort någon tankevurpa. Själv är jag osäker på om jag har gett varblerna rätt datatyper för ändamålet samt om jag castar rätt.
Kod: Markera allt
unsigned char hex; /* Value in 8-bit Hexadecimal notation (0x00-0xFF) */
unsigned char bcd[3]; /* Array containig the Value in Binary Coded Decmal notation ({0b0000,0b0000,0b0000}-{0b0010,0b0101,0b0101}) */
unsigned short int valFac; /* Factor containing the value of each bit (0,1) */
unsigned short int sigFac; /* Factor containing the significance of each bit (1,2,4,8,16,32,64,128) */
unsigned short int prod; /* The product of valFac and sigFac muliplied */
unsigned short int dec; /* Value in Decimal notation (0-255)*/
unsigned short int i; /* Counter for loops. Used in both loops */
.
.
.
if (ADSCR & (1 << 7)) { /* If a conversion was completed (if COCO is set) */
hex = ADR; /* Load Value of A/D data register into hex*/
dec = 0; /* Reset dec */
bcd = {0, 0, 0}; /* Reset bcd */
for (i = 0; i < 8; i++){ /* For every bit in hex */
valFac = (unsigned short int)(hex & (unsigned char)(1 << i)); /* Assign to valFac the value of the current bit in binary*/
sigFac = (unsigned short int)(1 << i); /* Assign to sigFac the significance of the current bit */
prod = valFac * sigFac; /* Multiply valFac and sigFac to get the value of current bit in decimal*/
dec += prod; /* Add the decimal value of every bit to get value of hex in decimal*/
} /* Dec now contains the original hex value in decimal notation*/
for (i = 0; i < 3; i++){ /* For the number of positions needed to display decimal value */
bcd[i] = (unsigned char)(dec % 10); /* Assign least significant number in decimal to corresponding element in bcd-array*/
dec /= 10; /* Shift numbers in decimal one position right (to become less signinficant) */
} /* bcd-array now contains original hex value in BCD (each number in the corresponding element according to significance) */
}