Damyen 0 14 часов назад Опубликовано 14 часов назад · Жалоба Здравствуйте. В языке Си, чтобы выставить или обнулить отдельный бит в регистре, нужно использовать команды сдвига и логические операции. Например был регистр 01010001, а стал 01010101. Но тогда же остальные биты в байте тоже же перезапишутся, просто с предыдущими значениями. А можно ли выставить (или обнулить) только один бит в регистре, не трогая остальные биты? На языке Си. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 220 13 часов назад Опубликовано 13 часов назад · Жалоба 21 минуту назад, Damyen сказал: В языке Си, чтобы выставить или обнулить отдельный бит в регистре В языке си нету регистров. 21 минуту назад, Damyen сказал: А можно ли выставить (или обнулить) только один бит в регистре, не трогая остальные биты? На языке Си. Регистры есть в микроконтроллерах. А можно или нет производить операции с отдельными битами каждого конкретного периферийного регистра - читайте в мануале на ваш микроконтроллер. Некоторые периферийные регистры это позволяют. Но для этого нужно сперва открыть и прочитать мануал на эту периферию. Также средства для атомарных манипуляций с битами есть в некоторых архитектурах. В ARM например - (bit-banding). На уровне ядра (CPU). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Damyen 0 13 часов назад Опубликовано 13 часов назад (изменено) · Жалоба Да я понимаю, что регистры есть в МК. И также знаю, что это можно сделать на ассемблере. Но вот для операций с отдельными битами на Си, прочитал, что можно использовать команду PORTB = PORTB | (1 << 5), чтобы выставить 5 бит. Но если внимательно на нее посмотреть, то мы все равно взаимодействуем со всем регистром МК, а не с одним битом. Изменено 13 часов назад пользователем Damyen Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 5 13 часов назад Опубликовано 13 часов назад · Жалоба В Си нет таких средств, так что только через вставку ассемблерных команд SBI, CBI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v05 1 13 часов назад Опубликовано 13 часов назад (изменено) · Жалоба Как раз то "PORTB = PORTB | (1 << 5)" после компиляции "превратится" в одну SBI. Другое дело, что в AVR битовые операции взаимодействуют со всем байтом данных, т.е. производится операция "чтение-модификация-запись". И пофиг тут, Си или ассемблер.) Изменено 13 часов назад пользователем v05 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться