📄 sio.lst
字号:
C51 COMPILER V6.22f SIO 02/14/2002 12:21:24 PAGE 1
C51 COMPILER V6.22f, COMPILATION OF MODULE SIO
OBJECT MODULE PLACED IN SIO.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SIO.C OPTIMIZE(6,SPEED) BROWSE DEFINE(XTAL=12000000) DEBUG OBJECTEXTEND COD
-E SYMBOLS
stmt level source
1 /*------------------------------------------------------------------------------
2 SIO.C: Serial Communication Routines.
3
4 Copyright 1995-2002 KEIL Software, Inc.
5 ------------------------------------------------------------------------------*/
6
7 #include <reg51.h>
8 #include <string.h>
9 #include "sio.h"
10
11 /*------------------------------------------------------------------------------
12 ------------------------------------------------------------------------------*/
13 #define TBUF_SIZE 256 /* DO NOT CHANGE */
14 #define RBUF_SIZE 256 /* DO NOT CHANGE */
15
16 static xdata unsigned char tbuf [TBUF_SIZE];
17 static xdata unsigned char rbuf [RBUF_SIZE];
18
19 static xdata unsigned char t_in = 0;
20 static xdata unsigned char t_out = 0;
21 static xdata unsigned char t_disabled = 0;
22
23 static xdata unsigned char r_in = 0;
24 static xdata unsigned char r_out = 0;
25
26 /*------------------------------------------------------------------------------
27 ------------------------------------------------------------------------------*/
28 static void com_isr (void) interrupt 4 using 2
29 {
30 1 /*------------------------------------------------
31 1 Received data interrupt.
32 1 ------------------------------------------------*/
33 1 if (RI != 0)
34 1 {
35 2 RI = 0;
36 2
37 2 if ((r_in + 1) != r_out)
38 2 rbuf [r_in++] = SBUF;
39 2 }
40 1
41 1 /*------------------------------------------------
42 1 Transmitted data interrupt.
43 1 ------------------------------------------------*/
44 1 if (TI != 0)
45 1 {
46 2 TI = 0;
47 2
48 2 if (t_in != t_out)
49 2 SBUF = tbuf [t_out++];
50 2 else
51 2 t_disabled = 1;
52 2 }
53 1
54 1 }
C51 COMPILER V6.22f SIO 02/14/2002 12:21:24 PAGE 2
55
56 /*------------------------------------------------------------------------------
57 ------------------------------------------------------------------------------*/
58 void com_initialize (void)
59 {
60 1 /*------------------------------------------------
61 1 Setup TIMER1 to generate the proper baud rate.
62 1 ------------------------------------------------*/
63 1 com_baudrate (1200);
64 1
65 1 /*------------------------------------------------
66 1 Clear com buffer indexes.
67 1 ------------------------------------------------*/
68 1 EA = 0; /* Disable Interrupts */
69 1
70 1 t_in = 0;
71 1 t_out = 0;
72 1 t_disabled = 1;
73 1
74 1 r_in = 0;
75 1 r_out = 0;
76 1
77 1 /*------------------------------------------------
78 1 Setup serial port registers.
79 1 ------------------------------------------------*/
80 1 SM0 = 0; SM1 = 1; /* serial port MODE 1 */
81 1 SM2 = 0;
82 1 REN = 1; /* enable serial receiver */
83 1
84 1 TI = 0; /* clear transmit interrupt */
85 1 RI = 0; /* clear receiver interrupt */
86 1
87 1 ES = 1; /* enable serial interrupts */
88 1 PS = 0; /* set serial interrupts to low priority */
89 1
90 1 EA = 1; /* Enable Interrupts */
91 1 }
92
93 /*------------------------------------------------------------------------------
94 ------------------------------------------------------------------------------*/
95 void com_baudrate (
96 unsigned baudrate)
97 {
98 1 EA = 0; /* Disable Interrupts */
99 1
100 1 /*------------------------------------------------
101 1 Clear transmit interrupt and buffer.
102 1 ------------------------------------------------*/
103 1 TI = 0; /* clear transmit interrupt */
104 1 t_in = 0; /* empty transmit buffer */
105 1 t_out = 0;
106 1 t_disabled = 1; /* disable transmitter */
107 1
108 1 /*------------------------------------------------
109 1 Set timer 1 up as a baud rate generator.
110 1 ------------------------------------------------*/
111 1 TR1 = 0; /* stop timer 1 */
112 1 ET1 = 0; /* disable timer 1 interrupt */
113 1
114 1 PCON |= 0x80; /* 0x80=SMOD: set serial baudrate doubler */
115 1
116 1 TMOD &= ~0xF0; /* clear timer 1 mode bits */
C51 COMPILER V6.22f SIO 02/14/2002 12:21:24 PAGE 3
117 1 TMOD |= 0x20; /* put timer 1 into MODE 2 */
118 1
119 1 TH1 = (unsigned char) (256 - (XTAL / (16L * 12L * baudrate)));
120 1
121 1 TR1 = 1; /* start timer 1 */
122 1
123 1 EA = 1; /* Enable Interrupts */
124 1 }
125
126 /*------------------------------------------------------------------------------
127 ------------------------------------------------------------------------------*/
128 char com_putchar (
129 unsigned char c)
130 {
131 1 /*------------------------------------------------
132 1 If the buffer is full, return an error value.
133 1 ------------------------------------------------*/
134 1 if ((TBUF_SIZE - com_tbuflen ()) <= 2)
135 1 return (-1);
136 1
137 1 /*------------------------------------------------
138 1 Add the data to the transmit buffer. If the
139 1 transmit interrupt is disabled, then enable it.
140 1 ------------------------------------------------*/
141 1 EA = 0; /* Disable Interrupts */
142 1
143 1 tbuf [t_in++] = c;
144 1
145 1 if (t_disabled) /* if transmitter is disabled */
146 1 {
147 2 t_disabled = 0;
148 2 TI = 1; /* enable it */
149 2 }
150 1
151 1 EA = 1; /* Enable Interrupts */
152 1
153 1 return (0);
154 1 }
155
156 /*------------------------------------------------------------------------------
157 ------------------------------------------------------------------------------*/
158 int com_getchar (void)
159 {
160 1 int c;
161 1
162 1 if (com_rbuflen () == 0)
163 1 return (-1);
164 1
165 1 EA = 0; /* Disable Interrupts */
166 1 c = rbuf [r_out++];
167 1 EA = 1; /* Enable Interrupts */
168 1
169 1 return (c);
170 1 }
171
172 /*------------------------------------------------------------------------------
173 ------------------------------------------------------------------------------*/
174 unsigned char com_rbuflen (void)
175 {
176 1 return (r_in - r_out);
177 1 }
178
C51 COMPILER V6.22f SIO 02/14/2002 12:21:24 PAGE 4
179 /*------------------------------------------------------------------------------
180 ------------------------------------------------------------------------------*/
181 unsigned char com_tbuflen (void)
182 {
183 1 return (t_in - t_out);
184 1 }
185
186 /*------------------------------------------------------------------------------
187 ------------------------------------------------------------------------------*/
188
C51 COMPILER V6.22f SIO 02/14/2002 12:21:24 PAGE 5
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION com_isr (BEGIN)
0000 C0E0 PUSH ACC
0002 C083 PUSH DPH
0004 C082 PUSH DPL
0006 C0D0 PUSH PSW
0008 75D010 MOV PSW,#010H
; SOURCE LINE # 28
; SOURCE LINE # 33
000B 309828 JNB RI,?C0001
; SOURCE LINE # 34
; SOURCE LINE # 35
000E C298 CLR RI
; SOURCE LINE # 37
0010 900000 R MOV DPTR,#r_in
0013 E0 MOVX A,@DPTR
0014 2401 ADD A,#01H
0016 FF MOV R7,A
0017 E4 CLR A
0018 33 RLC A
0019 FE MOV R6,A
001A A3 INC DPTR
001B E0 MOVX A,@DPTR
001C 6F XRL A,R7
001D 7001 JNZ ?C0016
001F EE MOV A,R6
0020 ?C0016:
0020 6014 JZ ?C0001
; SOURCE LINE # 38
0022 900000 R MOV DPTR,#r_in
0025 E0 MOVX A,@DPTR
0026 FF MOV R7,A
0027 04 INC A
0028 F0 MOVX @DPTR,A
0029 7400 R MOV A,#LOW rbuf
002B 2F ADD A,R7
002C F582 MOV DPL,A
002E E4 CLR A
002F 3400 R ADDC A,#HIGH rbuf
0031 F583 MOV DPH,A
0033 E599 MOV A,SBUF
0035 F0 MOVX @DPTR,A
; SOURCE LINE # 39
0036 ?C0001:
; SOURCE LINE # 44
0036 309927 JNB TI,?C0006
; SOURCE LINE # 45
; SOURCE LINE # 46
0039 C299 CLR TI
; SOURCE LINE # 48
003B 900000 R MOV DPTR,#t_out
003E E0 MOVX A,@DPTR
003F FF MOV R7,A
0040 900000 R MOV DPTR,#t_in
0043 E0 MOVX A,@DPTR
0044 6F XRL A,R7
0045 6013 JZ ?C0004
; SOURCE LINE # 49
0047 A3 INC DPTR
0048 E0 MOVX A,@DPTR
C51 COMPILER V6.22f SIO 02/14/2002 12:21:24 PAGE 6
0049 04 INC A
004A F0 MOVX @DPTR,A
004B 7400 R MOV A,#LOW tbuf
004D 2F ADD A,R7
004E F582 MOV DPL,A
0050 E4 CLR A
0051 3400 R ADDC A,#HIGH tbuf
0053 F583 MOV DPH,A
0055 E0 MOVX A,@DPTR
0056 F599 MOV SBUF,A
0058 8006 SJMP ?C0006
005A ?C0004:
; SOURCE LINE # 51
005A 900000 R MOV DPTR,#t_disabled
005D 7401 MOV A,#01H
005F F0 MOVX @DPTR,A
; SOURCE LINE # 52
; SOURCE LINE # 54
0060 ?C0006:
0060 D0D0 POP PSW
0062 D082 POP DPL
0064 D083 POP DPH
0066 D0E0 POP ACC
0068 32 RETI
; FUNCTION com_isr (END)
; FUNCTION com_initialize (BEGIN)
; SOURCE LINE # 58
; SOURCE LINE # 59
; SOURCE LINE # 63
0000 7FB0 MOV R7,#0B0H
0002 7E04 MOV R6,#04H
0004 120000 R LCALL _com_baudrate
; SOURCE LINE # 68
0007 C2AF CLR EA
; SOURCE LINE # 70
0009 E4 CLR A
000A 900000 R MOV DPTR,#t_in
000D F0 MOVX @DPTR,A
; SOURCE LINE # 71
000E A3 INC DPTR
000F F0 MOVX @DPTR,A
; SOURCE LINE # 72
0010 900000 R MOV DPTR,#t_disabled
0013 04 INC A
0014 F0 MOVX @DPTR,A
; SOURCE LINE # 74
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -