Lời chào Brazil!
Trước hết cảm ơn Joby cho ví dụ của bạn. Thứ hai, ví dụ của anh ta chỉ là một lỗi nhỏ. Số 0x20 không đúng. Nó phải là 0x04. Ngoài ra, chỉ là một gợi ý, tôi sẽ không sử dụng các số thập lục phân như 0xFB, 0x20 hoặc 0x04 trong mã. Tôi sẽ đề nghị sử dụng các định nghĩa cổng PIN được tìm thấy trong io.h và các định nghĩa khác được tham chiếu bởi tệp tiêu đề. Tôi đã viết lại ví dụ của Joby bên dưới, với một số bình luận cho người mới bắt đầu.
# 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;
}
/ *
ý kiến cho người mới bắt đầu
bình luận số 1: (1 << PD2) tạo nhị phân 00000100. Thao tác "~" lật tất cả các chữ số, tức là, nhị phân bây giờ là 11111011. Cuối cùng, & = áp dụng logic "AND" giữa DDRD và 11111011 và kết quả được đặt lại trong bộ nhớ DDRD. Lưu ý: Những gì toán tử "AND" làm là cho mỗi bit trong bộ nhớ DDRD, nó so sánh với số nhị phân ở trên. Nếu bit trong DDRD là 0 và bit trong nhị phân ở cùng vị trí cắn là 1, thì bit kết quả là 0, nếu DDRD là 1 và bit trong nhị phân là 1, bit kết quả là 1 và nếu bit trong DDRD là 1 hoặc 0 và bit trong nhị phân là 0 thì bit kết quả luôn là 0. Tóm lại, lệnh DDRD & = ~ (1 << PD2) chỉ thay đổi bit PD2 thành 0 và không để lại các bit khác (số không hoặc số không). Có vẻ hơi phức tạp, nhưng sau khi bạn quen với nó, đó là cách tốt nhất để thay đổi một chút trong một vết cắn mà không thay đổi các bit khác.
nhận xét # 2 : (1 << PD2) tạo nhị phân 00000100. Sử dụng cùng logic "VÀ" được mô tả trong nhận xét # 1, lệnh "PIND & 0000100" chỉ kiểm tra nếu PIND2 (pin đầu vào của chúng tôi có nút ấn được kết nối đến) được đặt thành cao hay không. Tất cả các chân khác sẽ là FALSE vì các bit nhị phân được đặt thành 0 và vì bit nhị phân # 2 được đặt thành 1, câu lệnh IF sẽ chỉ TRUE nếu đầu vào PD2 được đặt thành cao hoặc FALSE nếu đầu vào PD2 là đặt ở mức thấp.
Nhận xét # 3 : Theo logic được giải thích trong nhận xét # 1, lệnh này đặt chân PINB2 đầu ra ở cổng PORTB thành điện áp cao. Nếu đèn LED của bạn được kết nối đúng với cổng pin này với điện trở ~ 300 ohms và điện trở đó được kết nối với mặt đất, đèn LED sẽ bật.
bình luận # 4 : Đèn LED sẽ tắt vì những lý do tương tự được giải thích trong các bình luận trước đó.
Cân nhắc cuối cùng:
a) Để tránh dao động điện áp trong chân đầu vào PD2 khi không nhấn nút ấn (mạch hở), tôi khuyên bạn nên đặt điện trở kéo xuống (1 kOhm trở lên), để đèn LED không sáng lên do vô tình đến dao động điện áp ngẫu nhiên này.
b) Một lưu ý từ chối trách nhiệm: Các ý tưởng được mô tả ở đây chỉ được sử dụng như mục đích giáo dục và chúng KHÔNG nên được sử dụng trong bất kỳ hệ thống thực nào trước khi tham khảo ý kiến chuyên gia về điện tử.
* /