실습 과제명 : 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번호로 연결된 부분이
불이 꺼져야 하는데 그렇게 되지 않았다.