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

📄 uart.lis

📁 mega128平台下
💻 LIS
字号:
                        .module Uart.c
                        .area data(ram, con, rel)
 0000           _put_done::
 0000                   .blkb 1
                        .area idata
 0000 00                .byte 0
                        .area data(ram, con, rel)
 0001           _recv_done::
 0001                   .blkb 1
                        .area idata
 0001 00                .byte 0
                        .area data(ram, con, rel)
 0002           _newMSG::
 0002                   .blkb 1
                        .area idata
 0002 00                .byte 0
                        .area data(ram, con, rel)
 0003           _change_flag::
 0003                   .blkb 1
                        .area idata
 0003 00                .byte 0
                        .area data(ram, con, rel)
 0004           _serial_recv_flag::
 0004                   .blkb 1
                        .area idata
 0004 00                .byte 0
                        .area data(ram, con, rel)
                        .area vector(rom, abs)
                        .org 72
 0048 0C940000          jmp _uart0_rx_isr
                        .area data(ram, con, rel)
                        .area text(rom, con, rel)
                        .even
 0000           _uart0_rx_isr::
 0000 0E940000          xcall push_lset
 0004           ; #include<iom128v.h>
 0004           ; #include"comm.h"
 0004           ; //UART0接口
 0004           ; 
 0004           ; 
 0004           ; unsigned char put_done=0;
 0004           ; unsigned char recv_done=0;
 0004           ; unsigned char recvBuff[128]; 
 0004           ; unsigned char newMSG=0;
 0004           ; unsigned char i;
 0004           ; unsigned char *serial_recv_MSG;
 0004           ; unsigned char change_flag=0;
 0004           ; unsigned char serial_recv_flag=0;
 0004           ; extern int  uart_receive_CMD(Uart_CMD *command); 
 0004           ; 
 0004           ; #pragma interrupt_handler uart0_rx_isr:19
 0004           ; void uart0_rx_isr(void)
 0004           ; {
 0004           ;   recv_done=1;
 0004 81E0              ldi R24,1
 0006 80930100          sts _recv_done,R24
 000A           ;   serial_get();
 000A 37D0              xcall _serial_get
 000C           L4:
 000C 0E940000          xcall pop_lset
 0010                   .dbline 0 ; func end
 0010 1895              reti
                        .area vector(rom, abs)
                        .org 80
 0050 0C940900          jmp _uart0_tx_isr
                        .area text(rom, con, rel)
                        .even
 0012           _uart0_tx_isr::
 0012 8A93              st -y,R24
 0014 8FB7              in R24,0x3f
 0016 8A93              st -y,R24
 0018           ; }
 0018           ; 
 0018           ; 
 0018           ; #pragma interrupt_handler uart0_tx_isr:21
 0018           ; void uart0_tx_isr(void)
 0018           ; {
 0018           ;   put_done=1; 
 0018 81E0              ldi R24,1
 001A 80930000          sts _put_done,R24
 001E           L5:
 001E 8991              ld R24,y+
 0020 8FBF              out 0x3f,R24
 0022 8991              ld R24,y+
 0024                   .dbline 0 ; func end
 0024 1895              reti
 0026           ;           data -> R16
                        .even
 0026           _put::
 0026           ; }
 0026           ; 
 0026           ; 
 0026           ; //**********Put a single byte to the serial port. 
 0026           ; void put(unsigned char data) 
 0026           ; {
 0026           L7:
 0026           L8:
 0026           ;       while(!put_done)
 0026 20900000          lds R2,_put_done
 002A 2220              tst R2
 002C E1F3              breq L7
 002E           ;       ;
 002E           ;       UDR0=data;
 002E 0CB9              out 0xc,R16
 0030           ;       put_done=0;
 0030 2224              clr R2
 0032 20920000          sts _put_done,R2
 0036           L6:
 0036                   .dbline 0 ; func end
 0036 0895              ret
 0038           ;           data -> R16
                        .even
 0038           _get::
 0038           ;  }
 0038           ; 
 0038           ; 
 0038           ; //***********Receive a single byte from the serial port. 
 0038           ; unsigned char get() 
 0038           ; {
 0038           L11:
 0038           L12:
 0038           ;      unsigned char data;
 0038           ;      while(!recv_done)
 0038 20900100          lds R2,_recv_done
 003C 2220              tst R2
 003E E1F3              breq L11
 0040           ;       ;
 0040           ;      data=UDR0;
 0040 0CB1              in R16,0xc
 0042           ;      recv_done=0;
 0042 2224              clr R2
 0044 20920100          sts _recv_done,R2
 0048           ;      return data;
 0048           L10:
 0048                   .dbline 0 ; func end
 0048 0895              ret
 004A           ;         length -> R20
 004A           ;           data -> R12
 004A           ;              m -> R10
 004A           ;            len -> R10
 004A           ;     serial_MSG -> R22,R23
                        .even
 004A           _serial_put::
 004A 0E940000          xcall push_gset4
 004E A22E              mov R10,R18
 0050 B801              movw R22,R16
 0052           ; }
 0052           ; 
 0052           ;   
 0052           ; //**********Put a serial Frame to the serial port. 
 0052           ; void serial_put(unsigned char *serial_MSG,unsigned char len) 
 0052           ; {
 0052           ;   unsigned char m;
 0052           ;   unsigned char length;
 0052           ;   unsigned char data;
 0052           ;  // printf("u\n");
 0052           ;   put(0x7E);
 0052 0EE7              ldi R16,126
 0054 E8DF              xcall _put
 0056           ;   length=len;
 0056 4A2D              mov R20,R10
 0058           ;   
 0058           ;   for(m=0;m<length;m++)
 0058 AA24              clr R10
 005A 08C0              xjmp L18
 005C           L15:
 005C EA2D              mov R30,R10
 005E FF27              clr R31
 0060 E60F              add R30,R22
 0062 F71F              adc R31,R23
 0064 C080              ldd R12,z+0
 0066 0C2D              mov R16,R12
 0068 DEDF              xcall _put
 006A           L16:
 006A A394              inc R10
 006C           L18:
 006C A416              cp R10,R20
 006E B0F3              brlo L15
 0070           ;   {
 0070           ;     data=*(serial_MSG+m);
 0070           ;    /* if(data==0x7E)
 0070           ;     {
 0070           ;       put(0x7D);
 0070           ;       put(0x5E);      
 0070           ;     }
 0070           ;     else if(data==0x7D)
 0070           ;     {
 0070           ;       put(0x7D);
 0070           ;       put(0x5D);      
 0070           ;     }
 0070           ;     else
 0070           ;     */ 
 0070           ;         {
 0070           ;               put(data);
 0070           ;       }
 0070           ;    }
 0070           ;    put(0x7E);
 0070 0EE7              ldi R16,126
 0072 D9DF              xcall _put
 0074           L14:
 0074 0E940000          xcall pop_gset4
 0078                   .dbline 0 ; func end
 0078 0895              ret
 007A           ;        CMD_CRC -> <dead>
 007A           ;  uart_crc_high -> <dead>
 007A           ;   uart_crc_low -> <dead>
 007A           ;            CMD -> R22,R23
 007A           ;           data -> R20
                        .even
 007A           _serial_get::
 007A 0E940000          xcall push_gset2
 007E           ; }
 007E           ; 
 007E           ; //**********Receive a serial Frame from the serial port.
 007E           ; unsigned char *serial_get()
 007E           ; {   
 007E           ;     unsigned char data;   
 007E           ;       unsigned char uart_crc_low,uart_crc_high;
 007E           ;       unsigned short int CMD_CRC;
 007E           ;       Uart_CMD *CMD;  
 007E           ;       data=get();
 007E DCDF              xcall _get
 0080 402F              mov R20,R16
 0082           ;     
 0082           ;         if(data==0x7E&&newMSG==0)  //symbol for new msg
 0082 0E37              cpi R16,126
 0084 B9F4              brne L20
 0086 20900200          lds R2,_newMSG
 008A 2220              tst R2
 008C 99F4              brne L20
 008E           ;         {
 008E           ;                       i=0;
 008E 2224              clr R2
 0090 20920200          sts _i,R2
 0094           ;                       newMSG=1;
 0094 81E0              ldi R24,1
 0096 80930200          sts _newMSG,R24
 009A           ;               recvBuff[i]=data;
 009A 80E0              ldi R24,<_recvBuff
 009C 90E0              ldi R25,>_recvBuff
 009E E22D              mov R30,R2
 00A0 FF27              clr R31
 00A2 E80F              add R30,R24
 00A4 F91F              adc R31,R25
 00A6 4083              std z+0,R20
 00A8           ;               //serial_recv_MSG=&recvBuff[i];
 00A8           ;               i++;
 00A8 80910200          lds R24,_i
 00AC 8F5F              subi R24,255    ; addi 1
 00AE 80930200          sts _i,R24
 00B2           ;         }
 00B2 29C0              xjmp L21
 00B4           L20:
 00B4           ;     	else if(data==0x7E&&newMSG==1)
 00B4 4E37              cpi R20,126
 00B6 D1F4              brne L22
 00B8 80910200          lds R24,_newMSG
 00BC 8130              cpi R24,1
 00BE B1F4              brne L22
 00C0           ;               {
 00C0           ;                       newMSG=0;
 00C0 2224              clr R2
 00C2 20920200          sts _newMSG,R2
 00C6           ;                       recvBuff[i]=data;
 00C6 80E0              ldi R24,<_recvBuff
 00C8 90E0              ldi R25,>_recvBuff
 00CA E0910200          lds R30,_i
 00CE FF27              clr R31
 00D0 E80F              add R30,R24
 00D2 F91F              adc R31,R25
 00D4 4083              std z+0,R20
 00D6           ;                       i=0;
 00D6 20920200          sts _i,R2
 00DA           ;                       serial_recv_flag=1;  
 00DA 81E0              ldi R24,1
 00DC 80930400          sts _serial_recv_flag,R24
 00E0           ;                       //CMD = (Uart_CMD *)serial_recv_MSG;
 00E0           ;                       CMD = (Uart_CMD *)&recvBuff[0];
 00E0 60E0              ldi R22,<_recvBuff
 00E2 70E0              ldi R23,>_recvBuff
 00E4           ;                       //CMD_CRC = xcrc_calc(uart_rx_buffer, 1, 2);
 00E4           ;                       //if(CMD_CRC == CMD->CRC)
 00E4           ;                       //{
 00E4           ;                               uart_receive_CMD(CMD); //一条消息发送完毕,在处理完本条消息后需要被置零
 00E4 8B01              movw R16,R22
 00E6 0E940000          xcall _uart_receive_CMD
 00EA           ;                       //}                     
 00EA           ;         }
 00EA 0DC0              xjmp L23
 00EC           L22:
 00EC           ; 		else
 00EC           ;       	{
 00EC           ;       		
 00EC           ;       	 		recvBuff[i]=data;
 00EC 80E0              ldi R24,<_recvBuff
 00EE 90E0              ldi R25,>_recvBuff
 00F0 E0910200          lds R30,_i
 00F4 FF27              clr R31
 00F6 E80F              add R30,R24
 00F8 F91F              adc R31,R25
 00FA 4083              std z+0,R20
 00FC           ;                               i++;
 00FC 80910200          lds R24,_i
 0100 8F5F              subi R24,255    ; addi 1
 0102 80930200          sts _i,R24
 0106           ;                       
 0106           ;               }
 0106           L23:
 0106           L21:
 0106           ; 		
 0106           ;     	/*else
 0106           ;       	{
 0106           ;       		if(data==0x7D)
 0106           ;       		{
 0106           ;       	  		change_flag=1;
 0106           ;       	  	}
 0106           ;       		else if(change_flag==1)
 0106           ;       		{
 0106           ;       	 		switch(data)
 0106           ;       	  		{
 0106           ;       	     		case 0x5E: recvBuff[i]=0x7E;
 0106           ;       	                	   change_flag=0;
 0106           ;       	                	   i++;
 0106           ;       	                	   break;
 0106           ;       	     		case 0x5D: recvBuff[i]=0x7D;
 0106           ;       	                	   change_flag=0;
 0106           ;       	                 	   i++;
 0106           ;       	                	   break;
 0106           ;       	     		default:   break;
 0106           ;       			}
 0106           ;       		}
 0106           ;       		else
 0106           ;       	 	{
 0106           ;       	 		recvBuff[i]=data;
 0106           ;       	 		i++;
 0106           ;       		}
 0106           ; 			
 0106           ;       	}*/
 0106           ;  	return serial_recv_MSG;
 0106 00910000          lds R16,_serial_recv_MSG
 010A 10910100          lds R17,_serial_recv_MSG+1
 010E           L19:
 010E 0E940000          xcall pop_gset2
 0112                   .dbline 0 ; func end
 0112 0895              ret
                        .area bss(ram, con, rel)
 0000           _serial_recv_MSG::
 0000                   .blkb 2
 0002           _i::
 0002                   .blkb 1
 0003           _recvBuff::
 0003                   .blkb 128

⌨️ 快捷键说明

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