⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.lst

📁 串口转发IIC程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
   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 + -