반응형

스위치를 클릭할때마다 한 비트씩 이동하여 LED의 켜짐 위치가 바뀌게 된다.

그리고 0x80 (마지막 스위치)에서 비트가 넘어가면 다시 처음 LED가 켜지도록 한다.

비트연산으로 LED를 켜는 방법은 아래에 있다.

https://ansan-survivor.tistory.com/1207

 

[Atmega128] 아트메가 비트연산으로 LED한칸씩 옮기기

(아래 직접 제작한 Atmega128 모듈으로 테스트를 진행했다.) https://ansan-survivor.tistory.com/1144 [PCB제작] OrCAD로 설계한 데이터를 JLCPCB를 통해 SMT 주문하기 ! (설계부터 PCB 주문 생산 까지) PCB제조..

ansan-survivor.tistory.com



1. 입력 출력 단자 구성하기

LED에 저항은 달기 귀찮아서 생략~

 - 출력핀 사용(LED 8개): PA0 ~ PA7

 - 입력핀 사용(스위치): PC0

    입력 SW Pull up 으로 사용. (아래 참고)

https://ansan-survivor.tistory.com/1213

 

풀업(pull up)과 풀다운(pull down) 원리, 시뮬레이션. 스위치 회로 (입력핀 스위치 구성)

아두이노나 Atmega128을 이용해 스위치를 이용한 입력회로를 구성할 때 Pull-up과 Pull-down 스위치 원리를 알고 구성해야 한다. 풀업, 풀다운을 하는 이유는? 만약 스위치를 아래와 같이 구성했다. 입

ansan-survivor.tistory.com

 

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;
}

 

그러나 스위치의 채터링(여러번클릭되는 현상)이 일어 날 수 있다.

 

 

 

 

 

반응형

+ Recent posts