본문 바로가기
임베디드/Atmega328p

button

by sj0020 2020. 11. 4.

풀다운으로 연결하면 켜졌다가 버튼 누르면 꺼짐

풀업으로 연결하면 꺼져있다가 버튼 누르면 켜짐

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

#define LED1	PORTD6
#define LED2	PORTD7
#define BUTTON	PORTB0

uint8_t key_lock =0;

int main(void)
{
    DDRD = (1 << LED1) | (1 << LED2) ;
	DDRB &= ~(1 << BUTTON);
	
    while (1) 
    {
		if (!(PINB & (1 <<BUTTON))) {
			PORTD |= (1 <<LED1) | (1<< LED2);
		}
		else{
			PORTD &= ~((1 << LED1) | (1 << LED2));
		}
		
    }
}

 

DDRB &= ~(1 << BUTTON);

DDRB = DDRB & ~(1 << BUTTON);

 


1. 디바운스 처리 .. 하긴 했는데 좀 잘 안되는 코드

2. 버튼 1회 누르면 LED ON 상태 유지, 다시 누르면 off 상태 유지 처리

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

#define LED1 PORTD6
#define LED2 PORTD7
#define BUTTON PORTB0

#define PRESSED 1
#define RELEASED 0
#define DEBOUNCE_MS 150

int main() {
	DDRD = (1 << LED1 | 1 << LED2 );   // 1 : 출력핀 세팅
	DDRB = ~(1 << BUTTON);             // 0 : 입력핀 세팅  , 0x00 으로 세팅해도 됨
	
	
	int before = RELEASED;
	
	while (1) {
		if (PINB & (1 << BUTTON) && before == RELEASED) {
			_delay_ms(DEBOUNCE_MS);
			PORTD |= (1 << LED1) | (1 << LED2);
			before = PRESSED;
		}
		
		else if (PINB & ( 1 << BUTTON) && before == PRESSED ) {
			_delay_ms(DEBOUNCE_MS);
			PORTD &= ~((1 << LED1) | (1 << LED2));
			before=RELEASED;
		}
	}
}

'임베디드 > Atmega328p' 카테고리의 다른 글

interrupt 하나 사용 ,LED 하나  (0) 2020.11.05
atmega 328p port ddrx  (0) 2020.11.04
arduino uno atmega pin map  (0) 2020.11.03
201103_LedBlink.c / DDRx  (0) 2020.11.03
atmega328p datasheet  (0) 2020.11.03