프로그래밍 언어/유용한함수

C언어로 상승엣지,하강엣지 기능 구현하기

원원 2020. 2. 22. 19:08

안녕하세요 오늘은 C언어로 상승엣지,하강엣지 기능을 구현해보겠습니다.

그리고 C언어뿐만아니라 다른 개발환경에도 적용 할 수 있습니다

 

 

------상승엣지------

상승엣지란 어떤 값이 0에서 1로 변할때를 의미합니다. 

 

위의 그림에서 빨강동그라미의 시점을 알려주는 겁니다

 

 

사용예시) 어떤 버튼을 1번 누르면 값이 1 증가하는 기능

int main()
{
	int btn;
	int num;

	while(1)
	{
		if(btn == 1)
		{
			num++;
		}
	}
}

위의 코드에서 btn변수가 버튼을 눌렸을때 변하는 변수라고 가정하고 (버튼이 안눌리면0, 버튼이 눌리면1)
유저는 버튼을 누릅니다. btn이 1이겠죠 버튼을 누르고있는 시간에따라 num이 계속 증가하게 됩니다

원래 하려고했던 버튼을 1번누르면 값이 1증가하는 기능을 구현하지 못했습니다

이때 상승엣지 기능을 사용하면 됩니다

 

 

 

- 상승엣지 코드

#include <stdio.h>
#include <stdbool.h>

bool EDGEPOS(bool *variable, bool *buffer)
{
	bool result;
	if(*variable && !(*buffer))
	{
		result = 1;
	}
	else
	{
		result = 0;
	}
	*buffer = *variable;
	return result;
}

int main()
{
	bool variable = 1;
	bool buffer = 0;
	printf("1: %d     v:%d   b:%d \n",EDGEPOS(&variable,&buffer),variable,buffer);
	printf("2: %d     v:%d   b:%d \n",EDGEPOS(&variable,&buffer),variable,buffer);
	printf("3: %d     v:%d   b:%d \n",EDGEPOS(&variable,&buffer),variable,buffer);
	printf("4: %d     v:%d   b:%d \n",EDGEPOS(&variable,&buffer),variable,buffer);
	
	variable = 0; // LOW
	printf("variable : 0 \n");
	
	printf("5: %d     v:%d   b:%d \n",EDGEPOS(&variable,&buffer),variable,buffer);
	
	variable = 1; // EDGE POS 
	printf("variable : 1 \n");
	
	printf("6: %d     v:%d   b:%d \n",EDGEPOS(&variable,&buffer),variable,buffer);
	printf("7: %d     v:%d   b:%d \n",EDGEPOS(&variable,&buffer),variable,buffer);
	printf("8: %d     v:%d   b:%d \n",EDGEPOS(&variable,&buffer),variable,buffer);
}

--------------------결과물--------------------
1: 1     v:1   b:0
2: 0     v:1   b:1
3: 0     v:1   b:1
4: 0     v:1   b:1
variable : 0
5: 0     v:0   b:1
variable : 1
6: 1     v:1   b:0
7: 0     v:1   b:1
8: 0     v:1   b:1
----------------------------------------------

EDGEPOS함수가 상승엣지기능 함수입니다. variable이 LOW에서 HIGH로 갔을때 return값이 1이 옵니다

함수는 EDGEPOS(변수,버퍼) 이런식으로 사용합니다

variable buffer  
 함수호출 후->
variable buffer result
0 0 0 0 0
0 1 0 0 0
1 0 1 1 1
1 1 1 1 0

위의 코드를 정리한 표 입니다

variable이 1 buffer가 0일때가 버튼을 1번 누른 경우입니다

result가 1이되서, 버튼이 눌린걸 알려주죠

이때 버튼을 계속 누르고 있어도

variable 1, buffer 1이여서 result가 0이됩니다

그러면 버튼이1번 눌렸을때, 값이 1증가하게 할 수 있습니다

그리고 코드에서 매개변수를 포인터로 선언한 이유는, buffer의 값이 변하게 하기 위해서입니다.

------하강엣지------

하강엣지란 어떤 값이 0에서 1로 변할때를 의미합니다. 

 

 

위의 그림에서 빨강동그라미의 시점을 알려주는 겁니다

#include <stdio.h>
#include <stdbool.h>

bool EDGENEG(bool *variable, bool *buffer)
{
	bool result;
	if(!(*variable) && *buffer)
	{
		result = 1;
	}
	else
	{
		result = 0;
	}
	*buffer = *variable;
	return result;
}

int main()
{
	bool variable = 1;
	bool buffer = 0;
	printf("1: %d     v:%d   b:%d \n",EDGENEG(&variable,&buffer),variable,buffer);
	printf("2: %d     v:%d   b:%d \n",EDGENEG(&variable,&buffer),variable,buffer);
	printf("3: %d     v:%d   b:%d \n",EDGENEG(&variable,&buffer),variable,buffer);
	printf("4: %d     v:%d   b:%d \n",EDGENEG(&variable,&buffer),variable,buffer);
	
	variable = 0; // LOW
	printf("variable : 0 \n");
	
	printf("5: %d     v:%d   b:%d \n",EDGENEG(&variable,&buffer),variable,buffer);
	
	variable = 1; // EDGE POS 
	printf("variable : 1 \n");
	
	printf("6: %d     v:%d   b:%d \n",EDGENEG(&variable,&buffer),variable,buffer);
	printf("7: %d     v:%d   b:%d \n",EDGENEG(&variable,&buffer),variable,buffer);
	printf("8: %d     v:%d   b:%d \n",EDGENEG(&variable,&buffer),variable,buffer);
}

--------------------결과물--------------------
1: 1     v:1   b:0
2: 0     v:1   b:1
3: 0     v:1   b:1
4: 0     v:1   b:1
5: 0     v:0   b:1
6: 1     v:1   b:0
7: 0     v:1   b:1
8: 0     v:1   b:1
----------------------------------------------

variable buffer

 함수호출 후->
variable buffer result
0 0 0 0 0
0 1 0 0 1
1 0 1 0 0
1 1 1 1 0

위의 코드를 정리한 표 입니다

buffer가 1이였다가 variable이 0일때 result값이 1인 것을 확인 할 수 있습니다