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

📄 sio.s

📁 bootloader
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module sio.c
	.area text(rom, con, rel)
	.dbfile D:\桌面\avr程序设计\串口通讯范例\sio.c
	.dbfunc e Com_init _Com_init fV
	.even
_Com_init::
	.dbline -1
	.dbline 39
; 
; 
; #include "config.h"
; 
; #if USEUART0
; siocirqueue RTbuf_UART0;
; #endif
; #if USEUART1
; siocirqueue RTbuf_UART1;
; #endif
; 
; 
; 
; #if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
; #define USEUART0  TRUE
; #define USEUART1  FALSE
; #define iv_USART0_RXC   iv_USART_RXC
; #define iv_USART0_TXC   iv_USART_TXC
; #define UDR0  	  UDR 
; #define UCSR0A    UCSRA
; #define UCSR0B    UCSRB
; #define UCSR0C	  UCSRC
; #define UBRR0H	  UBRRH
; #define UBRR0L	  UBRRL
; #define RXCIE0	  RXCIE
; #define TXCIE0	  TXCIE
; #endif
; 
; 
; /*********************************************************************************************************
; ** 函数名称: Com_init
; ** 功能描述: 初始化串行口
; ** 输 入: 
; ** 全局变量: 无
; ** 调用模块: Com_baudrate
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Com_init (void) {	
	.dbline 43
; //WDR(); //喂狗 
; //CLI();                     // 关中断
; #if USEUART0
; Tbuf_init(&RTbuf_UART0);              //初始化接收缓冲
	ldi R16,<_RTbuf_UART0
	ldi R17,>_RTbuf_UART0
	xcall _Tbuf_init
	.dbline 44
; Rbuf_init(&RTbuf_UART0);
	ldi R16,<_RTbuf_UART0
	ldi R17,>_RTbuf_UART0
	xcall _Rbuf_init
	.dbline 45
; UCSR0B = 0x00; //disable while setting baud rate
	clr R2
	out 0xa,R2
	.dbline 46
; UCSR0A=0x00;
	out 0xb,R2
	.dbline 49
; 
; #if CPU_TYPE <= M32
; UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
	ldi R24,134
	out 0x20,R24
	.dbline 50
; UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
	ldi R24,216
	out 0xa,R24
	.dbline 67
; #else
; UCSR0C=0x06;  //8 DATA ,1 STOP, NO PARITY
; UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
; #endif
; 
; #endif
; 
; 
; #if USEUART1
; Tbuf_init(&RTbuf_B);              //初始化接收缓冲
; Rbuf_init(&RTbuf_B);
; UCSR1B = 0x00; //disable while setting baud rate
; UCSR1A = 0x00;
; UCSR1C = 0x06;
; UCSR1B = 0xD8;
; #endif
; Com_baudrate (9600);		 // 
	ldi R16,9600
	ldi R17,37
	xcall _Com_baudrate
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Com_baudrate _Com_baudrate fV
;            tmp -> R10,R11
;       baudrate -> R10,R11
	.even
_Com_baudrate::
	xcall push_gset3
	movw R10,R16
	.dbline -1
	.dbline 80
; 
; //SEI();                     // 开中断
; }
; /*********************************************************************************************************
; ** 函数名称: Com_baudrate
; ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率
; ** 输 入: baudrate指定的波特率
; ** 全局变量: 无
; ** 调用模块: 无
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Com_baudrate (uint16 baudrate) {
	.dbline 82
; uint16 tmp;
; tmp= F_CPU/baudrate/16-1;
	movw R2,R10
	clr R4
	clr R5
	ldi R20,0
	ldi R21,128
	ldi R22,112
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall div32s
	ldi R20,16
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	xcall div32s
	movw R2,R16
	movw R4,R18
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	sub R2,R20
	sbc R3,R21
	sbc R4,R22
	sbc R5,R23
	movw R10,R2
	.dbline 84
; #if USEUART0
; UBRR0H=(uint8)(tmp>>8);
	mov R2,R3
	clr R3
	out 0x20,R2
	.dbline 85
; UBRR0L=(uint8)tmp;
	out 0x9,R10
	.dbline -2
L3:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r tmp 10 i
	.dbsym r baudrate 10 i
	.dbend
	.dbfunc e Com_putchar _Com_putchar fc
	.dbstruct 0 28 .1
	.dbfield 0 R_front c
	.dbfield 1 R_rear c
	.dbfield 2 R_count c
	.dbfield 3 R_overflow c
	.dbfield 4 R_buf A[10:10]c
	.dbfield 14 T_front c
	.dbfield 15 T_rear c
	.dbfield 16 T_count c
	.dbfield 17 T_buf A[10:10]c
	.dbfield 27 T_disabled c
	.dbend
;          RTbuf -> R22,R23
;              c -> R20
	.even
_Com_putchar::
	xcall push_gset2
	movw R22,R18
	mov R20,R16
	.dbline -1
	.dbline 102
; #endif
; #if USEUART1
; UBRR1H=(uint8)(tmp>>8);
; UBRR1L=(uint8)tmp;
; #endif
; }
; /*********************************************************************************************************
; ** 函数名称: Com_putchar
; ** 功能描述: 从串行口输出一个字符c
; ** 输 入: c:输出字符
; ** 输出	 : 0:失败 1:成功
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; uint8 Com_putchar (uint8 c,siocirqueue *RTbuf) {
	.dbline 104
; //WDR(); //喂狗
; if (Tbuf_full(RTbuf)) 
	movw R16,R22
	xcall _Tbuf_full
	tst R16
	breq L5
	.dbline 105
;    return(0);
	clr R16
	xjmp L4
L5:
	.dbline 106
; else{
	.dbline 107
; 	Tbuf_putchar(c,RTbuf);				// 将数据加入到发送缓冲区并开中断
	movw R18,R22
	mov R16,R20
	xcall _Tbuf_putchar
	.dbline 108
; 	return(1);
	ldi R16,1
	.dbline -2
L4:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r RTbuf 22 pS[.1]
	.dbsym r c 20 c
	.dbend
	.dbfunc e Com_putstring _Com_putstring fV
;              i -> R12
;          RTbuf -> R22,R23
;            len -> R10
;              p -> R20,R21
	.even
_Com_putstring::
	xcall push_gset4
	mov R10,R18
	movw R20,R16
	ldd R22,y+8
	ldd R23,y+9
	.dbline -1
	.dbline 121
; 	}
; }
; /*********************************************************************************************************
; ** 函数名称: Com_putstring
; ** 功能描述: 从串行口输出一个字符串
; ** 输 入: p:指向输出字符串 len:输出长度
; ** 输出	 : 
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Com_putstring (uint8 *p,uint8 len,siocirqueue *RTbuf) {
	.dbline 124
; uint8 i;
; //WDR(); //喂狗
; if (len!=0 ){
	tst R10
	breq L21
	.dbline 124
	.dbline 125
; 	for(i=0;i<len;i++)
	clr R12
	xjmp L13
L14:
	.dbline 126
L15:
	.dbline 126
	movw R18,R22
	mov R30,R12
	clr R31
	add R30,R20
	adc R31,R21
	ldd R16,z+0
	xcall _Com_putchar
	tst R16
	breq L14
L11:
	.dbline 125
	inc R12
L13:
	.dbline 125
	cp R12,R10
	brlo L15
	.dbline 127
; 	while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
; 	}
	xjmp L9
X0:
	.dbline 128
; 	else {
	.dbline 129
; 		do{
L20:
	.dbline 130
L21:
	.dbline 130
; 			while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗;
	movw R18,R22
	movw R30,R20
	ldd R16,z+0
	xcall _Com_putchar
	tst R16
	breq L20
	.dbline 131
L18:
	.dbline 131
	movw R30,R20
	ld R24,Z+
	movw R20,R30
	cpi R24,10
	brne L21
	.dbline 132
L9:
	.dbline -2
L7:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 12 c
	.dbsym r RTbuf 22 pS[.1]
	.dbsym r len 10 c
	.dbsym r p 20 pc
	.dbend
	.dbfunc e Com_getchar _Com_getchar fc
;          RTbuf -> R20,R21
;           mode -> R22
	.even
_Com_getchar::
	xcall push_gset2
	movw R20,R18
	mov R22,R16
	.dbline -1
	.dbline 147
; 			}while(*p++!='\n');
; 	}
; 	
; }
; /*********************************************************************************************************
; ** 函数名称: Com_getchar
; ** 功能描述: 从串行口输入一个字符
; ** 输 入: mode:0不需等待,在调用函数前检测Com_R_count的值
; **              1 等待数据到来
; ** 输出	 : 读入的字符
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; 
; uint8 Com_getchar (uint8 mode,siocirqueue *RTbuf) {
L24:
	.dbline 155
L25:
	.dbline 155
; //WDR(); //喂狗
; //    Delay(Delay_Comget,MaxLimit_Comget_Delay);
; //	if (mode>0) while(Com_R_count(RTbuf)==0 && !DelayOvf(Delay_Comget))//WDR(); //喂狗;
; //	if (DelayOvf(Delay_Comget))
; //	    return 0;    //时间超时
; //	else 
; 	    
; 		while(!Com_R_count(RTbuf));
	movw R16,R20
	xcall _Com_R_count
	tst R16
	breq L24
	.dbline 156
; 		return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符
	movw R16,R20
	xcall _Rbuf_getchar
	.dbline -2
L23:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r RTbuf 20 pS[.1]
	.dbsym r mode 22 c
	.dbend
	.dbfunc e Com_Rbuf_Clear _Com_Rbuf_Clear fV
;          RTbuf -> R20,R21
	.even
_Com_Rbuf_Clear::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 161
; }
; 
; 
; 
; void Com_Rbuf_Clear(siocirqueue *RTbuf){
	.dbline 162
; 	Rbuf_init(RTbuf);
	movw R16,R20
	xcall _Rbuf_init
	.dbline -2
L27:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r RTbuf 20 pS[.1]
	.dbend
	.dbfunc e Com_getstring _Com_getstring fc
;              i -> R20
;          RTbuf -> R22,R23
;            len -> R12
;              p -> R10,R11
	.even
_Com_getstring::
	xcall push_gset4
	mov R12,R18
	movw R10,R16
	ldd R22,y+8
	ldd R23,y+9
	.dbline -1
	.dbline 167
; }
; 
; 
; 
; uint8 Com_getstring (uint8 *p,uint8 len,siocirqueue *RTbuf) {
	.dbline 168
; uint8 i=0;
	clr R20
	.dbline 170
; //WDR(); //喂狗
; if (len>0 ){
	clr R2
	cp R2,R12
	brsh L29
	.dbline 170
	.dbline 171
	xjmp L34
L31:
	.dbline 171
	.dbline 173
	movw R18,R22
	ldi R16,1
	xcall _Com_getchar
	movw R30,R10
	st Z+,R16
	movw R10,R30
	.dbline 174
L32:
	.dbline 171
	inc R20
L34:
	.dbline 171
; 	for(i=0;i<len;i++){
	cp R20,R12
	brlo L31
	.dbline 175
; 		//WDR(); //喂狗
; 		*p++=Com_getchar(1,RTbuf);
; 		}
; 	return(len);
	mov R16,R12
	xjmp L28
L29:
	.dbline 177
; 	}
; 	else{
L35:
	.dbline 180
; 		
; 		
; 		do{
	.dbline 181
; 				*p++=Com_getchar(1,RTbuf);
	movw R18,R22
	ldi R16,1
	xcall _Com_getchar
	movw R30,R10
	st Z+,R16
	movw R10,R30
	.dbline 182
; 				i++;
	inc R20
	.dbline 184
L36:
	.dbline 184
; 				//WDR(); //喂狗
; 			}while(*(p-1)!='\n');
	movw R30,R10
	sbiw R30,1
	ldd R24,z+0
	cpi R24,10
	brne L35
	.dbline 187
; //			*p++=Com_getchar(1,RTbuf);
; //			*(p)=0;
; 		return(i);
	mov R16,R20
	.dbline -2
L28:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r RTbuf 22 pS[.1]
	.dbsym r len 12 c
	.dbsym r p 10 pc
	.dbend
	.dbfunc e Com_R_count _Com_R_count fc
;          RTbuf -> R16,R17
	.even
_Com_R_count::
	.dbline -1
	.dbline 203
; 		}
; 	
; }
; 
; 
; /*********************************************************************************************************
; ** 函数名称: Com_R_count
; ** 功能描述: 返回接收缓冲区字符个数函数
; ** 输 入: 
; ** 输出	 : 字符个数
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; uint8 Com_R_count(siocirqueue *RTbuf){
	.dbline 204
; return RTbuf->R_count;
	movw R30,R16
	ldd R16,z+2
	.dbline -2
L38:
	.dbline 0 ; func end
	ret
	.dbsym r RTbuf 16 pS[.1]
	.dbend
	.dbfunc e Rbuf_init _Rbuf_init fV
;          RTbuf -> R16,R17
	.even
_Rbuf_init::
	.dbline -1
	.dbline 216
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_init
; ** 功能描述: 接收缓冲区初始化
; ** 输 入: 
; ** 输出	 : 
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Rbuf_init(siocirqueue *RTbuf){
	.dbline 217
; 	RTbuf->R_front=0;
	clr R2
	movw R30,R16
	std z+0,R2
	.dbline 218
; 	RTbuf->R_rear=0;
	std z+1,R2
	.dbline 219
;     RTbuf->R_count=0;
	movw R30,R16
	std z+2,R2
	.dbline 220
; 	RTbuf->R_overflow=0;
	movw R30,R16
	std z+3,R2
	.dbline -2
L39:
	.dbline 0 ; func end
	ret
	.dbsym r RTbuf 16 pS[.1]
	.dbend
	.dbfunc e Tbuf_init _Tbuf_init fV
;          RTbuf -> R16,R17
	.even
_Tbuf_init::
	.dbline -1
	.dbline 232
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_init
; ** 功能描述: 发送缓冲区初始化
; ** 输 入: 
; ** 输出	 : 
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Tbuf_init(siocirqueue *RTbuf){
	.dbline 233
; 	RTbuf->T_front=0;
	clr R2
	movw R30,R16
	std z+14,R2
	.dbline 234
; 	RTbuf->T_rear=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -