Бразильские поздравления!
Прежде всего, спасибо Джоби за ваш пример. Во-вторых, в его примере есть небольшая ошибка. Число 0x20 не правильно. Это должно быть 0x04. Кроме того, как совет, я бы не использовал шестнадцатеричные числа, такие как 0xFB, 0x20 или 0x04 в коде. Я бы предложил использовать определения порта PIN, найденные в io.h, и другие, на которые ссылается заголовочный файл. Ниже я переписал пример Джоби с некоторыми комментариями для начинающих.
# include <avr/io.h>
int main (void)
{
// set all pins on PORTB for output
DDRB = 0xFF;
// set port pin PORTD2 as input and leave the others pins
// in their originally state (inputs or outputs, it doesn't matter)
DDRD &= ~(1 << PD2); // see comment #1
while (1)
{
if (PIND & (1<<PD2)) // see comment #2
PORTB |= (1<<PB2); // see comment #3
else
PORTB &= ~(1<<PB2); // see comment #4
}
return 0;
}
/ *
комментарии для начинающих
комментарий № 1: (1 << PD2) генерирует двоичный код 00000100. Операция «~» переворачивает все цифры, т. Е. Двоичный код теперь равен 11111011. Наконец, символ & = применяет логику «И» между DDRD и 11111011, и результат помещается снова в памяти DDRD. Примечание: оператор «И» выполняет для каждого бита в памяти DDRD, он сравнивается с двоичным числом, указанным выше. Если бит в DDRD равен 0 и бит в двоичном файле в той же позиции прикуса равен 1, то результирующий бит равен 0, если DDRD равен 1, а бит в двоичном файле равен 1, результирующий бит равен 1, и если бит в DDRD равен 1 или 0, а бит в двоичном файле равен 0, тогда результирующий бит всегда равен 0. Таким образом, команда DDRD & = ~ (1 << PD2) изменяет только бит PD2 на ноль и оставляет другие (нули или единицы) без изменений. Это кажется немного сложным, но после того, как вы к нему привыкнете, это лучший способ изменить бит за укус, не меняя другие биты.
Комментарий № 2 : (1 << PD2) генерирует двоичный код 00000100. Используя ту же логику «И», описанную в комментарии № 1, команда «PIND & 0000100» проверяет только, если PIND2 (наш входной контакт, к которому подключена кнопка) к) установлен на высокий или нет. Все остальные выводы будут FALSE, поскольку двоичные биты установлены в 0, а поскольку двоичный бит # 2 установлен в 1, оператор IF будет TRUE, только если для входа PD2 установлено высокое значение, или FALSE, если вход PD2 установить на низком уровне.
Комментарий № 3 : Следуя логике, объясненной в комментарии № 1, эта команда устанавливает высокое напряжение на выходном выводе PINB2 в порту PORTB. Если ваш светодиод правильно подключен к этому контактному порту с резистором ~ 300 Ом, и этот резистор подключен к земле, светодиод должен включиться.
Комментарий № 4 : светодиод должен погаснуть по тем же причинам, что и в предыдущих комментариях.
Заключительные соображения:
а) Во избежание колебаний напряжения на входном выводе PD2, когда кнопка не нажата (разомкнутая цепь), я настоятельно рекомендую установить понижающий резистор (1 кОм или выше), чтобы светодиод не загорелся случайно из-за к этому случайному колебанию напряжения.
б) Отказ от ответственности: идеи, описанные здесь, должны использоваться только в образовательных целях, и их НЕ следует использовать в какой-либо реальной системе до консультации со специалистом по электронике.
* /