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

📄 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           ; //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           ; 
 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 47D0              xcall _serial_get
 000C           L1:
 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           L2:
 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           L4:
 0026           L5:
 0026           ;       while(!put_done)
 0026 20900000          lds R2,_put_done
 002A 2220              tst R2
 002C E1F3              breq L4
 002E           ;       ;
 002E           ;       UDR0=data;
 002E 0CB9              out 0xc,R16
 0030           ;       put_done=0;
 0030 2224              clr R2
 0032 20920000          sts _put_done,R2
 0036           L3:
 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           L8:
 0038           L9:
 0038           ;      unsigned char data;
 0038           ;      while(!recv_done)
 0038 20900100          lds R2,_recv_done
 003C 2220              tst R2
 003E E1F3              breq L8
 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           L7:
 0048                   .dbline 0 ; func end
 0048 0895              ret
 004A           ;         length -> R20
 004A           ;              m -> R22
 004A           ;           data -> R12
 004A           ;     serial_MSG -> R10,R11
                        .even
 004A           _serial_put::
 004A 0E940000          xcall push_gset4
 004E 5801              movw R10,R16
 0050           ; }
 0050           ; 
 0050           ;   
 0050           ; //**********Put a serial Frame to the serial port. 
 0050           ; void serial_put(unsigned char *serial_MSG) 
 0050           ; {
 0050           ;   unsigned char m;
 0050           ;   unsigned char length;
 0050           ;   unsigned char data;
 0050           ;   put(0x7E);
 0050 0EE7              ldi R16,126
 0052 E9DF              xcall _put
 0054           ;   serial_MSG++;
 0054 C501              movw R24,R10
 0056 0196              adiw R24,1
 0058 5C01              movw R10,R24
 005A           ;   length=*serial_MSG;
 005A FC01              movw R30,R24
 005C 4081              ldd R20,z+0
 005E           ;   
 005E           ;   for(m=0;m<length;m++)
 005E 6627              clr R22
 0060 15C0              xjmp L15
 0062           L12:
 0062           ;   {
 0062           ;     data=*serial_MSG;
 0062 F501              movw R30,R10
 0064 C080              ldd R12,z+0
 0066           ;     if(data==0x7E)
 0066 8C2D              mov R24,R12
 0068 8E37              cpi R24,126
 006A 29F4              brne L16
 006C           ;     {
 006C           ;       put(0x7D);
 006C 0DE7              ldi R16,125
 006E DBDF              xcall _put
 0070           ;       put(0x5E);      
 0070 0EE5              ldi R16,94
 0072 D9DF              xcall _put
 0074           ;     }
 0074 0AC0              xjmp L17
 0076           L16:
 0076           ;     else if(data==0x7D)
 0076 8C2D              mov R24,R12
 0078 8D37              cpi R24,125
 007A 29F4              brne L18
 007C           ;     {
 007C           ;       put(0x7D);
 007C 0DE7              ldi R16,125
 007E D3DF              xcall _put
 0080           ;       put(0x5D);      
 0080 0DE5              ldi R16,93
 0082 D1DF              xcall _put
 0084           ;     }
 0084 02C0              xjmp L19
 0086           L18:
 0086           ;     else
 0086           ;       {
 0086           ;       	put(data);
 0086 0C2D              mov R16,R12
 0088 CEDF              xcall _put
 008A           ;               }
 008A           L19:
 008A           L17:
 008A           L13:
 008A 6395              inc R22
 008C           L15:
 008C 6417              cp R22,R20
 008E 48F3              brlo L12
 0090           ;    }
 0090           ;    put(0x7E);
 0090 0EE7              ldi R16,126
 0092 C9DF              xcall _put
 0094           L11:
 0094 0E940000          xcall pop_gset4
 0098                   .dbline 0 ; func end
 0098 0895              ret
 009A           ;           data -> R20
                        .even
 009A           _serial_get::
 009A 0E940000          xcall push_gset2
 009E           ; }
 009E           ; 
 009E           ; //**********Receive a serial Frame from the serial port.
 009E           ; unsigned char *serial_get()
 009E           ; {
 009E           ;         unsigned char data;
 009E           ;       data=get();
 009E CCDF              xcall _get
 00A0 402F              mov R20,R16
 00A2           ;     
 00A2           ;         if(data==0x7E&&newMSG==0)  //symbol for new msg
 00A2 0E37              cpi R16,126
 00A4 01F5              brne L21
 00A6 20900200          lds R2,_newMSG
 00AA 2220              tst R2
 00AC E1F4              brne L21
 00AE           ;         {
 00AE           ;                       i=0;
 00AE 2224              clr R2
 00B0 20920200          sts _i,R2
 00B4           ;                       newMSG=1;
 00B4 81E0              ldi R24,1
 00B6 80930200          sts _newMSG,R24
 00BA           ;               recvBuff[i]=data;
 00BA 80E0              ldi R24,<_recvBuff
 00BC 90E0              ldi R25,>_recvBuff
 00BE E22D              mov R30,R2
 00C0 FF27              clr R31
 00C2 E80F              add R30,R24
 00C4 F91F              adc R31,R25
 00C6 4083              std z+0,R20
 00C8           ;               serial_recv_MSG=&recvBuff[i];
 00C8 20900200          lds R2,_i
 00CC 3324              clr R3
 00CE 280E              add R2,R24
 00D0 391E              adc R3,R25
 00D2 30920100          sts _serial_recv_MSG+1,R3
 00D6 20920000          sts _serial_recv_MSG,R2
 00DA           ;               i++;
 00DA 80910200          lds R24,_i
 00DE 8F5F              subi R24,255    ; addi 1
 00E0 80930200          sts _i,R24
 00E4           ;         }
 00E4 5DC0              xjmp L22
 00E6           L21:
 00E6           ;     	else if(data==0x7E&&newMSG==1)
 00E6 4E37              cpi R20,126
 00E8 A9F4              brne L23
 00EA 80910200          lds R24,_newMSG
 00EE 8130              cpi R24,1
 00F0 89F4              brne L23
 00F2           ;               {
 00F2           ;                       newMSG=0;
 00F2 2224              clr R2
 00F4 20920200          sts _newMSG,R2
 00F8           ;                       recvBuff[i]=data;
 00F8 80E0              ldi R24,<_recvBuff
 00FA 90E0              ldi R25,>_recvBuff
 00FC E0910200          lds R30,_i
 0100 FF27              clr R31
 0102 E80F              add R30,R24
 0104 F91F              adc R31,R25
 0106 4083              std z+0,R20
 0108           ;                       i=0;
 0108 20920200          sts _i,R2
 010C           ;                       serial_recv_flag=1;   //一条消息发送完毕,在处理完本条消息后需要被置零
 010C 81E0              ldi R24,1
 010E 80930400          sts _serial_recv_flag,R24
 0112           ;         }
 0112 46C0              xjmp L24
 0114           L23:
 0114           ;     	else
 0114           ;       	{
 0114           ;       		if(data==0x7D)
 0114 4D37              cpi R20,125
 0116 21F4              brne L25
 0118           ;                       {
 0118           ;                               change_flag=1;
 0118 81E0              ldi R24,1
 011A 80930300          sts _change_flag,R24
 011E           ;                       }
 011E 40C0              xjmp L26
 0120           L25:
 0120           ;       		else if(change_flag==1)
 0120 80910300          lds R24,_change_flag
 0124 8130              cpi R24,1
 0126 79F5              brne L27
 0128           ;                       {
 0128           ;                               switch(data)
 0128 642F              mov R22,R20
 012A 7727              clr R23
 012C 6D35              cpi R22,93
 012E E0E0              ldi R30,0
 0130 7E07              cpc R23,R30
 0132 B9F0              breq L33
 0134 6E35              cpi R22,94
 0136 E0E0              ldi R30,0
 0138 7E07              cpc R23,R30
 013A 09F0              breq L32
 013C 31C0              xjmp L28
 013E           X0:
 013E           ;       	  		{
 013E           L32:
 013E           ;       	     		case 0x5E: recvBuff[i]=0x7E;
 013E 80E0              ldi R24,<_recvBuff
 0140 90E0              ldi R25,>_recvBuff
 0142 E0910200          lds R30,_i
 0146 FF27              clr R31
 0148 E80F              add R30,R24
 014A F91F              adc R31,R25
 014C 8EE7              ldi R24,126
 014E 8083              std z+0,R24
 0150           ;                                          change_flag=0;
 0150 2224              clr R2
 0152 20920300          sts _change_flag,R2
 0156           ;                                          i++;
 0156 80910200          lds R24,_i
 015A 8F5F              subi R24,255    ; addi 1
 015C 80930200          sts _i,R24
 0160           ;                                          break;
 0160 1FC0              xjmp L28
 0162           L33:
 0162           ;       	     		case 0x5D: recvBuff[i]=0x7D;
 0162 80E0              ldi R24,<_recvBuff
 0164 90E0              ldi R25,>_recvBuff
 0166 E0910200          lds R30,_i
 016A FF27              clr R31
 016C E80F              add R30,R24
 016E F91F              adc R31,R25
 0170 8DE7              ldi R24,125
 0172 8083              std z+0,R24
 0174           ;                                          change_flag=0;
 0174 2224              clr R2
 0176 20920300          sts _change_flag,R2
 017A           ;                                          i++;
 017A 80910200          lds R24,_i
 017E 8F5F              subi R24,255    ; addi 1
 0180 80930200          sts _i,R24
 0184           ;                                          break;
 0184           ;                               default:   break;
 0184           ;                               }
 0184           ;                       }
 0184 0DC0              xjmp L28
 0186           L27:
 0186           ;       		else
 0186           ;       	 	{
 0186           ;       	 		recvBuff[i]=data;
 0186 80E0              ldi R24,<_recvBuff
 0188 90E0              ldi R25,>_recvBuff
 018A E0910200          lds R30,_i
 018E FF27              clr R31
 0190 E80F              add R30,R24
 0192 F91F              adc R31,R25
 0194 4083              std z+0,R20
 0196           ;                               i++;
 0196 80910200          lds R24,_i
 019A 8F5F              subi R24,255    ; addi 1
 019C 80930200          sts _i,R24
 01A0           ;                       }
 01A0           L28:
 01A0           L26:
 01A0           ;       	}
 01A0           L24:
 01A0           L22:
 01A0           ;  	return serial_recv_MSG;
 01A0 00910000          lds R16,_serial_recv_MSG
 01A4 10910100          lds R17,_serial_recv_MSG+1
 01A8           L20:
 01A8 0E940000          xcall pop_gset2
 01AC                   .dbline 0 ; func end
 01AC 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 + -