ATMEGA 마이크로 컨트롤러에서 UART 용 직렬 함수를 (C에서) 프로그래밍하고 있으며 사용자가 단일 문자를 입력하고 ASCII 16 진수 값을 출력하도록해야합니다.
즉, 사용자가 'a'를 입력하면 출력은 '0x61'이됩니다. 나는 함수를 썼다.
putvalue(unsigned char ch)
,
단일 문자를 받아 화면에 표시하므로 이제 문자를 받아 ASCII 16 진수 값에 해당하는 문자로 변환하는 함수를 작성하면됩니다. 지금까지 다음을 수행했습니다.
void puthexvalue(unsigned char ch) {
putvalue(0x30) \\writes a '0' to the screen
putvalue(0x78) \\writes an 'x' to the screen
unsigned char ch1 = ch & 0xF0;
unsigned char ch2 = (ch & 0x0F) >> 4;
이제 인쇄하려는 문자의 숫자 값 ch1
과 ch2
를 얻었지만 실제로 이러한 숫자에 해당하는 ASCII 값을 찾고 그 값을 인쇄하는 방법을 모르겠습니다.
어떤 힌트 나 도움을 주시면 감사하겠습니다!
편집 : ch1 = ch & 0xf0 >> 4
및 이어야합니다 ch2 = ch & 0x0f
.
에서 문자 코드 '0'
로는 '9'
C 사양의 연속을 보장받을 수 있습니다.
에서 문자 코드 'A'
에 'Z'
과에서 'a'
에는 'z'
ASCII 코드에서 연속이다.
따라서 숫자가 0에서 9 사이이면 숫자를 더하여 ASCII 코드를 얻을 '0'
수 있습니다. 숫자가 10에서 15 사이 이면 숫자에 10을 빼 'A'
거나 더하여 ASCII 코드를 얻을 수 있습니다 'a'
.
또한 귀하의 계산 ch1
과 ch2
잘못이 : ch1
(하위 비트가 해제되기 때문에) (16)의 곱셈을하고 ch2
있을 것입니다 항상 0 (마지막 4 비트가 아닌 비트 cleard 때문에, 마우스 오른쪽 4 비트 이동).
구현의 계산을 고정 포함 ch1
하고 ch2
다음과 같이 될 것입니다 :
char getHexChar(unsigned char c) {
if (c <= 9) return '0' + c;
else if (c <= 15) return 'A' + (c - 10);
else return '?';
}
void puthexvalue(unsigned char ch) {
putvalue(0x30); //writes a '0' to the screen
putvalue(0x78); //writes an 'x' to the screen
unsigned char ch1 = (ch & 0xF0) >> 4;
unsigned char ch2 = ch & 0x0F;
putvalue(getHexChar(ch1));
putvalue(getHexChar(ch2));
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다