Necroteeth писал(а): в общем, можно ли одной командой 0b00010101 превратить в 0b10010101
Да, если Ваш МК поддерживает команды
sbr и
cbr
Например у вас в r16 есть значение 0b
00010101 и Вам его надо превратить в 0b
10010101
Для этого это делается так:
Код: Выделить всё
sbr r16, 7 ;Устанавливаем 7й бит в единицу.
cbr r16, 7 ;Сбросим 7й бит в ноль.
Если у Вас значение в регистре ввода\вывода (порт), то так:
Код: Выделить всё
sbi PORTD, PD7 ;Установим единицу на ноге PD7
cbi PORTD, PD7 ;Сбросим ногу PD7 в ноль
Если у Вас значение в каком-то из прочих регистров, например в каком-то из регистров таймера, то Вам надо сначала считать его содержимое в один из свободных регистров РОН, потом изменить его, как в первом примере и отправить назад. Изменится только тот бит в регистре, который Вы изменили.
Код: Выделить всё
in r16, TIMSK ;Считаем содержимое изменяемого регистра.
sbr r16, 7 ;Устанавливаем 7й бит в единицу.
out TIMSK, r16 ;Вернём изменённый байт обратно.
Всё дело в том, что перечисленные выше команды не работают для некоторых регистров специального назначения. И по этому делать приходится так.
Так как большинство команд у нас выполняется за 1 такт, а тактовая у нас бывает и 8МГц, то эти операции будут просто незаметными. При 8 МГц микроконтроллер успеет выполнить
до 8 миллионов команд. Но может и немного меньше, потому, что некоторые команды выполняются и за 2, 3, 4 и т.д. такта.