📄 serial.lst
字号:
C51 COMPILER V7.09 SERIAL 06/18/2004 09:25:01 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN SERIAL.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SERIAL.C OPTIMIZE(6,SPEED) DEBUG OBJECTEXTEND
line level source
1 /******************************************************************************/
2 /* */
3 /* SERIAL.C: Interrupt Controlled Serial Interface for RTX-51 tiny */
4 /* */
5 /******************************************************************************/
6
7
8 #include <reg52.h> /* special function register 8052 */
9 #include <rtx51tny.h> /* RTX-51 tiny functions & defines */
10
11 #define OLEN 8 /* size of serial transmission buffer */
12 unsigned char ostart; /* transmission buffer start index */
13 unsigned char oend; /* transmission buffer end index */
14 idata char outbuf[OLEN]; /* storage for transmission buffer */
15 unsigned char otask = 0xff; /* task number of output task */
16
17 #define ILEN 8 /* size of serial receiving buffer */
18 unsigned char istart; /* receiving buffer start index */
19 unsigned char iend; /* receiving buffer end index */
20 idata char inbuf[ILEN]; /* storage for receiving buffer */
21 unsigned char itask = 0xff; /* task number of output task */
22
23 #define CTRL_Q 0x11 /* Control+Q character code */
24 #define CTRL_S 0x13 /* Control+S character code */
25
26 bit sendfull; /* flag: marks transmit buffer full */
27 bit sendactive; /* flag: marks transmitter active */
28 bit sendstop; /* flag: marks XOFF character */
29
30 /******************************************************************************/
31 /* putbuf: write a character to SBUF or transmission buffer */
32 /******************************************************************************/
33 void putbuf (char c) {
34 1 if (!sendfull) { /* transmit only if buffer not full */
35 2 if (!sendactive && !sendstop) { /* if transmitter not active: */
36 3 sendactive = 1; /* transfer the first character direct */
37 3 SBUF = c; /* to SBUF to start transmission */
38 3 }
39 2 else { /* otherwize: */
40 3 outbuf[oend++ & (OLEN-1)] = c; /* transfer char to transmission buffer */
41 3 if (((oend ^ ostart) & (OLEN-1)) == 0) sendfull = 1;
42 3 } /* set flag if buffer is full */
43 2 }
44 1 }
45
46
47 /******************************************************************************/
48 /* putchar: interrupt controlled putchar function */
49 /******************************************************************************/
50 char putchar (char c) {
51 1 if (c == '\n') { /* expand new line character: */
52 2 while (sendfull) { /* wait for transmission buffer empty */
53 3 otask = os_running_task_id (); /* set output task number */
54 3 os_wait (K_SIG, 0, 0); /* RTX-51 call: wait for signal */
55 3 otask = 0xff; /* clear output task number */
C51 COMPILER V7.09 SERIAL 06/18/2004 09:25:01 PAGE 2
56 3 }
57 2 putbuf (0x0D); /* send CR before LF for <new line> */
58 2 }
59 1 while (sendfull) { /* wait for transmission buffer empty */
60 2 otask = os_running_task_id (); /* set output task number */
61 2 os_wait (K_SIG, 0, 0); /* RTX-51 call: wait for signal */
62 2 otask = 0xff; /* clear output task number */
63 2 }
64 1 putbuf (c); /* send character */
65 1 return (c); /* return character: ANSI requirement */
66 1 }
67
68
69 /******************************************************************************/
70 /* _getkey: interrupt controlled _getkey */
71 /******************************************************************************/
72 char _getkey (void) {
73 1 while (iend == istart) {
74 2 itask = os_running_task_id (); /* set input task number */
75 2 os_wait (K_SIG, 0, 0); /* RTX-51 call: wait for signal */
76 2 itask = 0xff; /* clear input task number */
77 2 }
78 1 return (inbuf[istart++ & (ILEN-1)]);
79 1 }
80
81
82 /******************************************************************************/
83 /* serial: serial receiver / transmitter interrupt */
84 /******************************************************************************/
85 void serial (void) interrupt 4 using 2 { /* use registerbank 2 for interrupt */
86 1 unsigned char c;
87 1 bit start_trans = 0;
88 1
89 1 if (RI) { /* if receiver interrupt */
90 2 c = SBUF; /* read character */
91 2 RI = 0; /* clear interrupt request flag */
92 2 switch (c) { /* process character */
93 3 case CTRL_S:
94 3 sendstop = 1; /* if Control+S stop transmission */
95 3 break;
96 3
97 3 case CTRL_Q:
98 3 start_trans = sendstop; /* if Control+Q start transmission */
99 3 sendstop = 0;
100 3 break;
101 3
102 3 default: /* read all other characters into inbuf */
103 3 if (istart + ILEN != iend) {
104 4 inbuf[iend++ & (ILEN-1)] = c;
105 4 }
106 3 /* if task waiting: signal ready */
107 3 if (itask != 0xFF) isr_send_signal (itask);
108 3 break;
109 3 }
110 2 }
111 1
112 1 if (TI || start_trans) { /* if transmitter interrupt */
113 2 TI = 0; /* clear interrupt request flag */
114 2 if (ostart != oend) { /* if characters in buffer and */
115 3 if (!sendstop) { /* if not Control+S received */
116 4 SBUF = outbuf[ostart++ & (OLEN-1)]; /* transmit character */
117 4 sendfull = 0; /* clear 'sendfull' flag */
C51 COMPILER V7.09 SERIAL 06/18/2004 09:25:01 PAGE 3
118 4 /* if task waiting: signal ready */
119 4 if (otask != 0xFF) isr_send_signal (otask);
120 4 }
121 3 }
122 2 else sendactive = 0; /* if all transmitted clear 'sendactive' */
123 2 }
124 1
125 1 }
126
127
128 /******************************************************************************/
129 /* serial_init: initialize serial interface */
130 /******************************************************************************/
131 void serial_init (void) {
132 1 SCON = 0x50; /* mode 1: 8-bit UART, enable receiver */
133 1 TMOD |= 0x20; /* timer 1 mode 2: 8-Bit reload */
134 1 TH1 = 0xf3; /* reload value 2400 baud */
135 1 TR1 = 1; /* timer 1 run */
136 1 ES = 1; /* enable serial port interrupt */
137 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 290 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 1
IDATA SIZE = 16 ----
BIT SIZE = 3 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -