전공공부/마이크로프로세서 윈터캠프

RENESAS - 7 segment(FND) 제어

공대생의 인생공부 2022. 1. 28. 18:39

 

성균관대학교 윈터캠프 <마이크로프로세서 - 전재욱 교수님>에서 실습한 내용 중 일부다.

Renesas RA6M3(176 pin) 계열의 칩을 선택했다. 그리고 IDE는 E2 studio를 활용했다.

 

segment pin은 각 세그먼트 표시 값과 digit 자릿 수로 이루어져 있다.

 

그림 1 : seven segment digit

위의 표처럼 각 data를 표현하고 digit은 각각 0001, 0010, 0100, 1000으로 4자리 구성되어 있다. 

 

- pin configuration

FND_A -D : P604 - P607, FND_E-DOT : P611-P614, FND_D1 - COL : P305- 309을 다음과 같이 설정한다.

pin configuration

mode는 output(initial low)로, 그리고 각각 원하는 symbolic name을 설정해서 사용 가능하다.

 

  - code

스켈레톤 코드를 바탕으로 작성했다.

 

void Segments_Write(int number){
    int digit[4]= {0,0,0,0};
    digit[0] = number / 1000;
    digit[1] = (number/100) % 10;
    digit[2] = (number%100) / 10;
    digit[3] = number% 10;

    for(int i =0; i<4; i++){
        Segment_Write(SEG[digit[i]], i+1);
        R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MILLISECONDS);
    }
    R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
}

만약에 number를 1234를 넣는다면 digit[0] = 1, digit[1]=2, digit[2] = 3, digit[3] = 4로 할당된다. 그리고 segment_write 함수로 4자리 digit을 넣는다. 각 write 마다 10ms delay한다.

 

// seg_data : number, seg_digit : position
void Segment_Write(int seg_data, int seg_digit){
    if(seg_digit !=0){
        // d1 - col : 5-9
        // D C B A(7654) || DP G F E (14, 13 , 12 ,11)
        R_IOPORT_PortWrite(&g_ioport_ctrl, BSP_IO_PORT_03, (ioport_size_t)(0x0010 << seg_digit), (ioport_size_t)0x01E0);// each digit
        R_IOPORT_PortWrite(&g_ioport_ctrl, BSP_IO_PORT_06, (ioport_size_t)((((~seg_data)&0x0F)<<4)|(((~seg_data)&0xF0)<<7)), (ioport_size_t)0x78F0);
    }
}

첫번째 portwrite은 digit의 position을 결정한다. mask는 0x01E0으로 P305-309만을 설정하고 seg_digit을 이용해서 5-9 digit position을 설정한다.

두번째 portwrite은 seg_data를 표시한다. 앞의 value 값은 seg_data 값을 표시하고 mask는 p603-607, 611-614를 표시한다. 

 

이와 같은 방식으로 7 segment를 제어 가능하다.

 

출처)

그림 1 : http://weaponscorner.blogspot.com/2017/09/interfacing-seven-segment-display-with.html