7새그먼트 코드에서 이전 포스팅 영상을 보면 숫자 부분에 전부 불이 들어오는 걸 볼수 있다.
만약 숫자가 카운트 되는 곳만 LED가 들어오길 원할 수 있고, 나도 시험삼아 다시 코드를 짜보겠다.
먼저 저번 코드를 보자
if(HAL_GPIO_ReadPin(GPIOB, PB_9_BUTTON_Pin) == HIGH){
display_number(Index, 50);
continue;
}else {
display_number(Index, 50);
++Index;
}
// 함수부분
void display_number(int number, int repetitions) {
int n1, n2, n3, n4;
// 0~9
uint8_t numArr[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8 ,0x80,0x90};
// num_position
uint8_t numPosition[4] = {0b0001, 0b0010, 0b0100, 0b1000};
// 각 자릿수 분리
n1 = number % 10; // 1의 자리
n2 = (number / 10) % 10; // 10의 자리
n3 = (number / 100) % 10; // 100의 자리
n4 = (number / 1000) % 10; // 1000의 자리
for(int i = 0; i < repetitions; i++) {
send_port(numArr[n1], numPosition[0]); // 1의 자리
send_port(numArr[n2], numPosition[1]); // 10의 자리
send_port(numArr[n3], numPosition[2]); // 100의 자리
send_port(numArr[n4], numPosition[3]); // 1000의 자리
}
}
우리는 네자리 수를 모두 나타나게끔 설계를 했다.
따라서 원하는 곳에만 나타나게끔 코드를 바꿔주겠다.
if(HAL_GPIO_ReadPin(GPIOB, PB_9_BUTTON_Pin) == HIGH){
display_number(Index, 50, numCheckPosition);
continue;
}else {
if(Index > 10000){
Index = 0;
}
display_number(Index, 50, numCheckPosition);
++Index;
}
// 함수
void display_number(int number, int repetitions, uint8_t *num_arr) {
int n1, n2, n3, n4;
// 0~9
uint8_t numArr[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8 ,0x80,0x90};
// num_position
uint8_t numPosition[4] = {0b0001, 0b0010, 0b0100, 0b1000};
// 각 자릿수 분리
n1 = number % 10; // 1의 자리
n2 = (number / 10) % 10; // 10의 자리
n3 = (number / 100) % 10; // 100의 자리
n4 = (number / 1000) % 10; // 1000의 자리
if(number < 10){
num_arr[0] = 1;
}else if(number < 100){
num_arr[1] = 1;
}else if(number < 1000){
num_arr[2] = 1;
}else if(number < 10000){
num_arr[3] = 1;
}else {
for(int i = 0; i < 4; i++){
num_arr[i] = 0;
}
}
for(int i = 0; i < repetitions; i++) {
if(num_arr[0]) send_port(numArr[n1], numPosition[0]); // 1의 자리
if(num_arr[1]) send_port(numArr[n2], numPosition[1]); // 10의 자리
if(num_arr[2]) send_port(numArr[n3], numPosition[2]); // 100의 자리
if(num_arr[3]) send_port(numArr[n4], numPosition[3]); // 1000의 자리
}
}
숫자의 크기에 따라 1의 자리부터 1000의 자리까지 나타낼 수 있게끔 if문을 적절히 넣어주었다.
'STM32' 카테고리의 다른 글
STM32으로 Fan을 제어해보자 2) (0) | 2024.11.12 |
---|---|
STM32으로 Fan을 제어해보자 1) (0) | 2024.11.12 |
버튼 누르면 1씩 올라가는 7세그먼트 (1) | 2024.11.10 |
HAL_Driver로 7세그먼트와 Button 다루기 (3) | 2024.11.09 |
GPIO를 사용하여 LED 제어 (1) | 2024.11.08 |