& 연산자 (AND)
& 연산자는 둘다 1이어야 1이 되기 때문에
1)특정 비트만 0으로 만들고 싶을때
2)특정 비트만 확인 하고 싶을때 (masking)
로 많이 사용됩니다. 예를 들어 보겠습니다.
1)특정 비트만 0으로 만들고 싶을때
PORTA 에 LED8개가 붙어 있고 모두 켜져 있습니다.(PORTA==0xFF)
그런데 다른 비트는 건드리지 않고 0번 1번 7번 비트의 LED 만 끄고 싶다면???
PORTA=PORTA & 0x7C;
1010 1010 (0xAA) <-- 초기값
0111 1100 (0x7C) <-- SET 0 BIT
----------------
0010 1000 (0x28) <-- 결과값
라고 하면 됩니다.
쓰고 보니 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;
0000 0100 (0x04) <-- 초기값
0100 0000 (0x40) <-- SET 1 BIT
-----------------
0100 0100 (0x44) <-- 결과값
이렇게 사용하면 해당 비트만 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번 비트만 토글됩니다.
0000 0100 (0x04) <-- 초기값
0100 0000 (0x40) <-- XOR TOGGLE BIT
-----------------
0100 0100 (0x44) <-- 결과값
0100 0000 (0x40) <-- 다시 XOR TOGGLE BIT
-----------------
0000 0100 (0x04) <-- 결과값
출처 : 당근이의 AVR갖구놀기
'AVR(AT90CAN128)공부' 카테고리의 다른 글
분배저항(전압분배) / 병렬저항 계산기 (0) | 2011.06.10 |
---|---|
sbi(), cbi(); (4) | 2011.04.27 |
냉각수온도 표시기 (13) | 2011.03.31 |
ECU CAN READER Ver 1.0 (6) | 2011.03.14 |
기어단수표시기 + 속도표시기 통합 버전 (2) | 2011.01.20 |