К примеру есть число 0х113 (два байта) = 0b0000 0001 0001 0011.
Суть нужно запихнуть младшие три бита 011 в 5, 6, 7 биты регистра т.е (0b011* ****),
а остальные 0010 0010 присвоить старшему регистру.
Как правильно и грамотно это сделать. Сначала разложить на байты и сдвинуть? Есть варианты с указателями....
Что предпочтительнее?
unsigned int c = 0x113;
unsigned char temp_l, H, L = 15;
void main(void)
{
while (1) {
temp_l = c;
temp_l = (temp_l << 5);
L |= temp_l;
H = (c >> 3);
}
}
Вот так работает, но уверен можно написать красивее.
Как разложить два байта на байты.
- Ljutyj
- Первый раз сказал Мяу!
- Сообщения: 24
- Зарегистрирован: Сб июл 05, 2014 08:27:39
- Откуда: Казань
Как разложить два байта на байты.
Последний раз редактировалось Ljutyj Вт май 01, 2018 19:56:00, всего редактировалось 1 раз.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как разложить два байта на байты.
Код: Выделить всё
uint16_t x = 0x113;
uint8_t Lreg = x<<5;
uint8_t Hreg = x>>3;
Остальное доверьте компилятору.
- Ljutyj
- Первый раз сказал Мяу!
- Сообщения: 24
- Зарегистрирован: Сб июл 05, 2014 08:27:39
- Откуда: Казань
Re: Как разложить два байта на байты.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3366896#p3366896"]
Остальное доверьте компилятору.[/uquote]
Спасибо, все получилось, почти так же было описано в примере даташита, не обратил внимания.
Код: Выделить всё
uint16_t x = 0x113;
uint8_t Lreg = x<<5;
uint8_t Hreg = x>>3;
Остальное доверьте компилятору.[/uquote]
Спасибо, все получилось, почти так же было описано в примере даташита, не обратил внимания.
- philosoraptor
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Сб янв 14, 2012 22:53:50
Re: Как разложить два байта на байты.
Если не ошибаюсь, обычно это делают битмасками:
Код: Выделить всё
L = temp_l&~0xfff8;
H = temp_l&0xff00;