This was posted a while ago by Scott Dattalo: ;******************************************************************* ;scale_hex2dec ; The purpose of this routine is to scale a hexadecimal byte to a ;decimal byte. In other words, if 'h' is a hexadecimal byte then ;the scaled decimal equivalent 'd' is: ; d = h * 100/256. ;Note that this can be simplified: ; d = h * 25 / 64 = h * 0x19 / 0x40 ;Multiplication and division can be expressed in terms of shift lefts ;and shift rights: ; d = [ (h<<4) + (h<<3) + h ] >> 6 ;The program divides the shifting as follows so that carries are automatically ;taken care of: ; d = (h + (h + (h>>3)) >> 1) >> 2 ; ;Inputs: W - should contain 'h', the hexadecimal value to be scaled ;Outputs: W - The scaled hexadecimal value is returned in W ;Memory: temp ;Calls: none scale_hex2dec MOVWF temp ;Hex value is in W. CLRC ;Clear the Carry bit so it doesn't affect RRF RRF temp,F CLRC RRF temp,F CLRC RRF temp,F ;temp = h>>3 ADDWF temp,F ;temp = h + (h>>3) RRF temp,F ;temp = (h + (h>>3)) >> 1 ADDWF temp,F ;temp = h + ((h + (h>>3)) >> 1) RRF temp,F CLRC RRF temp,W ;d = W = (h + (h + (h>>3)) >> 1) >> 2 RETURN Reggie ---------- > From: calls@MAMA.INDSTATE.EDU > To: PICLIST@MITVMA.MIT.EDU > Subject: CNVT binary to % > Date: Saturday, June 13, 1998 2:13 AM > > I am working with the PIC's A/D converter. I need to convert the number > that the A/D converter generates into a percentage between 1-100%. The > resulting number only needs to be an 8-bit number. What is the most > efficient way to do this? I think a look-up table would be a waste of > space. Any thoughts or guidance? > > Thanks > > > Shawn Call > calls@mama.indstate.edu