잡담/문답 c언어 질문이요;;; 급합니다 ㅠ_ㅠ
페이지 정보
본문
/*
FAK Series Monitor Program
filename : serial.h
Compiler : uVision2 (KEIL C)
For FAK Series...
Copyright 8051-AVR.com by Hong Jison
Do not remove this comments.
Serial Module
If you using Serial communication...you must be include serial.h file.
ex) #include "serial.h"
*/
//#include <reg51.h>
extern void SER_init(void);
extern void SER_string(char *str);
extern UC RX_D(void);
extern void TX_D(UC buffer);
extern void SER_key();
extern void htoa(UC hh);
extern UC atoh(UC posi);
UC (*func)(), buf[10], xdata *xptr;
void SER_init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x52;
TH1 = 0xfd;
TR1 = 1;
SBUF = 0;
}
UC RX_D(void)
{
while(!RI);
RI=0;
return(SBUF);
}
void TX_D(UC buffer)
{
while(!TI);
TI=0;
SBUF = buffer;
}
void SER_string(char *str)
{
int i=0;
do {
switch(str[i]) {
case LF:
case CR:
TX_D(0x0a);
TX_D(0x0d);
break;
default:
TX_D(str[i]);
}
} while(str[++i]);
}
void SER_key()
{
UC i=0, rx;
for(i=0; i<10; i++)
buf[i] = 0x00;
i = 0;
do {
rx = RX_D();
if (rx == CR || rx == LF) {
buf[i] = 0x00;
SER_string("\n");
break;
}
else if (rx == BS) {
if (i == 0) break;
buf[i] = 0x00;
i--;
TX_D(rx);
}
else {
buf[i++]=rx;
TX_D(rx);
}
if (i >= 9) continue;
} while (1);
}
void htoa(UC hh)
{
UC temp;
temp=hh;
hh &= 0xf0; hh >>= 4;
if (hh >= 10) hh += 7;
hh += '0';
TX_D(hh);
hh=temp;
hh &= 0x0f;
if (hh >= 10) hh += 7;
hh += '0';
TX_D(hh);
}
UC atoh(UC posi)
{
UC hexa;
hexa = buf[posi];
if((hexa >= 'A' && hexa <= 'F') || (hexa >= 'a' && hexa <= 'f'))
hexa += 9;
hexa &= 0x0f; hexa <<= 4; buf[posi] = hexa;
hexa = buf[posi+1];
if((hexa >= 'A' && hexa <= 'F') || (hexa >= 'a' && hexa <= 'f'))
hexa += 9;
hexa &= 0x0f; hexa |= buf[posi];
return(hexa);
}
댓글목록
ExCuteMe님의 댓글
ExCuteMe이름으로 검색 아이피 (211.♡.85.68) 작성일
void SER_init(void) /* 레지스터 이니셜라이즈 하는것 의밈없셈*/
UC RX_D(void) /* RI를 기둘려서 SBUF(디파인된 어드레스의 레지스터)의 값을 읽어옴 */
void TX_D(UC buffer) /* TI를 기둘려서 버퍼의 값을 SBUF에 씀 */
void SER_string(char *str) /* 설명 필요 없찌? 그냥 스트링값보고 케리지리턴이나 라인피더면 줄 넣고 다른 문자면 그냥 전송 */
void SER_key() /* 첨에 더미값좀 넣고 레스크터에서 읽어서 라인피더나 케리지리턴이면 줄바꾸고, BS(비트싱큰가?)면 반송하고 받은 버퍼 삭제, 나머지 문자는 버퍼 저장하고 반송해서 딱 10문자의 버퍼를 채움 */
void htoa(UC hh) /* 값을 받아서 헥사데시멀을 앞의 4비트와 뒤의 4비트를 따로 2번에 나눠 숫자가 아닌 문자형으로 전송, 근데 temp는 왜 넣데냐? (즉 0x01 이면 '0'과'1' 0x3f면 '3'과 'f'대문잔지 소문잔지는 확인않했3 )*/
UC atoh(UC posi) /* 값을 받아서 값의 위치의 버퍼에 있는 값(문자)를 16진수의 숫자로 바꾸는 넘 즉 buf[posi]에 '9' buf[posi+1]에 'c'가 있으면 합쳐서 0x9c로 만들어서 값을 리턴 */
이해하려면 알아야할것듯 UC나 PCON, LF, BS등의 디파인과 문자값등.. 만 이해하면 무지 간단하구만..
맨날 et에만 보이더니.. 하긴 학교공부 못해도 직장에서 돈받으면 몰라도 다하게 되있다만.. 좀 본인이 괴로워서 그렇지..
그런데 이제야 질문을.. 뭐 시험AS라고 생각하고 바바라.
ExCuteMe님의 댓글
ExCuteMe이름으로 검색 아이피 (211.♡.85.68) 작성일
void htoa(UC hh) 은 C가 아니던가 버그임.. C는 콜바이벨류라 htoa함수 안에서 hh값의 변경이 불가 변경하려면 void htoa(UC *hh)로 포인터던가
void htoa(UC hh)
{
UC temp;
temp=hh;
temp &= 0xf0; temp >>= 4;
if (temp >= 10) temp += 7;
temp += '0';
TX_D(temp);
temp = hh;
temp &= 0x0f;
if (temp >= 10) temp += 7;
temp += '0';
TX_D(temp);
}
로 사용해야 함.
즉, 아무리봐도 예제 소스는 1. C가 아니다 C++? 2. 버그 둘중 하나임..