반응형
스위치를 클릭할때마다 한 비트씩 이동하여 LED의 켜짐 위치가 바뀌게 된다.
그리고 0x80 (마지막 스위치)에서 비트가 넘어가면 다시 처음 LED가 켜지도록 한다.
비트연산으로 LED를 켜는 방법은 아래에 있다.
https://ansan-survivor.tistory.com/1207
1. 입력 출력 단자 구성하기
- 출력핀 사용(LED 8개): PA0 ~ PA7
- 입력핀 사용(스위치): PC0
입력 SW Pull up 으로 사용. (아래 참고)
https://ansan-survivor.tistory.com/1213
3. SW입력받아 LED 비트를 한칸 씩 옮기는 코드
#include <avr/io.h>
#include <util/delay.h>
int main()
{
char LED = 0x01; // LED변수 초기값
char SW = 0x01; // SW변수 초기값
char state = 0; // 상태값 초기화 - 스위치
// (DDRn 은 입출력 설정 레지스터)
DDRC = 0x00; // PCn입력설정
DDRA = 0xFF; // PAn출력설정
PORTC = SW; // PC0번 포트 스위치로 사용
while(1)
{
PORTA = LED; // LED 초기상태 PC0만 켜짐.
// 스위치를 땐상태에서는 state가 0, 입력단자 PC0 SW가 눌리면 0x01이 되어 true가 됨.
if((PINC & 0x01) == 0x00 && state == 0)
{
// 스위치가 눌린 상태, 비트 옮기기
state = 1;
if(LED == 0x80)
LED = 0x01;
else
LED <<= 1;
}
// 바로 state를 0으로 변경하여 LED를 클릭당 1번만 옮기도록 설정.
if ((PINC & 0x01) != 0x00 && state == 1)
{
state = 0;
}
}
return 0;
}
그러나 스위치의 채터링(여러번클릭되는 현상)이 일어 날 수 있다.
반응형
'펌웨어 (firmware) > Atmega' 카테고리의 다른 글
[Atmega] Atmega128 LCD연결하기, 화면 디스플레이 (0) | 2022.02.07 |
---|---|
[Atmega 128] 아트메가 128 인터럽트 벡터 표 (interrupt vector table) (0) | 2022.01.25 |
[Atmega128] 아트메가 비트연산 Switch 클릭 LED 토글시키기 (스위치로 LED 켰다 껐다) (0) | 2022.01.22 |
[Atmega128] 아트메가 비트연산 LED 좌우로 반복 움직이기 (0) | 2022.01.17 |
[Atmega128] 아트메가 비트연산으로 LED한칸씩 옮기기 (0) | 2022.01.16 |