Как разложить два байта на байты.

Обсуждаем контроллеры компании Atmel.
Ответить
Аватара пользователя
Ljutyj
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб июл 05, 2014 08:27:39
Откуда: Казань

Как разложить два байта на байты.

Сообщение Ljutyj »

К примеру есть число 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 Вт май 01, 2018 19:56:00, всего редактировалось 1 раз.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Как разложить два байта на байты.

Сообщение VladislavS »

Код: Выделить всё

uint16_t x = 0x113;
uint8_t Lreg = x<<5;
uint8_t Hreg = x>>3;

Остальное доверьте компилятору.
Аватара пользователя
Ljutyj
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб июл 05, 2014 08:27:39
Откуда: Казань

Re: Как разложить два байта на байты.

Сообщение Ljutyj »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3366896#p3366896"]

Код: Выделить всё

uint16_t x = 0x113;
uint8_t Lreg = x<<5;
uint8_t Hreg = x>>3;

Остальное доверьте компилятору.[/uquote]

Спасибо, все получилось, почти так же было описано в примере даташита, не обратил внимания.
Аватара пользователя
philosoraptor
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб янв 14, 2012 22:53:50

Re: Как разложить два байта на байты.

Сообщение philosoraptor »

Если не ошибаюсь, обычно это делают битмасками:

Код: Выделить всё

L = temp_l&~0xfff8;
H = temp_l&0xff00;
Ответить

Вернуться в «AVR»