RENESAS - 7 segment(FND) 제어
성균관대학교 윈터캠프 <마이크로프로세서 - 전재욱 교수님>에서 실습한 내용 중 일부다.
Renesas RA6M3(176 pin) 계열의 칩을 선택했다. 그리고 IDE는 E2 studio를 활용했다.
segment pin은 각 세그먼트 표시 값과 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을 다음과 같이 설정한다.
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