반응형
7세그먼트 LED는 아래와 같이 숫자 및 일부 영문자를 표시해 주는 디지털 표시 모듈이다.
이 모듈에 숫자 이외에 출력 가능한 영문자는 다음과 같다.
A, b, C, d, E, F, H, L, P, U
이 모듈에 표현 가능한 최대 숫자는 10진수로 표현할 경우 0~9 10개의
숫자(10진수)만 가능하지만 영문까지 사용할 경우 0~9, A~U
총 20개의 숫자/문자(20진수) 표현이 가능해 진다.
펌웨어 프로그래밍 작업을 하다보면 10진수와 20진수 변환해야
하는 경우가 생길 수 있는데 다음과 같이 변환하여 처리해 보았다.
// 20진수 문자열을 10진수 자료형 변수로 변환
/*
좌측부터 10, .... 19
A, b, C, d, E, F, H, L, P, U
20진수 아스키코드
A:65(0x41)
b:98(0x62)
C:67(0x43)
d:100(0x64)
E:69(0x45)
F:70(0x46)
H:72(0x48)
L:76(0x4C)
P:80(0x50)
U:85(0x55)
*/
unsigned long long convert20to10(char* str) {
unsigned long long result = 0;
unsigned long len = strlen(str);
for (unsigned long i = 0; i < len; i++ ) {
if ( str[i] >= 'A' && str[i] <= 'F' ) { // A(65) ~ F(70)
result = result * 20 + str[i] - 'A' + 10;
} else if ( str[i] >= 'a' && str[i] <= 'f' ) { // a(97) ~ f(102)
result = result * 20 + str[i] - 'a' + 10;
} else if ( str[i] >= '0' && str[i] <= '9' ) { // 0(48) ~ 9(57)
result = result * 20 + str[i] - '0';
}
else if (str[i] == 'H' || str[i] == 'h' ) { result = result * 20 + 16; }// H(72),h(104)
else if (str[i] == 'L' || str[i] == 'l' ) { result = result * 20 + 17; }// L(76),l(108)
else if (str[i] == 'P' || str[i] == 'p' ) { result = result * 20 + 18; }// P(80),p(112)
else if (str[i] == 'U' || str[i] == 'u' ) { result = result * 20 + 19; }// U(85),u(117)
}
return result;
}
// 10진수 자료형 변수 값을 20진수 문자열로 변환
void convert10to20(unsigned long long decimal, char *result) {
char szTemp[256] = {0,};
unsigned long pos = 0;
while(true) {
unsigned long mod = decimal % 20;
if (mod < 10) { // 0 ~ 9
szTemp[pos] = 48 + mod;
} else { // A, b, C, d, E, F, H, L, P, U
switch (mod) {
case 10: szTemp[pos] = 'A'; break;
case 11: szTemp[pos] = 'b'; break;
case 12: szTemp[pos] = 'C'; break;
case 13: szTemp[pos] = 'd'; break;
case 14: szTemp[pos] = 'E'; break;
case 15: szTemp[pos] = 'F'; break;
case 16: szTemp[pos] = 'H'; break;
case 17: szTemp[pos] = 'L'; break;
case 18: szTemp[pos] = 'P'; break;
case 19: szTemp[pos] = 'U'; break;
default: break;
}
}
decimal = decimal / 20;
pos += 1;
if (decimal == 0)
break;
}
for (unsigned long i=0; i<pos; ++i) {
result[i] = szTemp[pos-1-i];
}
}
반응형
'개발 > Note' 카테고리의 다른 글
matplotlib 사용 (0) | 2022.11.18 |
---|---|
git 소스코드 비교 (0) | 2022.02.23 |
root-level 디렉토리에 폴더, symbolic link 생성 방법 (0) | 2021.03.15 |
RSA 암복호화 테스트 (0) | 2021.02.05 |
RSA key 파일 생성 (0) | 2021.02.05 |