Бразильське привітання!
Перш за все дякую Джобі за твій приклад. По-друге, його приклад має лише незначну помилку. Число 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 (наш вхідний контакт, де підключена кнопка). до) встановлено на високу чи ні. Всі інші штифти будуть ЛІЖНІ, оскільки двійкові біти встановлені на 0, а оскільки бінарний біт №2 встановлений на 1, оператор IF буде ПРАВИЛЬНИМ лише у випадку, якщо для входу PD2 встановлено високе значення або ЛІЖНЕ, якщо вхід PD2 дорівнює встановити низький.
коментар №3 : Дотримуючись логіки, поясненої в коментарі №1, ця команда встановлює вихідний контакт PINB2 в порту PORTB на високу напругу. Якщо ваш світлодіод правильно підключений до цього штифтового порту з резистором ~ 300 Ом, і цей резистор підключений до землі, світлодіод повинен увімкнути.
коментар №4 : Світлодіод повинен вимикатися з тих же причин, що пояснювались у попередніх коментарях.
Заключні міркування:
а) Щоб уникнути коливань напруги на вхідному штифті PD2, коли кнопка не натиснута (відкрита схема), я настійно рекомендую розмістити розсувний резистор (1 кОм або вище), щоб світлодіод не загорівся випадково через до цього випадкового коливання напруги.
б) Заперечення відмови: Описані тут ідеї повинні використовуватися лише як навчальні, і вони НЕ повинні використовуватися в будь-якій реальній системі перед консультацією з експертом з електроніки.
* /