AVR에서 AND연산자, OR연산자, XOR연산자 사용 예..

글 내용

& 연산자 (AND)
& 연산자는 둘다 1이어야 1이 되기 때문에

1)특정 비트만 0으로 만들고 싶을때
2)특정 비트만 확인 하고 싶을때 (masking)

로 많이 사용됩니다.  예를 들어 보겠습니다.

1)특정 비트만 0으로 만들고 싶을때
PORTA 에 LED8개가 붙어 있고 모두 켜져 있습니다.(PORTA==0xFF)
그런데 다른 비트는 건드리지 않고 0번 1번 7번 비트의 LED 만 끄고 싶다면???

PORTA=PORTA & 0x7C;


라고 하면 됩니다.
쓰고 보니 PORTA=0x7C; 라고 하면 되지 않느냐? 라고 물으실 분들을 위해 다른 가정을 하나 더 넣겠습니다.
현재 LED 가 어떻게 켜져 있는지 모르는데 0번 1번 7번 비트의 LED 만 끄고 싶다면??? 그렇다면..
PORTA=PORTA & 0x7C; 이런식으로 & 연산자를 쓰는 것이 다른 비트는 건드리지 않게 됩니다.

2)특정 비트만 확인 하고 싶을때 (masking)
특정 비트만 확인하는 부분은 조건문에서 많이 들어 가는데..
예를 들어 PORTA 에 스위치가 8개 붙어 있는데
PORTA 3번 비트에 달려 있는 스위치가 눌렸는지 판단하고 싶다면?? (스위치는 안눌렀을때 1 눌리면 0으로 가정합니다. )

if((PINA & 0x08) == 0){  ... }

else



 이런식으로 사용하게 되면 스위치가 눌렸다면 {  ... }  의 동작을 수행하고 눌리지 않았다면  else 문을 수행 하겠죠??




| 연산자 (OR)

| 연산자는 둘중 하나라도 1이면 1이 되기 때문에

1)특정 비트만 1으로 만들고 싶을때
로 많이 사용됩니다.  예를 들어 보겠습니다.

1)특정 비트만 1으로 만들고 싶을때
AVR의 ADC관련 레지스터 중에 ADCSRA 라는 레지스터가 있습니다.
그런데 이 레지스터의 6번 비트를 1로 set 하면 ADC를 시작하라는 명령을 내리는 비트입니다.  다른 비트들은 ADC 관련 설정 값이죠..
만약.. ADC를 시작하고 싶은데 ADC 의 다른 설정은 건드리지 말아야 할때.. 바로 | 를 쓰면 됩니다.

ADCSRA |= 0x40;


이렇게 사용하면 해당 비트만 1로 만들수 있습니다.
포트 출력할때 특정포트만 1로 만들고 싶다면 동일한 방법으로 사용하면 됩니다.



^ 연산자 (XOR)

두개가 다르면 1이 되기 때문에

1)특정 비트를 토글하고 싶을때

많이 사용됩니다.  예를 들어 보겠습니다.
PORTA 에 연결된 LED중 0번 비트에 연결된 LED만 켰다 껏다를 반복하고 싶습니다.
그럼 이렇게 코드는 어떻게 작성할까요??

while(1)
{
     PORTA = 0x01;
     delay_ms(1000);
     PORTA = 0x00;
     delay_ms(1000);
}

이렇게 작성해도 되지만  ^ 를 사용하면

while(1)
{
     PORTA ^= 0x01;        
     delay_ms(1000);
}


코드가 간단해 집니다.
PORTA 의 값이 뭐든 다른 비트는 변화 없이 0번 비트만 토글됩니다.

------------------------------------------------------------------------------------------

출처 : 당근이의 AVR갖구놀기