📄 uart.lst
字号:
1 .file "UART.c"
2 .arch atmega16
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
54 .global outlast
55 .data
58 outlast:
59 0000 0000 .word outbuf
60 .global putlast
63 putlast:
64 0002 0000 .word outbuf
65 .global inlast
68 inlast:
69 0004 0000 .word inbuf
70 .global getlast
73 getlast:
74 0006 0000 .word inbuf
75 .text
78 .global PutByte
80 PutByte:
1:UART.c **** /************************************************************************
2:UART.c **** ;* 公 司: xx
3:UART.c **** ;* 模 块: serial.c
4:UART.c **** ;* 功 能: 串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理;
5:UART.c **** ;* 出入均设有缓冲区,大小可任意设置
6:UART.c **** ;* 芯 片: AMEGA16
7:UART.c **** ;* 说 明: 未利用串口发送硬件BUFF
8:UART.c **** ;* 设 计: 李耀峰
9:UART.c **** ;* 时 间: 2005-11-24
10:UART.c **** ;* 版 本: V1.0
11:UART.c **** ;* 记 录:
12:UART.c **** ;************************************************************************/
13:UART.c ****
14:UART.c ****
15:UART.c **** /************************************************************************
16:UART.c **** 可供使用的函数名:
17:UART.c **** extern void PutByte(U8 c); //放入一个字节到发送缓冲区
18:UART.c **** extern void PutString(U8 *puts); //发送一个定义在程序存储区的字符串到串口
19:UART.c **** extern void PutBytes(U8 *outplace,U8 j); //发送一串数据
20:UART.c **** extern void PutHEX(U8 c); //发送一个字节的hex码,分成两个字节发
21:UART.c **** extern U8 GetByte (void); //从接收缓冲区取一个byte
22:UART.c **** extern void SerialInit (U16 baud); //串口初始化
23:UART.c ****
24:UART.c **** extern U8 inbufsign; //接收缓冲区数据,有数据=1。
25:UART.c ****
26:UART.c **** #define CR PutString("\r\n") //发送一个回车换行
27:UART.c **** #define NUL putstring("\0") //发送一个空格
28:UART.c **** *************************************************************************/
29:UART.c ****
30:UART.c **** #include <avr\io.h>
31:UART.c **** //#include <macros.h>
32:UART.c **** #include "interrupt.h"
33:UART.c **** #include "avr\signal.h"
34:UART.c **** #include "Uart.h"
35:UART.c **** #define U8 unsigned char
36:UART.c **** #define U16 unsigned int
37:UART.c ****
38:UART.c ****
39:UART.c ****
40:UART.c **** U8 outbuf[OLEN]; //发送缓冲
41:UART.c **** U8 inbuf[ILEN]; //接收数据缓冲
42:UART.c **** U8 *outlast=outbuf; //最后由中断传输出去的字节位置
43:UART.c **** U8 *putlast=outbuf; //最后放入发送缓冲区的字节位置
44:UART.c **** U8 *inlast=inbuf; //最后接收到接收缓冲区的字节位置
45:UART.c **** U8 *getlast=inbuf; //最后从发送缓冲区取走的字节位置
46:UART.c ****
47:UART.c ****
48:UART.c **** //#define inbufsign bit_flag.bit3 //接收缓冲区非空标志 有=1
49:UART.c **** //U8 outbufsign0; //缓冲区数据发完标志 发完=0
50:UART.c **** //U8 outbufsign; //发送缓冲区非空标志 有=1
51:UART.c **** //U8 inbufful; //接收缓冲区满标志 满=1
52:UART.c ****
53:UART.c **** U8 inbufsign; //接收缓冲区非空标志 有=1
54:UART.c **** struct data bit_flag;
55:UART.c ****
56:UART.c ****
57:UART.c ****
58:UART.c **** //**********************************************************************
59:UART.c **** //函 数 名: void PutByte(U8 c)
60:UART.c **** //功 能: 放入一个字节到发送缓冲区
61:UART.c **** //说 明:
62:UART.c **** //参 数:
63:UART.c **** //返 回 值:
64:UART.c **** //示 范: PutByte(0x00);
65:UART.c **** //***********************************************************************
66:UART.c **** void PutByte(U8 c)
67:UART.c **** {
82 .LM1:
83 /* prologue: frame size=1 */
84 0000 CF93 push r28
85 0002 DF93 push r29
86 0004 CDB7 in r28,__SP_L__
87 0006 DEB7 in r29,__SP_H__
88 0008 2197 sbiw r28,1
89 000a 0FB6 in __tmp_reg__,__SREG__
90 000c F894 cli
91 000e DEBF out __SP_H__,r29
92 0010 0FBE out __SREG__,__tmp_reg__
93 0012 CDBF out __SP_L__,r28
94 /* prologue end (size=10) */
95 0014 8983 std Y+1,r24
68:UART.c **** cli(); //暂停串行中断,以免数据比较时出错
97 .LM2:
98 /* #APP */
99 0016 F894 cli
100 /* #NOAPP */
101 .L2:
69:UART.c **** while((((outlast-putlast)==2)&&(outlast > putlast ))||((outlast < putlast)&&(OLEN-(putlast-o
103 .LM3:
104 0018 8091 0000 lds r24,outlast
105 001c 9091 0000 lds r25,(outlast)+1
106 0020 2091 0000 lds r18,putlast
107 0024 3091 0000 lds r19,(putlast)+1
108 0028 821B sub r24,r18
109 002a 930B sbc r25,r19
110 002c 8230 cpi r24,2
111 002e 9105 cpc r25,__zero_reg__
112 0030 59F4 brne .L5
113 0032 2091 0000 lds r18,outlast
114 0036 3091 0000 lds r19,(outlast)+1
115 003a 8091 0000 lds r24,putlast
116 003e 9091 0000 lds r25,(putlast)+1
117 0042 8217 cp r24,r18
118 0044 9307 cpc r25,r19
119 0046 E8F0 brlo .L4
120 .L5:
121 0048 2091 0000 lds r18,outlast
122 004c 3091 0000 lds r19,(outlast)+1
123 0050 8091 0000 lds r24,putlast
124 0054 9091 0000 lds r25,(putlast)+1
125 0058 2817 cp r18,r24
126 005a 3907 cpc r19,r25
127 005c D8F4 brsh .L3
128 005e 2091 0000 lds r18,putlast
129 0062 3091 0000 lds r19,(putlast)+1
130 0066 8091 0000 lds r24,outlast
131 006a 9091 0000 lds r25,(outlast)+1
132 006e 281B sub r18,r24
133 0070 390B sbc r19,r25
134 0072 8CE0 ldi r24,lo8(12)
135 0074 90E0 ldi r25,hi8(12)
136 0076 821B sub r24,r18
137 0078 930B sbc r25,r19
138 007a 8230 cpi r24,2
139 007c 9105 cpc r25,__zero_reg__
140 007e 09F0 breq .L4
141 0080 09C0 rjmp .L3
142 .L4:
70:UART.c **** {
71:UART.c **** sei();
144 .LM4:
145 /* #APP */
146 0082 7894 sei
72:UART.c **** c++;c--;
148 .LM5:
149 /* #NOAPP */
150 0084 8981 ldd r24,Y+1
151 0086 8F5F subi r24,lo8(-(1))
152 0088 8983 std Y+1,r24
153 008a 8981 ldd r24,Y+1
154 008c 8150 subi r24,lo8(-(-1))
155 008e 8983 std Y+1,r24
73:UART.c **** cli();
157 .LM6:
158 /* #APP */
159 0090 F894 cli
160 /* #NOAPP */
161 0092 C2CF rjmp .L2
162 .L3:
74:UART.c **** }
75:UART.c **** *putlast=c; //放字节进入缓冲区
164 .LM7:
165 0094 E091 0000 lds r30,putlast
166 0098 F091 0000 lds r31,(putlast)+1
167 009c 8981 ldd r24,Y+1
168 009e 8083 st Z,r24
76:UART.c **** putlast++; //发送缓冲区指针加1
170 .LM8:
171 00a0 8091 0000 lds r24,putlast
172 00a4 9091 0000 lds r25,(putlast)+1
173 00a8 0196 adiw r24,1
174 00aa 9093 0000 sts (putlast)+1,r25
175 00ae 8093 0000 sts putlast,r24
77:UART.c **** if (putlast==outbuf+OLEN) putlast=outbuf; //指针到了顶部换到底部
177 .LM9:
178 00b2 8091 0000 lds r24,putlast
179 00b6 9091 0000 lds r25,(putlast)+1
180 00ba 20E0 ldi r18,hi8(outbuf+12)
181 00bc 8030 cpi r24,lo8(outbuf+12)
182 00be 9207 cpc r25,r18
183 00c0 31F4 brne .L6
184 00c2 80E0 ldi r24,lo8(outbuf)
185 00c4 90E0 ldi r25,hi8(outbuf)
186 00c6 9093 0000 sts (putlast)+1,r25
187 00ca 8093 0000 sts putlast,r24
188 .L6:
78:UART.c **** outbufsign=1;
190 .LM10:
191 00ce 8091 0000 lds r24,bit_flag
192 00d2 8260 ori r24,lo8(2)
193 00d4 8093 0000 sts bit_flag,r24
79:UART.c **** if (!outbufsign0) //缓冲区无数据
195 .LM11:
196 00d8 8091 0000 lds r24,bit_flag
197 00dc 9927 clr r25
198 00de 8170 andi r24,lo8(1)
199 00e0 9070 andi r25,hi8(1)
200 00e2 0097 sbiw r24,0
201 00e4 99F5 brne .L7
80:UART.c **** {
81:UART.c **** outbufsign0=1;
203 .LM12:
204 00e6 8091 0000 lds r24,bit_flag
205 00ea 8160 ori r24,lo8(1)
206 00ec 8093 0000 sts bit_flag,r24
82:UART.c ****
83:UART.c **** UDR=*outlast; //未发送完继续发送
208 .LM13:
209 00f0 E091 0000 lds r30,outlast
210 00f4 F091 0000 lds r31,(outlast)+1
211 00f8 8081 ld r24,Z
212 00fa 8093 2C00 sts 44,r24
84:UART.c **** outlast++; //最后传出去的字节位置加1
214 .LM14:
215 00fe 8091 0000 lds r24,outlast
216 0102 9091 0000 lds r25,(outlast)+1
217 0106 0196 adiw r24,1
218 0108 9093 0000 sts (outlast)+1,r25
219 010c 8093 0000 sts outlast,r24
85:UART.c **** if (outlast==outbuf+OLEN) outlast=outbuf;//地址到顶部回到底部
221 .LM15:
222 0110 8091 0000 lds r24,outlast
223 0114 9091 0000 lds r25,(outlast)+1
224 0118 20E0 ldi r18,hi8(outbuf+12)
225 011a 8030 cpi r24,lo8(outbuf+12)
226 011c 9207 cpc r25,r18
227 011e 31F4 brne .L8
228 0120 80E0 ldi r24,lo8(outbuf)
229 0122 90E0 ldi r25,hi8(outbuf)
230 0124 9093 0000 sts (outlast)+1,r25
231 0128 8093 0000 sts outlast,r24
232 .L8:
86:UART.c **** if (putlast==outlast) outbufsign=0; //数据发送完置发送缓冲区空标志
234 .LM16:
235 012c 2091 0000 lds r18,putlast
236 0130 3091 0000 lds r19,(putlast)+1
237 0134 8091 0000 lds r24,outlast
238 0138 9091 0000 lds r25,(outlast)+1
239 013c 2817 cp r18,r24
240 013e 3907 cpc r19,r25
241 0140 29F4 brne .L7
242 0142 8091 0000 lds r24,bit_flag
243 0146 8D7F andi r24,lo8(-3)
244 0148 8093 0000 sts bit_flag,r24
245 .L7:
87:UART.c **** } //缓冲区开始为空置为有,启动发送
88:UART.c **** sei();
247 .LM17:
248 /* #APP */
249 014c 7894 sei
250 /* #NOAPP */
251 /* epilogue: frame size=1 */
252 014e 2196 adiw r28,1
253 0150 0FB6 in __tmp_reg__,__SREG__
254 0152 F894 cli
255 0154 DEBF out __SP_H__,r29
256 0156 0FBE out __SREG__,__tmp_reg__
257 0158 CDBF out __SP_L__,r28
258 015a DF91 pop r29
259 015c CF91 pop r28
260 015e 0895 ret
261 /* epilogue end (size=9) */
262 /* function PutByte size 180 (161) */
266 .global PutString
268 PutString:
89:UART.c **** }
90:UART.c ****
91:UART.c **** //**********************************************************************
92:UART.c **** //函 数 名: void PutString(U8 *puts)
93:UART.c **** //功 能: 发送字符串到串口
94:UART.c **** //说 明:
95:UART.c **** //参 数: 发送的字符串
96:UART.c **** //返 回 值:
97:UART.c **** //示 范: putstring("\r\n")
98:UART.c **** //***********************************************************************
99:UART.c **** void PutString(U8 *puts)
100:UART.c **** {
270 .LM18:
271 /* prologue: frame size=2 */
272 0160 CF93 push r28
273 0162 DF93 push r29
274 0164 CDB7 in r28,__SP_L__
275 0166 DEB7 in r29,__SP_H__
276 0168 2297 sbiw r28,2
277 016a 0FB6 in __tmp_reg__,__SREG__
278 016c F894 cli
279 016e DEBF out __SP_H__,r29
280 0170 0FBE out __SREG__,__tmp_reg__
281 0172 CDBF out __SP_L__,r28
282 /* prologue end (size=10) */
283 0174 8983 std Y+1,r24
284 0176 9A83 std Y+2,r25
285 .L11:
101:UART.c **** for(;*puts!=0;puts++) //遇到停止符0结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -