Excuse me correct is 0x19 = B00011001 -> 0x18 = 24 24/64 = 3/8 and d = (h>>3) + (h>>2) You may add one time C and error is max 1% ---Justin Crooks wrote: > > ---------- > > From: Scott Dattalo > > To: PICLIST@MITVMA.MIT.EDU > > Subject: Re: Conversion of byte to percentage > > Date: Thursday, May 21, 1998 10:53 AM > > > > adrian aslett wrote: > > > > > > I have a need to convert a byte value into a percentage. I know I have > > > to work with integer values but does anyone know how I should go about > > > doing this. > > > > > > Any ideas will be appreciated ! ! > > > > Here's one that'll do it: > > > > > > ;******************************************************************* > > ;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) > What happens if result > 0xFF? > > RRF temp,F ;temp = (h + (h>>3)) >> 1 > > ADDWF temp,F ;temp = h + ((h + (h>>3)) >> 1) > Again, same issue. > > RRF temp,F > > CLRC > > RRF temp,W ;d = W = (h + (h + (h>>3)) >> 1) >> 2 > > > > RETURN > > This is excellent, but will not work for values > 64%. I like how clean it > is, though. You could add a line to check if MSB set. Subtract 128 if > set, and add 50% at the end. > _________________________________________________________ DO YOU YAHOO!? Get your free @yahoo.com address at http://mail.yahoo.com