당근이 카페에 kim2376님이 소프트웨어 시리얼 소스를 공유해 주셔서 공유 합니다.


아래 코드를 프로젝트에 추가해서 사용하면 될것 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#define PORT_DDR  DDRJ   //PINJ
#define PORT_IN  PINJ   //PINJ
#define PORT_OUT  PORTJ   //PORTJ
#define TX_PORT 0b00000010   //PORTJ (.1)
#define RX_PORT 0b00000001   //PORTJ (.0)
#define COMM_BAUD  52     // 1/9600=104        1/19200= 52
 
 
 
/*****************************************************************************/
/* Serial Port Code                                                          */
/*****************************************************************************/
//------------------------------------------////------------------------------------------//
void SetTxd(char c)
{
  // TxD의 비트를 세트 또는 리셋한다  
  if(c) {PORT_OUT |= TX_PORT; }
   else  {PORT_OUT &= (~TX_PORT); }
//------------------------------------------//
void putchar_soft(char c)
{
  char i;
  
  SetTxd(0);    // 스타트비트전송
  delay_us(COMM_BAUD);   // 1클럭분 웨이트
  //데이터를 LSB에서 송신
  for (i=0; i<8; i++) {            
    SetTxd(c&0x01);    // LSB를송신
    delay_us(COMM_BAUD);     // 1클럭분 웨이트
    c >>= 1 ;    
  }
  SetTxd(1);    // 스톱비트전송
  delay_us(COMM_BAUD);   // 1클럭분 웨이트  
 
 
 
//------------------------------------------////------------------------------------------//
char GetRxd(void)
{
  //Rxd의 비트를 MSB에 세트
  if(PORT_IN&RX_PORT) { return 0x80;}
   else return 0
}
//------------------------------------------//
unsigned char RxChar(void)
{
  unsigned long TimeOut = 0;
  char i,dat=0;
 
  while(GetRxd())
  {
   WDR(); 
   TimeOut += 2;
   TimeOut -= 1;
   if (TimeOut > 100000) {   //65530
    //Error_cnt++;   
    //if(Error_cnt > 8) { #asm("jmp 0x10000"); }  //RESET 
    return 0
   }
  }
  
  delay_us(COMM_BAUD/2);     // 1/2 클럭분 웨이트(비트의중심부)  
  delay_us(COMM_BAUD);      // 1클럭분 웨이트(스타트비트스킵)  
  
  //데이터를 LSB에서 수신
  for (i=0; i<8; i++) {            
    dat >>= 1;     // 데이터 MSB에 입력하기위해 1비트 시프트
    dat |= GetRxd();  // 데이터를 MSB에 입력
    delay_us(COMM_BAUD);    // 1클럭분 웨이트 
  }
  
  //delay_us(COMM_BAUD);   // 1클럭분 웨이트(스톱비트)     
  return dat;
}
 
 
 
 
 
/*****************************************************************************/
/*****************************************************************************/
 
void main(void)
{
         putchar_soft( RxChar() );
}
 
/*****************************************************************************/
 
/*****************************************************************************/
cs


+ Recent posts