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

📄 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>
; #include"comm.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;
; extern int  uart_receive_CMD(Uart_CMD *command); 
; 
; #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
L4:
	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
L5:
	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) 
; {
L7:
L8:
;       while(!put_done)
	lds R2,_put_done
	tst R2
	breq L7
;       ;
;       UDR0=data;
	out 0xc,R16
;       put_done=0;
	clr R2
	sts _put_done,R2
L6:
	.dbline 0 ; func end
	ret
;           data -> R16
	.even
_get::
;  }
; 
; 
; //***********Receive a single byte from the serial port. 
; unsigned char get() 
; {
L11:
L12:
;      unsigned char data;
;      while(!recv_done)
	lds R2,_recv_done
	tst R2
	breq L11
;       ;
;      data=UDR0;
	in R16,0xc
;      recv_done=0;
	clr R2
	sts _recv_done,R2
;      return data;
L10:
	.dbline 0 ; func end
	ret
;         length -> R20
;           data -> R12
;              m -> R10
;            len -> R10
;     serial_MSG -> R22,R23
	.even
_serial_put::
	xcall push_gset4
	mov R10,R18
	movw R22,R16
; }
; 
;   
; //**********Put a serial Frame to the serial port. 
; void serial_put(unsigned char *serial_MSG,unsigned char len) 
; {
;   unsigned char m;
;   unsigned char length;
;   unsigned char data;
;  // printf("u\n");
;   put(0x7E);
	ldi R16,126
	xcall _put
;   length=len;
	mov R20,R10
;   
;   for(m=0;m<length;m++)
	clr R10
	xjmp L18
L15:
	mov R30,R10
	clr R31
	add R30,R22
	adc R31,R23
	ldd R12,z+0
	mov R16,R12
	xcall _put
L16:
	inc R10
L18:
	cp R10,R20
	brlo L15
;   {
;     data=*(serial_MSG+m);
;    /* if(data==0x7E)
;     {
;       put(0x7D);
;       put(0x5E);	
;     }
;     else if(data==0x7D)
;     {
;       put(0x7D);
;       put(0x5D);	
;     }
;     else
;     */ 
; 	  {
;       	put(data);
;       }
;    }
;    put(0x7E);
	ldi R16,126
	xcall _put
L14:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
;        CMD_CRC -> <dead>
;  uart_crc_high -> <dead>
;   uart_crc_low -> <dead>
;            CMD -> R22,R23
;           data -> R20
	.even
_serial_get::
	xcall push_gset2
; }
; 
; //**********Receive a serial Frame from the serial port.
; unsigned char *serial_get()
; {   
;     unsigned char data;   
; 	unsigned char uart_crc_low,uart_crc_high;
; 	unsigned short int CMD_CRC;
; 	Uart_CMD *CMD;	
; 	data=get();
	xcall _get
	mov R20,R16
;     
;         if(data==0x7E&&newMSG==0)  //symbol for new msg
	cpi R16,126
	brne L20
	lds R2,_newMSG
	tst R2
	brne L20
;         {
;       		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];
;         	i++;
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
;         }
	xjmp L21
L20:
;     	else if(data==0x7E&&newMSG==1)
	cpi R20,126
	brne L22
	lds R24,_newMSG
	cpi R24,1
	brne L22
;       	{
;       		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
;       		//CMD = (Uart_CMD *)serial_recv_MSG;
; 			CMD = (Uart_CMD *)&recvBuff[0];
	ldi R22,<_recvBuff
	ldi R23,>_recvBuff
;       		//CMD_CRC = xcrc_calc(uart_rx_buffer, 1, 2);
;       		//if(CMD_CRC == CMD->CRC)
;       		//{
;       			uart_receive_CMD(CMD); //一条消息发送完毕,在处理完本条消息后需要被置零
	movw R16,R22
	xcall _uart_receive_CMD
;       		//}      		
;         }
	xjmp L23
L22:
; 		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
; 			
;       	}
L23:
L21:
; 		
;     	/*else
;       	{
;       		if(data==0x7D)
;       		{
;       	  		change_flag=1;
;       	  	}
;       		else if(change_flag==1)
;       		{
;       	 		switch(data)
;       	  		{
;       	     		case 0x5E: recvBuff[i]=0x7E;
;       	                	   change_flag=0;
;       	                	   i++;
;       	                	   break;
;       	     		case 0x5D: recvBuff[i]=0x7D;
;       	                	   change_flag=0;
;       	                 	   i++;
;       	                	   break;
;       	     		default:   break;
;       			}
;       		}
;       		else
;       	 	{
;       	 		recvBuff[i]=data;
;       	 		i++;
;       		}
; 			
;       	}*/
;  	return serial_recv_MSG;
	lds R16,_serial_recv_MSG
	lds R17,_serial_recv_MSG+1
L19:
	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 + -