STM32

7세그먼트 코드 수정

찬영_00 2024. 11. 10. 12:39

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문을 적절히 넣어주었다.

 

https://youtu.be/LXnkZykCiyA