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

📄 uart.s

📁 mega128平台下
💻 S
字号:
	.module Uart.c
	.area data(ram, con, rel)
_put_done::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
_recv_done::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
_newMSG::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
_change_flag::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
_serial_recv_flag::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.area vector(rom, abs)
	.org 72
	jmp _uart0_rx_isr
	.area data(ram, con, rel)
	.area text(rom, con, rel)
	.even
_uart0_rx_isr::
	xcall push_lset
; #include<iom128v.h>
; //UART0接口
; 
; 
; unsigned char put_done=0;
; unsigned char recv_done=0;
; unsigned char recvBuff[128]; 
; unsigned char newMSG=0;
; unsigned char i;
; unsigned char *serial_recv_MSG;
; unsigned char change_flag=0;
; unsigned char serial_recv_flag=0;
; 
; #pragma interrupt_handler uart0_rx_isr:19
; void uart0_rx_isr(void)
; {
;   recv_done=1;
	ldi R24,1
	sts _recv_done,R24
;   serial_get();
	xcall _serial_get
L1:
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.area vector(rom, abs)
	.org 80
	jmp _uart0_tx_isr
	.area text(rom, con, rel)
	.even
_uart0_tx_isr::
	st -y,R24
	in R24,0x3f
	st -y,R24
;   }
; 
; 
; #pragma interrupt_handler uart0_tx_isr:21
; void uart0_tx_isr(void)
; {
;   put_done=1; 
	ldi R24,1
	sts _put_done,R24
L2:
	ld R24,y+
	out 0x3f,R24
	ld R24,y+
	.dbline 0 ; func end
	reti
;           data -> R16
	.even
_put::
; }
; 
; 
; //**********Put a single byte to the serial port. 
; void put(unsigned char data) 
; {
L4:
L5:
;       while(!put_done)
	lds R2,_put_done
	tst R2
	breq L4
;       ;
;       UDR0=data;
	out 0xc,R16
;       put_done=0;
	clr R2
	sts _put_done,R2
L3:
	.dbline 0 ; func end
	ret
;           data -> R16
	.even
_get::
;  }
; 
; 
; //***********Receive a single byte from the serial port. 
; unsigned char get() 
; {
L8:
L9:
;      unsigned char data;
;      while(!recv_done)
	lds R2,_recv_done
	tst R2
	breq L8
;       ;
;      data=UDR0;
	in R16,0xc
;      recv_done=0;
	clr R2
	sts _recv_done,R2
;      return data;
L7:
	.dbline 0 ; func end
	ret
;         length -> R20
;              m -> R22
;           data -> R12
;     serial_MSG -> R10,R11
	.even
_serial_put::
	xcall push_gset4
	movw R10,R16
; }
; 
;   
; //**********Put a serial Frame to the serial port. 
; void serial_put(unsigned char *serial_MSG) 
; {
;   unsigned char m;
;   unsigned char length;
;   unsigned char data;
;   put(0x7E);
	ldi R16,126
	xcall _put
;   serial_MSG++;
	movw R24,R10
	adiw R24,1
	movw R10,R24
;   length=*serial_MSG;
	movw R30,R24
	ldd R20,z+0
;   
;   for(m=0;m<length;m++)
	clr R22
	xjmp L15
L12:
;   {
;     data=*serial_MSG;
	movw R30,R10
	ldd R12,z+0
;     if(data==0x7E)
	mov R24,R12
	cpi R24,126
	brne L16
;     {
;       put(0x7D);
	ldi R16,125
	xcall _put
;       put(0x5E);	
	ldi R16,94
	xcall _put
;     }
	xjmp L17
L16:
;     else if(data==0x7D)
	mov R24,R12
	cpi R24,125
	brne L18
;     {
;       put(0x7D);
	ldi R16,125
	xcall _put
;       put(0x5D);	
	ldi R16,93
	xcall _put
;     }
	xjmp L19
L18:
;     else
;       {
;       	put(data);
	mov R16,R12
	xcall _put
;       	}
L19:
L17:
L13:
	inc R22
L15:
	cp R22,R20
	brlo L12
;    }
;    put(0x7E);
	ldi R16,126
	xcall _put
L11:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
;           data -> R20
	.even
_serial_get::
	xcall push_gset2
; }
; 
; //**********Receive a serial Frame from the serial port.
; unsigned char *serial_get()
; {
;         unsigned char data;
; 	data=get();
	xcall _get
	mov R20,R16
;     
;         if(data==0x7E&&newMSG==0)  //symbol for new msg
	cpi R16,126
	brne L21
	lds R2,_newMSG
	tst R2
	brne L21
;         {
;       		i=0;
	clr R2
	sts _i,R2
; 			newMSG=1;
	ldi R24,1
	sts _newMSG,R24
;         	recvBuff[i]=data;
	ldi R24,<_recvBuff
	ldi R25,>_recvBuff
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R20
;          	serial_recv_MSG=&recvBuff[i];
	lds R2,_i
	clr R3
	add R2,R24
	adc R3,R25
	sts _serial_recv_MSG+1,R3
	sts _serial_recv_MSG,R2
;         	i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
;         }
	xjmp L22
L21:
;     	else if(data==0x7E&&newMSG==1)
	cpi R20,126
	brne L23
	lds R24,_newMSG
	cpi R24,1
	brne L23
;       	{
;       		newMSG=0;
	clr R2
	sts _newMSG,R2
;       		recvBuff[i]=data;
	ldi R24,<_recvBuff
	ldi R25,>_recvBuff
	lds R30,_i
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R20
;       		i=0;
	sts _i,R2
;       		serial_recv_flag=1;   //一条消息发送完毕,在处理完本条消息后需要被置零
	ldi R24,1
	sts _serial_recv_flag,R24
;         }
	xjmp L24
L23:
;     	else
;       	{
;       		if(data==0x7D)
	cpi R20,125
	brne L25
;       		{
;       	  		change_flag=1;
	ldi R24,1
	sts _change_flag,R24
;       	  	}
	xjmp L26
L25:
;       		else if(change_flag==1)
	lds R24,_change_flag
	cpi R24,1
	brne L27
;       		{
;       	 		switch(data)
	mov R22,R20
	clr R23
	cpi R22,93
	ldi R30,0
	cpc R23,R30
	breq L33
	cpi R22,94
	ldi R30,0
	cpc R23,R30
	breq L32
	xjmp L28
X0:
;       	  		{
L32:
;       	     		case 0x5E: recvBuff[i]=0x7E;
	ldi R24,<_recvBuff
	ldi R25,>_recvBuff
	lds R30,_i
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,126
	std z+0,R24
;       	                	   change_flag=0;
	clr R2
	sts _change_flag,R2
;       	                	   i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
;       	                	   break;
	xjmp L28
L33:
;       	     		case 0x5D: recvBuff[i]=0x7D;
	ldi R24,<_recvBuff
	ldi R25,>_recvBuff
	lds R30,_i
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,125
	std z+0,R24
;       	                	   change_flag=0;
	clr R2
	sts _change_flag,R2
;       	                 	   i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
;       	                	   break;
;       	     		default:   break;
;       			}
;       		}
	xjmp L28
L27:
;       		else
;       	 	{
;       	 		recvBuff[i]=data;
	ldi R24,<_recvBuff
	ldi R25,>_recvBuff
	lds R30,_i
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R20
;       	 		i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
;       		}
L28:
L26:
;       	}
L24:
L22:
;  	return serial_recv_MSG;
	lds R16,_serial_recv_MSG
	lds R17,_serial_recv_MSG+1
L20:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.area bss(ram, con, rel)
_serial_recv_MSG::
	.blkb 2
_i::
	.blkb 1
_recvBuff::
	.blkb 128

⌨️ 快捷键说明

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