?? 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 + -