임베디드시스템/STM32

[STM32] LED BLINK BUTTON

KHJ_940803 2021. 11. 11. 14:51

목표 :

1. 버튼 1 : 누를 때 마다 왼-> 오, 오-> 왼 으로 1개씩 이동하며 LED를 점등한다.

2. 버튼 2 : 누를 때 마다 왼-> 오, 오-> 왼 으로 1개씩 채워지며 LED를 점등한다.

3 버튼 3 : LED점등 중 누르면 일시 정지, 일시 정지 중 누르면 이어서 LED 점등 한다.

 

개발 툴 : STM32CubeIDE

 

개발 보드 : NUCLEO-F411RE

 

PC Uart 통신 툴 : Comport master

 

개발 기간 : 2021년 10월 12일

 

소스 코드 :

#include "button.h"
#include "led_onoff.h"

extern volatile int Tms_counter;


uint32_t i;

void led_blink_down() // led를 반대 순서대로 채워지면서 점등 된다. (7 -> 0)
{

	for (int i = 0; i < 8; i++) // led 가 총 8개 이기에 for 문에 8이 들어간다.
	{
		led_all_off(); // led를 우선 다끈다.
		HAL_GPIO_WritePin(GPIOB, 0x80 >> i, GPIO_PIN_SET); // GPIO_PIN_SET 은 해당 핀에 3.3v를 흘려준다.
        //0x80 >> 0 : GPIOB는 총 8개의 핀이 있다. 그중 번호가 큰 7번핀의 불을 킨다.
        //0x80 >> i : GPIOB의 7-i 번의 불을 킨다. 즉 for문이 진행 됨에 따라 i의 값은 증가하고 7,6,5...1,0 번의 led가 점등 될 것이다.
		HAL_Delay(100); // 딜레이 
	}

}
void led_blink_up()// led를 순서대로 채워지면서 점등 된다. (0 ->7)
{
	for (int i = 0; i < 8; i++)
	{
		led_all_off();
		HAL_GPIO_WritePin(GPIOB, 0x01 << i, GPIO_PIN_SET);
        //GPIOB의 7-i 번의 불을 킨다. 즉 for문이 진행 됨에 따라 i의 값은 증가하고 7,6,5...1,0 번의 led가 점등 될 것이다.
		HAL_Delay(100);
	}
}
void led_all_off() // 모든 led 끈다. GPIO_PIN_RESET : 0v 를 해당 핀에 흘린다.
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,GPIO_PIN_RESET);
}
void led_all_on() // 모든 led 점등. GPIO_PIN_RESET : 3.3v 를 해당 핀에 흘린다.
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,GPIO_PIN_SET);
}
void led_onup()
{
      unsigned char led[] ={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};

		for (int i = 0; i < 8; i++)
		{
			led_all_off();
			HAL_GPIO_WritePin(GPIOB, led[i]  , GPIO_PIN_SET);
			HAL_Delay(500);
		}
	}
void led_ondown()
{
      unsigned char led[] ={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};

		for (int i = 0; i < 8; i++)
		{
			led_all_off();
			HAL_GPIO_WritePin(GPIOB, led[i]  , GPIO_PIN_SET);
			HAL_Delay(500);
		}
	}

int led_bt_pro_flag = 0;
int prev_int =0;


int i_up = 0;

void led_total_onoff_systick() {

	if(i_up ==8)
	{
		i_up=0;
	}

	if (led_bt_pro_flag == 0) {

		led_all_off();
		HAL_GPIO_WritePin(GPIOB, 0x01 << i_up, GPIO_PIN_SET);
		if (Tms_counter > 200) {
			i_up++;
			Tms_counter = 0;

		}

		if (getButtonState(BUTTON1_GPIO_Port, BUTTON1_Pin, &prevButton1State)) {
			led_bt_pro_flag = 1;
			i_up = 0;
			led_all_off();
		}
		if (getButtonState(BUTTON2_GPIO_Port, BUTTON2_Pin, &prevButton2State)) {
			led_bt_pro_flag = 2;
			i_up = 0;
			led_all_off();
		}
		if (getButtonState(BUTTON3_GPIO_Port, BUTTON3_Pin, &prevButton3State)) {
			prev_int = led_bt_pro_flag;
			led_bt_pro_flag = 4;
			i_up =0;
			led_all_off();
		}

	} else if (led_bt_pro_flag == 1) {

			led_all_off();
			HAL_GPIO_WritePin(GPIOB, 0x80 >> i_up, GPIO_PIN_SET);

			if (Tms_counter > 200) {
				i_up++;
				Tms_counter = 0;
			}

			if (getButtonState(BUTTON1_GPIO_Port, BUTTON1_Pin,
					&prevButton1State)) {
				led_bt_pro_flag = 0;
				i_up = 0;
				led_all_off();
			}
			if (getButtonState(BUTTON2_GPIO_Port, BUTTON2_Pin,
					&prevButton2State)) {
				led_bt_pro_flag = 2;
				i_up = 0;
				led_all_off();
			}
			if (getButtonState(BUTTON3_GPIO_Port, BUTTON3_Pin,
					&prevButton3State)) {
				prev_int = led_bt_pro_flag;
				led_bt_pro_flag = 4;
				i_up = 0;
				led_all_off();
			}



	} else if (led_bt_pro_flag == 2) {

		HAL_GPIO_WritePin(GPIOB, 0x01 << i_up, GPIO_PIN_SET);
		if (Tms_counter > 200) {
			i_up++;
			Tms_counter = 0;
			if(i_up == 8 ) led_all_off();
		}

		if (getButtonState(BUTTON1_GPIO_Port, BUTTON1_Pin, &prevButton1State)) {
			led_bt_pro_flag = 0;
			i_up = 0;
			led_all_off();
		}
		if (getButtonState(BUTTON2_GPIO_Port, BUTTON2_Pin, &prevButton2State)) {
			led_bt_pro_flag = 3;
			i_up = 0;
			led_all_off();
		}
		if (getButtonState(BUTTON3_GPIO_Port, BUTTON3_Pin, &prevButton3State)) {
			prev_int = led_bt_pro_flag;
			led_bt_pro_flag = 4;
			led_all_off();
			i_up = 0;
		}

	}

	else if (led_bt_pro_flag == 3) {

		HAL_GPIO_WritePin(GPIOB, 0x80 >> i_up, GPIO_PIN_SET);

		if (Tms_counter > 200) {
			i_up++;
			Tms_counter = 0;
			if(i_up == 8 ) led_all_off();
		}

		if (getButtonState(BUTTON1_GPIO_Port, BUTTON1_Pin, &prevButton1State)) {
			led_bt_pro_flag = 0;
			led_all_off();
			i_up = 0;
		}
		if (getButtonState(BUTTON2_GPIO_Port, BUTTON2_Pin, &prevButton2State)) {
			led_bt_pro_flag = 2;
			led_all_off();
			i_up = 0;
		}
		if (getButtonState(BUTTON3_GPIO_Port, BUTTON3_Pin, &prevButton3State)) {
			prev_int = led_bt_pro_flag;
			led_bt_pro_flag = 4;
			led_all_off();
			i_up = 0;
		}

	} else if (led_bt_pro_flag == 4) {

		led_all_off();
		if (getButtonState(BUTTON3_GPIO_Port, BUTTON3_Pin, &prevButton3State)) {
			led_bt_pro_flag = prev_int;
		}
	}

}

 

동작 영상 :

https://youtu.be/ovMMh6h-UWY