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

📄 serial.s

📁 使用8880实现DTMF通信及拨号的程序.
💻 S
字号:
	.module serial.c
	.area text(rom, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\serial.c
	.dbfunc e uart0_init _uart0_init fV
	.even
_uart0_init::
	.dbline -1
	.dbline 17
; //ICC-AVR application builder : 2007-10-18 21:13:05
; // Target : M8
; // Crystal: 8.0000Mhz
; 
; #include <iom8v.h>
; #include <macros.h>
; #include <string.h>
; #include "serial.h"
; #include "main.h"
; //UART0 initialize
; // desired baud rate: 110
; // actual: invalid baud rate
; SERIAL_PORT_STATUS com_status;
; char recv_buf[RECV_BUFLEN];
; char send_buf[SEND_BUFLEN];
; void uart0_init(void)
; {
	.dbline 18
;  UCSRB = 0x00; //disable while setting baud rate
	clr R2
	out 0xa,R2
	.dbline 19
;  UCSRA = 0x00;
	out 0xb,R2
	.dbline 20
;  UCSRC = BIT(URSEL) | 0x06;
	ldi R24,134
	out 0x20,R24
	.dbline 21
;  UBRRL = 0x03; //set baud rate lo
	ldi R24,3
	out 0x9,R24
	.dbline 22
;  UBRRH = 0x00; //set baud rate hi
	out 0x20,R2
	.dbline 23
;  UCSRB = 0x98;
	ldi R24,152
	out 0xa,R24
	.dbline 24
;  com_status.read_start_ptr=recv_buf;
	ldi R24,<_recv_buf
	ldi R25,>_recv_buf
	sts _com_status+1,R25
	sts _com_status,R24
	.dbline 25
;  com_status.read_end_ptr=recv_buf;
	sts _com_status+2+1,R25
	sts _com_status+2,R24
	.dbline 26
;  com_status.recv_cur_ptr=recv_buf;
	sts _com_status+4+1,R25
	sts _com_status+4,R24
	.dbline 27
;  com_status.send_cur_ptr=send_buf;
	ldi R24,<_send_buf
	ldi R25,>_send_buf
	sts _com_status+6+1,R25
	sts _com_status+6,R24
	.dbline 28
;  com_status.sending=0;
	sts _com_status+8,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 22
	rjmp _uart0_rx_isr
	.area text(rom, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\serial.c
	.dbfunc e uart0_rx_isr _uart0_rx_isr fV
;              c -> R16
	.even
_uart0_rx_isr::
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 33
; }
; 
; #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
; void uart0_rx_isr(void)
; {	 
	.dbline 35
; 	 char c;
; 	 c=UDR;
	in R16,0xc
	.dbline 36
; 	 if (sysoption.echo){
	lds R2,_sysoption
	tst R2
	breq L7
X0:
	.dbline 36
	.dbline 37
; 	 	if (c=='\r')
	cpi R16,13
	brne L9
X1:
	.dbline 38
; 		    UDR='\n'; 
	ldi R24,10
	out 0xc,R24
	rjmp L10
L9:
	.dbline 40
; 	 	else
; 			UDR=c;
	out 0xc,R16
L10:
	.dbline 41
; 	 }
L7:
	.dbline 42
; 	 if (c==0) return;
	tst R16
	brne L11
X2:
	.dbline 42
	rjmp L6
L11:
	.dbline 43
;  	 *com_status.recv_cur_ptr++=c;
	lds R30,_com_status+4
	lds R31,_com_status+4+1
	st Z+,R16
	sts _com_status+4+1,R31
	sts _com_status+4,R30
	.dbline 44
; 	 if (com_status.recv_cur_ptr==recv_buf+RECV_BUFLEN)
	ldi R24,<_recv_buf+50
	ldi R25,>_recv_buf+50
	cp R30,R24
	cpc R31,R25
	brne L14
X3:
	.dbline 45
; 	 	com_status.recv_cur_ptr=recv_buf;
	ldi R24,<_recv_buf
	ldi R25,>_recv_buf
	sts _com_status+4+1,R25
	sts _com_status+4,R24
L14:
	.dbline 46
; 	 if (c==LINE_END_CHAR) {
	cpi R16,13
	brne L19
X4:
	.dbline 46
	.dbline 47
; 	 	com_status.read_end_ptr=com_status.recv_cur_ptr;
	lds R2,_com_status+4
	lds R3,_com_status+4+1
	sts _com_status+2+1,R3
	sts _com_status+2,R2
	.dbline 48
; 	 }
L19:
	.dbline -2
L6:
	.dbline 0 ; func end
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R16,y+
	ld R3,y+
	ld R2,y+
	reti
	.dbsym r c 16 c
	.dbend
	.area vector(rom, abs)
	.org 24
	rjmp _uart0_udre_isr
	.area text(rom, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\serial.c
	.dbfunc e uart0_udre_isr _uart0_udre_isr fV
	.even
_uart0_udre_isr::
	st -y,R2
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 52
; }
; #pragma interrupt_handler uart0_udre_isr:iv_USART0_UDRE
; void uart0_udre_isr(void)
; {
	.dbline 53
;  	 UDR=*com_status.send_cur_ptr++;
	lds R30,_com_status+6
	lds R31,_com_status+6+1
	ld R2,Z+
	sts _com_status+6+1,R31
	sts _com_status+6,R30
	out 0xc,R2
	.dbline 54
; 	 if (*com_status.send_cur_ptr==0 || com_status.send_cur_ptr==send_buf+SEND_BUFLEN){
	ldd R2,z+0
	tst R2
	breq L30
X5:
	ldi R24,<_send_buf+50
	ldi R25,>_send_buf+50
	cp R30,R24
	cpc R31,R25
	brne L25
X6:
L30:
	.dbline 54
	.dbline 55
; 	 	UCSRB&=~0x20;
	cbi 0xa,5
	.dbline 56
; 		com_status.sending=0;
	clr R2
	sts _com_status+8,R2
	.dbline 57
; 	 }
L25:
	.dbline -2
L23:
	.dbline 0 ; func end
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R2,y+
	reti
	.dbend
	.dbfunc e serial_send _serial_send fV
;            buf -> R10,R11
	.even
_serial_send::
	st -y,R10
	st -y,R11
	movw R10,R16
	.dbline -1
	.dbline 60
; }
; void serial_send(char *buf)
; {
	.dbline 61
;  	 if (*buf==0) return;
	movw R30,R10
	ldd R2,z+0
	tst R2
	brne L36
X7:
	.dbline 61
	rjmp L32
L35:
	.dbline 62
; 	 while (com_status.sending);
L36:
	.dbline 62
	lds R2,_com_status+8
	tst R2
	brne L35
X8:
	.dbline 63
; 	 strcpy(send_buf,buf);
	movw R18,R10
	ldi R16,<_send_buf
	ldi R17,>_send_buf
	rcall _strcpy
	.dbline 64
; 	 com_status.send_cur_ptr=send_buf;
	ldi R24,<_send_buf
	ldi R25,>_send_buf
	sts _com_status+6+1,R25
	sts _com_status+6,R24
	.dbline 65
; 	 com_status.sending=-1;
	ldi R24,255
	sts _com_status+8,R24
	.dbline 66
;   	 UCSRB|=0x20;
	sbi 0xa,5
	.dbline -2
L32:
	.dbline 0 ; func end
	ld R11,y+
	ld R10,y+
	ret
	.dbsym r buf 10 pc
	.dbend
	.dbfunc e serial_recv _serial_recv fi
;            len -> R20,R21
;         buflen -> R18,R19
;            buf -> R16,R17
	.even
_serial_recv::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 69
; }
; unsigned int serial_recv(char *buf,unsigned int buflen)
; {
	.dbline 70
;  	 unsigned int len=0;
	clr R20
	clr R21
	.dbline 71
; 	 if (com_status.read_start_ptr==com_status.read_end_ptr) return 0;
	lds R2,_com_status+2
	lds R3,_com_status+2+1
	lds R4,_com_status
	lds R5,_com_status+1
	cp R4,R2
	cpc R5,R3
	brne L46
X9:
	.dbline 71
	clr R16
	clr R17
	rjmp L41
L45:
	.dbline 72
; 	 while(com_status.read_start_ptr!=com_status.read_end_ptr && len<buflen-1){
	.dbline 73
; 	 	*buf++=*com_status.read_start_ptr++;
	lds R30,_com_status
	lds R31,_com_status+1
	movw R26,R16
	ld R0,Z+
	sts _com_status+1,R31
	sts _com_status,R30
	st X+,R0
	movw R16,R26
	.dbline 74
; 		len++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 75
; 		if (com_status.read_start_ptr==recv_buf+RECV_BUFLEN)
	ldi R24,<_recv_buf+50
	ldi R25,>_recv_buf+50
	lds R2,_com_status
	lds R3,_com_status+1
	cp R2,R24
	cpc R3,R25
	brne L49
X10:
	.dbline 76
; 		   com_status.read_start_ptr=recv_buf;
	ldi R24,<_recv_buf
	ldi R25,>_recv_buf
	sts _com_status+1,R25
	sts _com_status,R24
L49:
	.dbline 77
; 	 }
L46:
	.dbline 72
	lds R2,_com_status+2
	lds R3,_com_status+2+1
	lds R4,_com_status
	lds R5,_com_status+1
	cp R4,R2
	cpc R5,R3
	breq L52
X11:
	movw R24,R18
	sbiw R24,1
	cp R20,R24
	cpc R21,R25
	brlo L45
X12:
L52:
	.dbline 78
; 	 *(--buf)=0;
	movw R24,R16
	sbiw R24,1
	clr R2
	movw R30,R24
	std z+0,R2
	.dbline 79
; 	 return --len;
	movw R24,R20
	sbiw R24,1
	movw R20,R24
	movw R16,R24
	.dbline -2
L41:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r len 20 i
	.dbsym r buflen 18 i
	.dbsym r buf 16 pc
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\Shuaihu\AVR\8880\serial.c
_send_buf::
	.blkb 50
	.dbsym e send_buf _send_buf A[50:50]c
_recv_buf::
	.blkb 50
	.dbsym e recv_buf _recv_buf A[50:50]c
_com_status::
	.blkb 9
	.dbstruct 0 9 tagSERIAL_PORT_STATUS
	.dbfield 0 read_start_ptr pc
	.dbfield 2 read_end_ptr pc
	.dbfield 4 recv_cur_ptr pc
	.dbfield 6 send_cur_ptr pc
	.dbfield 8 sending c
	.dbend
	.dbsym e com_status _com_status S[tagSERIAL_PORT_STATUS]
; }
; 

⌨️ 快捷键说明

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