브라질 인사!
우선 귀하의 모범에 대해 Joby에게 감사드립니다. 둘째, 그의 예에는 사소한 오류가 있습니다. 숫자 0x20이 올바르지 않습니다. 0x04 여야합니다. 또한 제안으로 코드에 0xFB, 0x20 또는 0x04와 같은 16 진수를 사용하지 않습니다. io.h 및 헤더 파일에서 참조하는 다른 포트에있는 PIN 포트 정의를 사용하는 것이 좋습니다. 초보자를위한 몇 가지 의견과 함께 아래 Joby의 예를 다시 작성했습니다.
# 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 사이에 논리 "AND"를 적용하고 결과는 다시 배치됩니다. DDRD 메모리에서. 참고 : "AND"연산자는 DDRD 메모리의 각 비트에 대해 위의 이진수와 비교합니다. DDRD의 비트가 0이고 동일한 바이트 위치에있는 이진의 비트가 1 인 경우 결과 비트는 0입니다. DDRD가 1이고 이진의 비트가 1이면 결과 비트는 1이며 DDRD의 비트는 1 또는 0이고 이진의 비트는 0이며 결과 비트는 항상 0입니다. 요약하면, DDRD & = ~ (1 << PD2) 명령은 비트 PD2 만 0으로 변경하고 다른 것 (0 또는 1)은 그대로 둡니다. 조금 복잡해 보이지만 익숙해지면 다른 비트를 변경하지 않고 비트를 조금 변경하는 가장 좋은 방법입니다.
comment # 2 : (1 << PD2)는 이진수 00000100을 생성합니다. 주석 # 1에 설명 된 것과 동일한 논리 "AND"를 사용하여 "PIND & 0000100"명령은 PIND2 (푸시 버튼이 연결된 입력 핀) 만 검사합니다. to)가 높음으로 설정되어 있습니다. 이진 비트가 0으로 설정되고 이진 비트 # 2가 1로 설정되므로 다른 모든 핀은 FALSE가됩니다. PD2 입력이 high로 설정된 경우에만 IF 문이 TRUE이고 PD2 입력이 FALSE이면 IF 문이 참입니다. 낮음으로 설정하십시오.
comment # 3 : 주석 # 1에 설명 된 논리에 따라이 명령은 포트 PORTB의 출력 핀 PINB2를 고전압으로 설정합니다. ~ 300ohm의 저항으로이 핀 포트에 LED가 올바르게 연결되어 있고 해당 저항이 접지에 연결되어 있으면 LED가 켜져 야합니다.
comment # 4 : 이전 설명에서 설명한 것과 같은 이유로 LED가 꺼집니다.
최종 고려 사항 :
a) 푸시 버튼을 누르지 않을 때 (개방 회로) 입력 핀 PD2의 전압 진동을 피하려면 풀다운 저항 (1kOhm 이상)을 배치하여 실수로 LED가 켜지지 않도록하는 것이 좋습니다. 이 임의의 전압 진동에.
b) 고지 사항 : 여기에 설명 된 아이디어는 교육용으로 만 사용해야하며 전자 전문가에게 문의하기 전에 실제 시스템에서 사용해서는 안됩니다.
* /