74138

다니엘·2022년 5월 26일
0

실습 과제명 : 74138 ic칩과 비슷한 기능 stm32f429 보드에서 구현하기

수행기간 : 2022. 05. 27

참가인원 : 1명

담당업무 : 조합 논리회로, 레지스터 이용

수행목표 :

GPIOX -> ODR = ~inputData에서 ~를
한 이유는 0은 1로 1은 0으로 변경시키기 위한 코드. 스위치를 누른값으로 0으로 되어있을때 0값을
1로 변경하여 GPIOX 포트에 HIGH신호를 줘서 LED에 전류가 흐르도록 한 것이다.

출력포트는 데이터 레지스터 ODR
핀의 입력 레지스터 IDR
데이터 방향 레지스터

/ USER CODE BEGIN 2 /
int INPUT0 = !HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8);
int INPUT1 = !HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_9);
int INPUT2 = !HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_12);

int INPUT[3] = { 0, };
int NUM;


	void f74138() {

	int INPUT[3] = { 0, };
	int NUM;

	HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_0);
	HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_1);
	HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_2);

	for (int i = 0; i < 3; i++) {
		INPUT[i] = (HAL_GPIO_ReadPin(GPIOG, 0x0008 >> i)) * (0x0001) << i;
	}
	NUM = INPUT[0] + INPUT[1] + INPUT[2];

	if (NUM == 0) {
		GPIOD->ODR = 0x7f;
	} else if (NUM == 1) {
		GPIOD->ODR = 0Xbf;
	} else if (NUM == 2) {
		GPIOD->ODR = 0Xdf;
	} else if (NUM == 3) {
		GPIOD->ODR = 0Xef;
	} else if (NUM == 4) {
		GPIOD->ODR = 0Xf7;
	} else if (NUM == 5) {
		GPIOD->ODR = 0Xfb;
	} else if (NUM == 6) {
		GPIOD->ODR = 0Xfd;
	} else if (NUM == 7) {
		GPIOD->ODR = 0Xfe;
	}

	/* USER CODE END 2 */

	/* Infinite loop */
	/* USER CODE BEGIN WHILE */

	while (1) {

// INPUT0 = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5);
// INPUT1 = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_6);
// INPUT2 = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8);

		if (INPUT0 & INPUT1 & INPUT2 == 1) {
			f74138();
		}

총평

배열을 선언하고 PD0-7번 LED로 출력하고 PG0-3번 스위치 SW 입력으로 정하였다.
PC8번9번12번 을 포트로 74138 칩셋의 C,B,A 값을 정해주었다.
입력값에 따라
1000 0000
0100 0000
0010 0000
0001 0000
0000 1000
0000 0100
0000 0010
0000 0001
로 LED 등을 점멸하려고 했으나 코드가 문제인지 동작하지 않았다.
원래는 모두 불이 켜지는 상태에서 0번에서 2번으로 스위치를 누르는 순간 해당 PD번호로 연결된 부분이
불이 꺼져야 하는데 그렇게 되지 않았다.

0개의 댓글