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

📄 sio.s

📁 ATMEGA128的PCF8536驱动程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module sio.c
	.area text(rom, con, rel)
	.dbfile D:\avrvi\AVRVi_m128_Starter_Kit\PCF8563_USART\source\lib\sio.c
	.dbfunc e Com_init _Com_init fV
	.even
_Com_init::
	.dbline -1
	.dbline 43
; /************************************************
; 文件:sio.c
; 用途:结构化串口通信程序
; 注意:
; 创建:2008.1.26
; 修改:2008.1.26
; Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
; ************************************************/
; #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 47
; //WDR(); //喂狗 
; //CLI();                     // 关中断
; #if USEUART0
; Tbuf_init(&RTbuf_UART0);              //初始化接收缓冲
	ldi R16,<_RTbuf_UART0
	ldi R17,>_RTbuf_UART0
	xcall _Tbuf_init
	.dbline 48
; Rbuf_init(&RTbuf_UART0);
	ldi R16,<_RTbuf_UART0
	ldi R17,>_RTbuf_UART0
	xcall _Rbuf_init
	.dbline 49
; UCSR0B = 0x00; //disable while setting baud rate
	clr R2
	out 0xa,R2
	.dbline 50
; UCSR0A=0x00;
	out 0xb,R2
	.dbline 56
; 
; #if CPU_TYPE <= M32
; UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
; UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
; #else
; UCSR0C=0x06;  //8 DATA ,1 STOP, NO PARITY
	ldi R24,6
	sts 149,R24
	.dbline 57
; UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
	ldi R24,216
	out 0xa,R24
	.dbline 71
; #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 84
; 
; //SEI();                     // 开中断
; }
; /*********************************************************************************************************
; ** 函数名称: Com_baudrate
; ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率
; ** 输 入: baudrate指定的波特率
; ** 全局变量: 无
; ** 调用模块: 无
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Com_baudrate (unsigned int baudrate) {
	.dbline 86
; unsigned int tmp;
; tmp= F_CPU/baudrate/16-1;
	movw R2,R10
	clr R4
	clr R5
	ldi R20,0
	ldi R21,18
	ldi R22,122
	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 88
; #if USEUART0
; UBRR0H=(unsigned char)(tmp>>8);
	mov R2,R3
	clr R3
	sts 144,R2
	.dbline 89
; UBRR0L=(unsigned char)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 208 .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[100:100]c
	.dbfield 104 T_front c
	.dbfield 105 T_rear c
	.dbfield 106 T_count c
	.dbfield 107 T_buf A[100:100]c
	.dbfield 207 T_disabled c
	.dbend
;          RTbuf -> R22,R23
;              c -> R20
	.even
_Com_putchar::
	xcall push_gset2
	movw R22,R18
	mov R20,R16
	.dbline -1
	.dbline 106
; #endif
; #if USEUART1
; UBRR1H=(unsigned char)(tmp>>8);
; UBRR1L=(unsigned char)tmp;
; #endif
; }
; /*********************************************************************************************************
; ** 函数名称: Com_putchar
; ** 功能描述: 从串行口输出一个字符c
; ** 输 入: c:输出字符
; ** 输出	 : 0:失败 1:成功
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; unsigned char Com_putchar (unsigned char c,siocirqueue *RTbuf) {
	.dbline 108
; //WDR(); //喂狗
; if (Tbuf_full(RTbuf)) 
	movw R16,R22
	xcall _Tbuf_full
	tst R16
	breq L5
	.dbline 109
;    return(0);
	clr R16
	xjmp L4
L5:
	.dbline 110
; else{
	.dbline 111
; 	Tbuf_putchar(c,RTbuf);				// 将数据加入到发送缓冲区并开中断
	movw R18,R22
	mov R16,R20
	xcall _Tbuf_putchar
	.dbline 112
; 	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 125
; 	}
; }
; /*********************************************************************************************************
; ** 函数名称: Com_putstring
; ** 功能描述: 从串行口输出一个字符串
; ** 输 入: p:指向输出字符串 len:输出长度
; ** 输出	 : 
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Com_putstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
	.dbline 128
; unsigned char i;
; //WDR(); //喂狗
; if (len!=0 ){
	tst R10
	breq L21
	.dbline 128
	.dbline 129
; 	for(i=0;i<len;i++)
	clr R12
	xjmp L13
L14:
	.dbline 130
L15:
	.dbline 130
	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 129
	inc R12
L13:
	.dbline 129
	cp R12,R10
	brlo L15
	.dbline 131
; 	while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
; 	}
	xjmp L9
X0:
	.dbline 132
; 	else {
	.dbline 133
; 		do{
L20:
	.dbline 134
L21:
	.dbline 134
; 			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 135
L18:
	.dbline 135
	movw R30,R20
	ld R24,Z+
	movw R20,R30
	cpi R24,10
	brne L21
	.dbline 136
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 151
; 			}while(*p++!='\n');
; 	}
; 	
; }
; /*********************************************************************************************************
; ** 函数名称: Com_getchar
; ** 功能描述: 从串行口输入一个字符
; ** 输 入: mode:0不需等待,在调用函数前检测Com_R_count的值
; **              1 等待数据到来
; ** 输出	 : 读入的字符
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; 
; unsigned char Com_getchar (unsigned char mode,siocirqueue *RTbuf) {
L24:
	.dbline 159
L25:
	.dbline 159
; //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 160
; 		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 165
; }
; 
; 
; 
; void Com_Rbuf_Clear(siocirqueue *RTbuf){
	.dbline 166
; 	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 171
; }
; 
; 
; 
; unsigned char Com_getstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
	.dbline 172
; unsigned char i=0;
	clr R20
	.dbline 174
; //WDR(); //喂狗
; if (len>0 ){
	clr R2
	cp R2,R12
	brsh L29
	.dbline 174
	.dbline 175
	xjmp L34
L31:
	.dbline 175
	.dbline 177
	movw R18,R22
	ldi R16,1
	xcall _Com_getchar
	movw R30,R10
	st Z+,R16
	movw R10,R30
	.dbline 178
L32:
	.dbline 175
	inc R20
L34:
	.dbline 175
; 	for(i=0;i<len;i++){
	cp R20,R12
	brlo L31
	.dbline 179
; 		//WDR(); //喂狗
; 		*p++=Com_getchar(1,RTbuf);
; 		}
; 	return(len);
	mov R16,R12
	xjmp L28
L29:
	.dbline 181
; 	}
; 	else{
L35:
	.dbline 184
; 		
; 		
; 		do{
	.dbline 185
; 				*p++=Com_getchar(1,RTbuf);
	movw R18,R22
	ldi R16,1
	xcall _Com_getchar
	movw R30,R10
	st Z+,R16
	movw R10,R30
	.dbline 186
; 				i++;
	inc R20
	.dbline 188
L36:
	.dbline 188
; 				//WDR(); //喂狗
; 			}while(*(p-1)!='\n');
	movw R30,R10
	sbiw R30,1
	ldd R24,z+0
	cpi R24,10
	brne L35
	.dbline 191
; //			*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 207
; 		}
; 	
; }
; 
; 
; /*********************************************************************************************************
; ** 函数名称: Com_R_count
; ** 功能描述: 返回接收缓冲区字符个数函数
; ** 输 入: 
; ** 输出	 : 字符个数
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; unsigned char Com_R_count(siocirqueue *RTbuf){
	.dbline 208
; 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 220
; }
; /*********************************************************************************************************
; ** 函数名称: Rbuf_init
; ** 功能描述: 接收缓冲区初始化
; ** 输 入: 
; ** 输出	 : 
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Rbuf_init(siocirqueue *RTbuf){
	.dbline 221
; 	RTbuf->R_front=0;
	clr R2
	movw R30,R16
	std z+0,R2
	.dbline 222
; 	RTbuf->R_rear=0;
	std z+1,R2
	.dbline 223
;     RTbuf->R_count=0;
	movw R30,R16
	std z+2,R2
	.dbline 224
; 	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 236
; }
; /*********************************************************************************************************
; ** 函数名称: Tbuf_init
; ** 功能描述: 发送缓冲区初始化
; ** 输 入: 
; ** 输出	 : 
; ** 全局变量: 无
; ** 调用模块: 
; ** 说明:
; ** 注意:
; ********************************************************************************************************/
; void Tbuf_init(siocirqueue *RTbuf){
	.dbline 237
; 	RTbuf->T_front=0;
	clr R2
	movw R30,R16
	subi R30,152  ; addi 104
	sbci R31,255
	std z+0,R2
	.dbline 238
; 	RTbuf->T_rear=0;
	movw R30,R16
	subi R30,151  ; addi 105
	sbci R31,255
	std z+0,R2
	.dbline 239
;     RTbuf->T_count=0;
	movw R30,R16
	subi R30,150  ; addi 106
	sbci R31,255
	std z+0,R2

⌨️ 快捷键说明

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