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
'Language > AVR' 카테고리의 다른 글
ATmega 128 : FND 동작 구현 (0) | 2024.05.29 |
---|---|
ATmega 128 : Led Bar 버튼 인터럽트 동작 구현 (0) | 2024.05.29 |
ATmega 128 : Led Bar 버튼 동작 구현 (0) | 2024.05.28 |
ATmega 128 : LED Bar 구조체 동작 구현 (0) | 2024.05.28 |
ATmega 128 : LED Bar 포인터 동작 구현 (1) | 2024.05.26 |