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

📄 avrsms_com.s90

📁 SMS傳送Sourcode,compiler with C,AT command
💻 S90
📖 第 1 页 / 共 3 页
字号:
        CFI Block cfiBlock2 Using cfiCommon0
        CFI Function COM_rx_on
//   70 {
//   71   UCSR0B |= ( 1 << RXCIE0 );                // Enable RX interrupt
        SBI	0x0A, 0x07
//   72 }
        RET
        CFI EndBlock cfiBlock2
//   73 
//   74 

        RSEG CODE:CODE:NOROOT(1)
//   75 void COM_rx_off( void )
COM_rx_off:
        CFI Block cfiBlock3 Using cfiCommon0
        CFI Function COM_rx_off
//   76 {
//   77   UCSR0B &= ~( 1 << RXCIE0 );               // Disable RX interrupt
        CBI	0x0A, 0x07
//   78 }
        RET
        CFI EndBlock cfiBlock3
//   79 
//   80 

        RSEG CODE:CODE:NOROOT(1)
//   81 void COM_setSearchString( unsigned char Response )
COM_setSearchString:
        CFI Block cfiBlock4 Using cfiCommon0
        CFI Function COM_setSearchString
//   82 {
//   83   UCSR0B &= ~( 1 << RXCIE0 );               // Disable RX interrupt
        CBI	0x0A, 0x07
//   84   searchFor = searchStrings[Response];  //Set desired search dtring
        MOV	R18, R16
        LDI	R19, 0
        LSL	R18
        ROL	R19
        MOVW	R31:R30, R19:R18
        SUBI	R30, LOW((-(searchStrings) & 0xFFFF))
        SBCI	R31, (-(searchStrings) & 0xFFFF) >> 8
        LD	R18, Z
        LDD	R19, Z+1
        LDI	R30, LOW(searchFor)
        LDI	R31, (searchFor) >> 8
        ST	Z, R18
        STD	Z+1, R19
//   85   searchStr = Response;                 //Used in rx_isr
        STS	??searchStr, R16
//   86   rx_i = 0;
        LDI	R16, 0
        LDI	R17, 0
        LDI	R30, LOW(??rx_i)
        LDI	R31, (??rx_i) >> 8
        ST	Z, R16
        STD	Z+1, R17
//   87 }
        RET
        CFI EndBlock cfiBlock4
//   88 
//   89 
//   90                         // Interrupt handler
//   91 
//   92 /*! \brief USART Receive interrupt service routine
//   93  *
//   94  */
//   95 /*
//   96 #pragma vector=USART0_RXC_vect
//   97 __interrupt void USART0_RX_interrupt( void )
//   98 {
//   99   unsigned char data;             //Local variable
//  100 
//  101   data = UDR0;                    //Always read something
//  102 
//  103   rx_buffer[ rx_wr_i++ ] = data;  //Store new data
//  104   rx_buffer[ rx_wr_i ] = '\0';    //Always terminate string!
//  105 
//  106   if( rx_wr_i > RX_BUFFER_MASK )  //Check for overflow
//  107   {
//  108     rx_wr_i = 0;                  //Reset write index
//  109     rx_overflow = 1;              //Set flag high
//  110     UCSR0B &= ~( 1 << RXCIE0 );       // Disable RX interrupt
//  111   }
//  112 
//  113   if( searchFor[rx_i] == data )   //Test response match
//  114   {
//  115     rx_i++;
//  116 
//  117     if( !searchFor[rx_i] )        //End of new_message string...received new message!
//  118     {
//  119       rx_i = 0;
//  120       rx_ack = 1;                  //Set new message flag
//  121       UCSR0B &= ~( 1 << RXCIE0 );     // Disable RX interrupt
//  122     }
//  123    }
//  124   else
//  125   {
//  126     rx_i = 0;                //Not valid search pattern...start again.
//  127   }
//  128 }//end rx-isr
//  129 */
//  130 #pragma vector=USART0_RXC_vect

        RSEG CODE:CODE:NOROOT(1)
//  131 __interrupt void USART0_RX_interrupt( void )
USART0_RX_interrupt:
        CFI Block cfiBlock5 Using cfiCommon1
        CFI Function USART0_RX_interrupt
//  132 {
        ST	-Y, R27
        CFI R27 Frame(CFA_Y, -1)
        CFI CFA_Y Y+1
        ST	-Y, R26
        CFI R26 Frame(CFA_Y, -2)
        CFI CFA_Y Y+2
        ST	-Y, R31
        CFI R31 Frame(CFA_Y, -3)
        CFI CFA_Y Y+3
        ST	-Y, R30
        CFI R30 Frame(CFA_Y, -4)
        CFI CFA_Y Y+4
        ST	-Y, R21
        CFI R21 Frame(CFA_Y, -5)
        CFI CFA_Y Y+5
        ST	-Y, R20
        CFI R20 Frame(CFA_Y, -6)
        CFI CFA_Y Y+6
        ST	-Y, R19
        CFI R19 Frame(CFA_Y, -7)
        CFI CFA_Y Y+7
        ST	-Y, R18
        CFI R18 Frame(CFA_Y, -8)
        CFI CFA_Y Y+8
        ST	-Y, R17
        CFI R17 Frame(CFA_Y, -9)
        CFI CFA_Y Y+9
        ST	-Y, R16
        CFI R16 Frame(CFA_Y, -10)
        CFI CFA_Y Y+10
        IN	R20, 0x3F
        IN	R21, 0x3B
//  133   unsigned char data;             //Local variable
//  134 
//  135   data = UDR0;                    //Always read something
        IN	R18, 0x0C
//  136 
//  137   rx_buffer[ rx_wr_i++ ] = data;  //Store new data
        LDI	R30, LOW(??rx_wr_i)
        LDI	R31, (??rx_wr_i) >> 8
        LD	R16, Z
        LDD	R17, Z+1
        MOVW	R31:R30, R17:R16
        SUBI	R30, LOW((-(??rx_buffer) & 0xFFFF))
        SBCI	R31, (-(??rx_buffer) & 0xFFFF) >> 8
        ST	Z, R18
        LDI	R30, LOW(??rx_wr_i)
        LDI	R31, (??rx_wr_i) >> 8
        LD	R16, Z
        LDD	R17, Z+1
        SUBI	R16, 255
        SBCI	R17, 255
        ST	Z, R16
        STD	Z+1, R17
//  138   //rx_buffer[ rx_wr_i ] = '\0';    //Always terminate string!
//  139 
//  140   if( rx_wr_i > RX_BUFFER_MASK )  //Check for overflow
        LDI	R30, LOW(??rx_wr_i)
        LDI	R31, (??rx_wr_i) >> 8
        LD	R16, Z
        LDD	R17, Z+1
        CPI	R16, 255
        LDI	R19, 0
        CPC	R17, R19
        BRLT	??USART0_RX_interrupt_0
//  141   {
//  142     rx_wr_i = 0;                  //Reset write index
        LDI	R16, 0
        LDI	R17, 0
        LDI	R30, LOW(??rx_wr_i)
        LDI	R31, (??rx_wr_i) >> 8
        ST	Z, R16
        STD	Z+1, R17
//  143     rx_overflow = 1;              //Set flag high
        LDI	R16, 1
        LDI	R17, 0
        LDI	R30, LOW(rx_overflow)
        LDI	R31, (rx_overflow) >> 8
        ST	Z, R16
        STD	Z+1, R17
//  144     UCSR0B &= ~( 1 << RXCIE0 );       // Disable RX interrupt
        CBI	0x0A, 0x07
//  145   }
//  146 
//  147   if( searchFor[rx_i] == data )   //Test response match
??USART0_RX_interrupt_0:
        LDI	R26, LOW(searchFor)
        LDI	R27, (searchFor) >> 8
        LD	R30, X+
        LD	R31, X
        LDI	R26, LOW(??rx_i)
        LDI	R27, (??rx_i) >> 8
        LD	R16, X+
        LD	R17, X
        ADD	R30, R16
        ADC	R31, R17
        LPM	R16, Z
        CP	R16, R18
        BRNE	??USART0_RX_interrupt_1
//  148   {
//  149     rx_i++;
        LDI	R30, LOW(??rx_i)
        LDI	R31, (??rx_i) >> 8
        LD	R16, Z
        LDD	R17, Z+1
        SUBI	R16, 255
        SBCI	R17, 255
        ST	Z, R16
        STD	Z+1, R17
//  150 
//  151     if( !searchFor[rx_i] )        //End of new_message string...received new message!
        LDI	R26, LOW(searchFor)
        LDI	R27, (searchFor) >> 8
        LD	R30, X+
        LD	R31, X
        LDI	R26, LOW(??rx_i)
        LDI	R27, (??rx_i) >> 8
        LD	R16, X+
        LD	R17, X
        ADD	R30, R16
        ADC	R31, R17
        LPM	R16, Z
        TST	R16
        BRNE	??USART0_RX_interrupt_2
//  152     {
//  153       rx_i = 0;
        LDI	R16, 0
        LDI	R17, 0
        LDI	R30, LOW(??rx_i)
        LDI	R31, (??rx_i) >> 8
        ST	Z, R16
        STD	Z+1, R17
//  154 
//  155       if( searchStr == 1 )  //+CMTI:
        LDS	R16, ??searchStr
        CPI	R16, 1
        BRNE	??USART0_RX_interrupt_3
//  156       {
//  157         searchFor = searchStrings[3]; //Wait for
        LDI	R30, LOW(searchStrings)
        LDI	R31, (searchStrings) >> 8
        LDD	R16, Z+6
        LDD	R17, Z+7
        LDI	R30, LOW(searchFor)
        LDI	R31, (searchFor) >> 8
        ST	Z, R16
        STD	Z+1, R17
//  158         searchStr = 3;
        LDI	R16, 3
        STS	??searchStr, R16
        RJMP	??USART0_RX_interrupt_2
//  159       }
//  160 
//  161       else  //Normal acknowledgement
//  162       {
//  163         rx_ack = 1;                  //Set new message flag
??USART0_RX_interrupt_3:
        LDI	R16, 1
        LDI	R17, 0
        LDI	R30, LOW(rx_ack)
        LDI	R31, (rx_ack) >> 8
        ST	Z, R16
        STD	Z+1, R17
//  164         UCSR0B &= ~( 1 << RXCIE0 );     // Disable RX interrupt
        CBI	0x0A, 0x07
        RJMP	??USART0_RX_interrupt_2
//  165       }
//  166     }
//  167    }
//  168   else
//  169   {
//  170     rx_i = 0;                //Not valid search pattern...start again.
??USART0_RX_interrupt_1:
        LDI	R16, 0
        LDI	R17, 0
        LDI	R30, LOW(??rx_i)
        LDI	R31, (??rx_i) >> 8
        ST	Z, R16
        STD	Z+1, R17
//  171   }
//  172 }//end rx-isr
??USART0_RX_interrupt_2:
        OUT	0x3B, R21
        OUT	0x3F, R20
        LD	R16, Y+
        CFI R16 SameValue
        CFI CFA_Y Y+9
        LD	R17, Y+
        CFI R17 SameValue
        CFI CFA_Y Y+8
        LD	R18, Y+
        CFI R18 SameValue
        CFI CFA_Y Y+7
        LD	R19, Y+
        CFI R19 SameValue
        CFI CFA_Y Y+6
        LD	R20, Y+
        CFI R20 SameValue
        CFI CFA_Y Y+5
        LD	R21, Y+
        CFI R21 SameValue
        CFI CFA_Y Y+4
        LD	R30, Y+
        CFI R30 SameValue
        CFI CFA_Y Y+3
        LD	R31, Y+
        CFI R31 SameValue
        CFI CFA_Y Y+2
        LD	R26, Y+
        CFI R26 SameValue
        CFI CFA_Y Y+1
        LD	R27, Y+
        CFI R27 SameValue
        CFI CFA_Y Y+0
        RETI
        CFI EndBlock cfiBlock5
//  173 
//  174 
//  175 /*! \brief Adapted putchar method...we dont need interrup driven tx-isr.
//  176  *
//  177  *  Adpation of normal ansi c putchar() method
//  178  *
//  179  *  \param    input     Character data we wish to send
//  180  *
//  181  *  \retval             void
//  182  *
//  183  */

        RSEG CODE:CODE:NOROOT(1)
//  184 int COM_putchar( unsigned char data )
COM_putchar:
        CFI Block cfiBlock6 Using cfiCommon0
        CFI Function COM_putchar
//  185 {
//  186   static unsigned int i;
//  187 
//  188   for( i = 0; !( UCSR0A & ( 1 << UDRE0 ) ); i++ )    // Wait for empty transmit buffer
        LDI	R18, 0
        LDI	R19, 0
        LDI	R30, LOW(??i)
        LDI	R31, (??i) >> 8
        ST	Z, R18
        STD	Z+1, R19
        RJMP	??COM_putchar_0
??COM_putchar_1:
        LDI	R30, LOW(??i)
        LDI	R31, (??i) >> 8
        LD	R18, Z
        LDD	R19, Z+1
        SUBI	R18, 255
        SBCI	R19, 255
        ST	Z, R18
        STD	Z+1, R19
??COM_putchar_0:
        SBIC	0x0B, 0x05
        RJMP	??COM_putchar_2
//  189   {
//  190     if( i > RX_WAIT )  //How long one should wait
        LDI	R30, LOW(??i)
        LDI	R31, (??i) >> 8
        LD	R18, Z
        LDD	R19, Z+1
        CPI	R18, 233
        LDI	R17, 253
        CPC	R19, R17
        BRCS	??COM_putchar_1
//  191     {
//  192       return -1;  //Give feedback to function caller
        LDI	R16, 255
        LDI	R17, 255
        RET
//  193     }
//  194   }
//  195 
//  196     UDR0 = data;                        // Start transmittion 	
??COM_putchar_2:
        OUT	0x0C, R16
//  197 
//  198   return (int)data;
        LDI	R17, 0
        RET
        CFI EndBlock cfiBlock6
//  199 }//end COM_putchar

        RSEG NEAR_Z:DATA:NOROOT(0)
        REQUIRE `?<Segment init: NEAR_Z>`
??i:
        DS 2
//  200 
//  201 
//  202 

⌨️ 快捷键说明

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