2024.1.18
• 행에 해당하는 핀에 HIGH, 열에 해당하는 핀에 LOW를 가함으로써 해당 위치의 LED를 켬
전류 : 물이 흐르는 것. 높은 쪽에서 낮은 쪽으로 흐름.
전압 : 물의 높이
열 PE 2 ~ 9
행 PD 0 ~ 7
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
PD4 + 저항 | PD6 + 저항 | PE3 | PE4 | PD7 + 저항 | PE6 | PD5 + 저항 | PD2 + 저항 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|
PD0 + 저항 | PE5 | PE7 | PD3 + 저항 | PE2 | PD1 + 저항 | PE8 | PE9 |
// dotmatrix.c
#include "main.h"
GPIO_TypeDef *col_port[] =
{
COL1_GPIO_Port, COL2_GPIO_Port, COL3_GPIO_Port, COL4_GPIO_Port,
COL5_GPIO_Port, COL6_GPIO_Port, COL7_GPIO_Port, COL8_GPIO_Port
};
GPIO_TypeDef *row_port[] =
{
ROW1_GPIO_Port, ROW2_GPIO_Port, ROW3_GPIO_Port, ROW4_GPIO_Port,
ROW5_GPIO_Port, ROW6_GPIO_Port, ROW7_GPIO_Port, ROW8_GPIO_Port
};
uint16_t row_pin[] =
{
ROW1_Pin, ROW2_Pin, ROW3_Pin, ROW4_Pin,
ROW5_Pin, ROW6_Pin, ROW7_Pin, ROW8_Pin
};
uint16_t col_pin[] =
{
COL1_Pin, COL2_Pin, COL3_Pin, COL4_Pin,
COL5_Pin, COL6_Pin, COL7_Pin, COL8_Pin
};
unsigned char all_on[] = // all on 문자 정의
{
#if 1
0b01100110,
0b01100110,
0b11111111,
0b11111111,
0b11111111,
0b01111110,
0b00111100,
0b00011000
#else
// 전체 LED On
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111
#endif
};
void write_column_data(int col)
{
for (int i = 0; i < 8; i++)
{
if (i == col)
HAL_GPIO_WritePin(col_port[i], col_port[i], 0); // on
else HAL_GPIO_WritePin(col_port[i], col_port[i], 1); // off
}
}
// 0b00111100
void write_row_data(unsigned char data)
{
unsigned char d;
d = data; // 오리지널 데이터 변형을 막기 위해
for (int i = 0; i < 8; i++)
{
if (d & (1 << i)) // 1인 경우
HAL_GPIO_WritePin(row_port[i], row_port[i], 1);
else HAL_GPIO_WritePin(row_port[i], row_port[i], 0);
}
}
int dotmatrix_main_test(void)
{
while(1)
{
for (int i = 0; i < 8; i++)
{
// 공통 양극 방식 (common anode)
// column에는 0을, row에는 1을 출력해야 해당 LED가 켜진다
wirte_column_data(i);
}
}
return 0;
}
잡다한 것..
ROW, COL 헷갈릴 때 .. 알아두기 ..