Language/AVR

ATmega 128 : Led Bar 버튼 3개 동작 구현

짱도르딘 2024. 5. 29. 09:34
728x90

이번에는 세개의 버튼을 사용하여 LED Bar를 제어할 예정이다.

 

DDRC 포트에는 LED Bar를, DDRD 포트에는 세개의 버튼을 제어할 수 있도록 설정하였다.

 

아래의 코드를 확인해보면 "flag"가 선언된 것을 확인할 수 있다.

 

 "flag" 변수는 초기에 0으로 설정되며, 버튼 3이 눌렸을 때 1로 설정된다. 이후에는 특정 조건에 따라 해당 플래그를 검사하고 적절한 동작을 수행한다.

 

세번째 버튼이 눌리게 된다면 flag의 값은 1로 설정되며, if(flag == 1)의 동작을 수행한다.

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>



int main(void)
{
	DDRC = 0xff; // LED 출력 방향 설정
	DDRD = 0x00; // Button 입력 방향 설정'
	
	uint8_t ledData = 0x01;
	uint8_t buttonData; // 버튼 입력을 받을 변수 설정
	int flag = 0; // ATmega128에서는 int가 2byte이다.
	PORTC = 0x00; // LED가 꺼진 상태로 출발한다.
	
    while (1) 
    {
		buttonData = PIND; // PIND 자체는 8bit이다. 즉 한꺼번에 맞춰서 읽어들인다.
		if ((buttonData & (1<<0)) == 0) // buttondata는 8bit이다, 
 		{
			PORTC = ledData; // 계속 자기걸 기억한다
			ledData = (ledData >> 7) | (ledData << 1); // (ledData >> 7)는 밀어내는 역할
													   // (ledData << 1)는 키는 역할 
			_delay_ms(300);
		}
		if ((buttonData & (1<<1)) == 0)
		{
			PORTC = ledData;
			ledData = (ledData >> 1) | (ledData << 7);
			_delay_ms(300);
		}
		
		if (flag == 0)
		{
			if ((buttonData & (1<<2))==0)
			{
				flag = 1;
			}
			else
			{
				flag = 0;
			}
			
			if (flag == 1) // 위에서 버튼 3이 눌렸다면
			{
				for (uint8_t i = 0; i < 5; i++)
				{
					PORTC = 0xff;
					_delay_ms(200);
					PORTC = 0x00;
					_delay_ms(200);
				}
				flag = 0;
			}
		}
    }
}

 

 

 

 

728x90