Вот, может подойдет - для 8 и 16 битных чисел. Первый вариант функции для контроллеров без умножителя, второй - с умножителем.
Код
/** \brief unsigned 8-bit division by 5 (using shifts)<br>деление беззнакового 8-битного числа на 5 (если нет аппаратного умножения) \ingroup group_math */
u8 div_by5_u8_soft(u8 data_in)
{u16 u16_01, result;
result = u16_01 = data_in;
u16_01 <<= 1; result += u16_01;
u16_01 <<= 3; result += u16_01;
u16_01 <<= 1; result += u16_01;
result += 0x33; //correction
return(result >> 8);
}
/** \brief unsigned 8-bit division by 5 (using multiply)<br>деление беззнакового 8-битного числа на 5 (если есть аппаратное умножение) \ingroup group_math */
u8 div_by5_u8_hmul(u8 data_in)
{return((((u16)data_in * 0x33) + 0x33) >> 8);
}
/** \brief unsigned 16-bit division by 5 (using shifts)<br>деление беззнакового 16-битного числа на 5 (если нет аппаратного умножения) \ingroup group_math */
u16 div_by5_u16_soft(u16 data_in)
{u32 u32_01, result;
result = u32_01 = data_in;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
result += 0x3333; //correction
return(result >> 16);
}
/** \brief unsigned 16-bit division by 5 (using multiply)<br>деление беззнакового 16-битного числа на 5 (если есть аппаратное умножение) \ingroup group_math */
u16 div_by5_u16_hmul(u16 data_in)
{return((((u32)data_in * 0x3333) + 0x3333) >> 16);
}