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

📄 usart1.lis

📁 Atmega64单片机程序(完整工程)
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module USART1.c
                        .area vector(rom, abs)
                        .org 120
 0078 0C940000          jmp _uart1_rx_isr
                        .area text(rom, con, rel)
                ;           data -> R16
                ;         status -> R18
                        .even
 0000           _uart1_rx_isr::
 0000 2A92              st -y,R2
 0002 0A93              st -y,R16
 0004 2A93              st -y,R18
 0006 8A93              st -y,R24
 0008 9A93              st -y,R25
 000A EA93              st -y,R30
 000C FA93              st -y,R31
 000E 2FB6              in R2,0x3f
 0010 2A92              st -y,R2
 0012           ; /*******************************************************************************
 0012           ; **--------------File Info-------------------------------------------------------
 0012           ; ** 文   件   名:     USART1.c
 0012           ; ** 最后修改日期:     2008-3-26
 0012           ; ** 版        本:     V1.0
 0012           ; ** 描        述:     M64串口一驱动                                                                                        header file
 0012           ; **------------------------------------------------------------------------------
 0012           ; ** Created by:             
 0012           ; ** Created date:     
 0012           ; **------------------------------------------------------------------------------
 0012           ; 
 0012           ; *******************************************************************************/
 0012           ; #include <USART1.h>
 0012           ; 
 0012           ; #if USART1_EN==1
 0012           ; 
 0012           ; INT8U rx_buffer1[RX_BUFFER_SIZE1];
 0012           ; #if RX_BUFFER_SIZE1<256
 0012           ;     INT8U rx_wr_index1,rx_rd_index1,rx_counter1;
 0012           ; #else
 0012           ;     INT16U rx_wr_index1,rx_rd_index1,rx_counter1;
 0012           ; #endif
 0012           ; INT8U rx_buffer_overflow1;
 0012           ; 
 0012           ; 
 0012           ; INT8U tx_buffer1[TX_BUFFER_SIZE1];
 0012           ; #if TX_BUFFER_SIZE1<256
 0012           ;     INT8U tx_wr_index1,tx_rd_index1,tx_counter1;
 0012           ; #else
 0012           ;     INT16U tx_wr_index1,tx_rd_index1,tx_counter1;
 0012           ; #endif
 0012           ; 
 0012           ; 
 0012           ; #pragma interrupt_handler uart1_rx_isr:31
 0012           ; void uart1_rx_isr(void)
 0012           ; {
 0012           ;     INT8U status,data;
 0012           ;     status=UCSR1A;
 0012 20919B00          lds R18,155
 0016           ;     data=UDR1;
 0016 00919C00          lds R16,156
 001A           ;     if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
 001A 822F              mov R24,R18
 001C 8C71              andi R24,28
 001E 09F5              brne L2
 0020           ;     {
 0020           ;         rx_buffer1[rx_wr_index1]=data;
 0020 80E0              ldi R24,<_rx_buffer1
 0022 90E0              ldi R25,>_rx_buffer1
 0024 E0910A00          lds R30,_rx_wr_index1
 0028 FF27              clr R31
 002A E80F              add R30,R24
 002C F91F              adc R31,R25
 002E 0083              std z+0,R16
 0030           ;         if (++rx_wr_index1 == RX_BUFFER_SIZE1)
 0030 80910A00          lds R24,_rx_wr_index1
 0034 8F5F              subi R24,255    ; addi 1
 0036 282E              mov R2,R24
 0038 20920A00          sts _rx_wr_index1,R2
 003C 8230              cpi R24,2
 003E 19F4              brne L4
 0040           ;           rx_wr_index1=0;
 0040 2224              clr R2
 0042 20920A00          sts _rx_wr_index1,R2
 0046           L4:
 0046           ;         if (++rx_counter1 == RX_BUFFER_SIZE1)
 0046 80910800          lds R24,_rx_counter1
 004A 8F5F              subi R24,255    ; addi 1
 004C 282E              mov R2,R24
 004E 20920800          sts _rx_counter1,R2
 0052 8230              cpi R24,2
 0054 31F4              brne L6
 0056           ;         {
 0056           ;             rx_counter1=0;
 0056 2224              clr R2
 0058 20920800          sts _rx_counter1,R2
 005C           ;             rx_buffer_overflow1=1;
 005C 81E0              ldi R24,1
 005E 80930700          sts _rx_buffer_overflow1,R24
 0062           ;         }
 0062           L6:
 0062           ;     }
 0062           L2:
 0062           L1:
 0062 2990              ld R2,y+
 0064 2FBE              out 0x3f,R2
 0066 F991              ld R31,y+
 0068 E991              ld R30,y+
 006A 9991              ld R25,y+
 006C 8991              ld R24,y+
 006E 2991              ld R18,y+
 0070 0991              ld R16,y+
 0072 2990              ld R2,y+
 0074                   .dbline 0 ; func end
 0074 1895              reti
                        .area vector(rom, abs)
                        .org 128
 0080 0C943B00          jmp _uart1_tx_isr
                        .area text(rom, con, rel)
                        .even
 0076           _uart1_tx_isr::
 0076 2A92              st -y,R2
 0078 8A93              st -y,R24
 007A 9A93              st -y,R25
 007C EA93              st -y,R30
 007E FA93              st -y,R31
 0080 2FB6              in R2,0x3f
 0082 2A92              st -y,R2
 0084           ; }
 0084           ; 
 0084           ; 
 0084           ; #pragma interrupt_handler uart1_tx_isr:33
 0084           ; void uart1_tx_isr(void)
 0084           ; {
 0084           ;     if (tx_counter1)
 0084 20900000          lds R2,_tx_counter1
 0088 2220              tst R2
 008A C9F0              breq L9
 008C           ;     {
 008C           ;         --tx_counter1;
 008C 822D              mov R24,R2
 008E 8150              subi R24,1
 0090 80930000          sts _tx_counter1,R24
 0094           ;         UDR1=tx_buffer1[tx_rd_index1];
 0094 80E0              ldi R24,<_tx_buffer1
 0096 90E0              ldi R25,>_tx_buffer1
 0098 E0910100          lds R30,_tx_rd_index1
 009C FF27              clr R31
 009E E80F              add R30,R24
 00A0 F91F              adc R31,R25
 00A2 2080              ldd R2,z+0
 00A4 20929C00          sts 156,R2
 00A8           ;         if (++tx_rd_index1 == TX_BUFFER_SIZE1)
 00A8 80910100          lds R24,_tx_rd_index1
 00AC 8F5F              subi R24,255    ; addi 1
 00AE 282E              mov R2,R24
 00B0 20920100          sts _tx_rd_index1,R2
 00B4 8430              cpi R24,4
 00B6 19F4              brne L11
 00B8           ;           tx_rd_index1=0;
 00B8 2224              clr R2
 00BA 20920100          sts _tx_rd_index1,R2
 00BE           L11:
 00BE           ;     }
 00BE           L9:
 00BE           L8:
 00BE 2990              ld R2,y+
 00C0 2FBE              out 0x3f,R2
 00C2 F991              ld R31,y+
 00C4 E991              ld R30,y+
 00C6 9991              ld R25,y+
 00C8 8991              ld R24,y+
 00CA 2990              ld R2,y+
 00CC                   .dbline 0 ; func end
 00CC 1895              reti
 00CE           ;              c -> R16
                        .even
 00CE           _putchar1::
 00CE           ; }
 00CE           ; 
 00CE           ; //#pragma used+
 00CE           ; void putchar1(INT8U c)
 00CE           ; {
 00CE           L14:
 00CE           L15:
 00CE           ;     while (tx_counter1 == TX_BUFFER_SIZE1);
 00CE 80910000          lds R24,_tx_counter1
 00D2 8430              cpi R24,4
 00D4 E1F3              breq L14
 00D6           ;     asm("cli");
 00D6 F894              cli
 00D8           ;     if (tx_counter1 || ((UCSR1A & DATA_REGISTER_EMPTY)==0))
 00D8 8823              tst R24
 00DA 21F4              brne L19
 00DC 20909B00          lds R2,155
 00E0 25FC              sbrc R2,5
 00E2 19C0              rjmp L17
 00E4           L19:
 00E4           ;     {
 00E4           ;         tx_buffer1[tx_wr_index1]=c;
 00E4 80E0              ldi R24,<_tx_buffer1
 00E6 90E0              ldi R25,>_tx_buffer1
 00E8 E0910200          lds R30,_tx_wr_index1
 00EC FF27              clr R31
 00EE E80F              add R30,R24
 00F0 F91F              adc R31,R25
 00F2 0083              std z+0,R16
 00F4           ;         if (++tx_wr_index1 == TX_BUFFER_SIZE1) 
 00F4 80910200          lds R24,_tx_wr_index1
 00F8 8F5F              subi R24,255    ; addi 1
 00FA 282E              mov R2,R24
 00FC 20920200          sts _tx_wr_index1,R2
 0100 8430              cpi R24,4
 0102 19F4              brne L20
 0104           ;           tx_wr_index1=0;
 0104 2224              clr R2
 0106 20920200          sts _tx_wr_index1,R2
 010A           L20:
 010A           ;         ++tx_counter1;
 010A 80910000          lds R24,_tx_counter1
 010E 8F5F              subi R24,255    ; addi 1
 0110 80930000          sts _tx_counter1,R24
 0114           ;     }
 0114 02C0              xjmp L18
 0116           L17:
 0116           ;     else
 0116           ;         UDR1=c;
 0116 00939C00          sts 156,R16
 011A           L18:
 011A           ;     asm("sei");
 011A 7894              sei
 011C           L13:
 011C                   .dbline 0 ; func end
 011C 0895              ret
 011E           ;           data -> R16
                        .even
 011E           _getchar1::
 011E           ; }
 011E           ; //#pragma used-
 011E           ; 
 011E           ; //#pragma used+
 011E           ; INT8U getchar1(void)
 011E           ; {
 011E           L23:
 011E           L24:
 011E           ;     INT8U data;
 011E           ;     
 011E           ;     while (rx_counter1==0);
 011E 20900800          lds R2,_rx_counter1
 0122 2220              tst R2
 0124 E1F3              breq L23
 0126           ;     data=rx_buffer1[rx_rd_index1];
 0126 80E0              ldi R24,<_rx_buffer1
 0128 90E0              ldi R25,>_rx_buffer1
 012A E0910900          lds R30,_rx_rd_index1
 012E FF27              clr R31
 0130 E80F              add R30,R24
 0132 F91F              adc R31,R25
 0134 0081              ldd R16,z+0
 0136           ;     if (++rx_rd_index1 == RX_BUFFER_SIZE1) 
 0136 80910900          lds R24,_rx_rd_index1
 013A 8F5F              subi R24,255    ; addi 1
 013C 282E              mov R2,R24
 013E 20920900          sts _rx_rd_index1,R2
 0142 8230              cpi R24,2
 0144 19F4              brne L26
 0146           ;         rx_rd_index1=0;
 0146 2224              clr R2
 0148 20920900          sts _rx_rd_index1,R2
 014C           L26:
 014C           ;     asm("cli");
 014C F894              cli
 014E           ;     --rx_counter1;
 014E 80910800          lds R24,_rx_counter1
 0152 8150              subi R24,1
 0154 80930800          sts _rx_counter1,R24
 0158           ;     asm("sei");
 0158 7894              sei
 015A           ;     return data;
 015A           L22:
 015A                   .dbline 0 ; func end
 015A 0895              ret
                        .even
 015C           _Uart1_Init::
 015C           ; }
 015C           ; //#pragma used-
 015C           ; 
 015C           ; void Uart1_Init(void)
 015C           ; { 
 015C           ; // USART1 initialization
 015C           ; // Communication Parameters: 8 Data, 1 Stop, No Parity
 015C           ; // USART1 Receiver: On
 015C           ; // USART1 Transmitter: On
 015C           ; // USART1 Mode: Asynchronous
 015C           ; // USART1 Baud rate: 38400  16M osc
 015C           ;     UCSR1A=0x00;
 015C 2224              clr R2
 015E 20929B00          sts 155,R2
 0162           ;     UCSR1B=0xD8;
 0162 88ED              ldi R24,216
 0164 80939A00          sts 154,R24
 0168           ;     UCSR1C=0x06;
 0168 86E0              ldi R24,6
 016A 80939D00          sts 157,R24
 016E           ;     
 016E           ;     UBRR1H=0x00;
 016E 20929800          sts 152,R2
 0172           ;     UBRR1L=0x19;
 0172 89E1              ldi R24,25
 0174 80939900          sts 153,R24
 0178           L28:
 0178                   .dbline 0 ; func end
 0178 0895              ret
 017A           ;             pt -> R20,R21
                        .even
 017A           _Uart1_SendString::
 017A 0E940000          xcall push_gset1
 017E A801              movw R20,R16
 0180           ; }
 0180           ; 
 0180           ; void Uart1_SendString(INT8U *pt)
 0180           ; {
 0180 04C0              xjmp L31
 0182           L30:
 0182 FA01              movw R30,R20
 0184 0191              ld R16,Z+
 0186 AF01              movw R20,R30
 0188 A2DF              xcall _putchar1
 018A           L31:
 018A           ;     while(*pt)
 018A FA01              movw R30,R20
 018C 2080              ldd R2,z+0
 018E 2220              tst R2
 0190 C1F7              brne L30
 0192           L29:
 0192 0E940000          xcall pop_gset1
 0196                   .dbline 0 ; func end
 0196 0895              ret
 0198           ;          temp2 -> R20
 0198           ;          temp1 -> R22
 0198           ;            Hex -> R20
                        .even
 0198           _PUT_INT8U_HexTOString::
 0198 0E940000          xcall push_gset2
 019C 402F              mov R20,R16
 019E           ;     {
 019E           ;         putchar1(*pt++);
 019E           ;     }
 019E           ; }
 019E           ; 
 019E           ; 
 019E           ; //格式转换函数,十六进制转换为字符串  eg:输入0x5A,输出5A  
 019E           ; void PUT_INT8U_HexTOString(INT8U Hex)
 019E           ; {
 019E           ;     INT8U temp1,temp2;
 019E           ;     
 019E           ;     temp1=(Hex>>4)&0x0F;
 019E 642F              mov R22,R20
 01A0 6295              swap R22
 01A2 6F70              andi R22,#0x0F
 01A4 6F70              andi R22,15
 01A6           ;     temp2=Hex&0x0F;
 01A6 4F70              andi R20,15
 01A8           ;     
 01A8           ;     if(temp1<10)
 01A8 6A30              cpi R22,10
 01AA 20F4              brsh L34

⌨️ 快捷键说明

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