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

📄 spi_test_slave.lis

📁 用ICC编写的程序包括SPI
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module Spi_test_slave.c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\IccAvr_Pro\Spi_test_slave.c
                        .area vector(rom, abs)
                        .org 68
 0044 0C940000          jmp _spi_stc_isr
                        .area text(rom, con, rel)
 0000                   .dbfunc e spi_stc_isr _spi_stc_isr fV
                        .even
 0000           _spi_stc_isr::
 0000 2A92              st -y,R2
 0002 8A93              st -y,R24
 0004 9A93              st -y,R25
 0006 EA93              st -y,R30
 0008 FA93              st -y,R31
 000A 2FB6              in R2,0x3f
 000C 2A92              st -y,R2
 000E                   .dbline -1
 000E                   .dbline 16
 000E           ; #include <iom16v.h>
 000E           ; #include <macros.h>
 000E           ; #define SIZE 100  
 000E           ; #define MOSI    PORTB5
 000E           ; #define MISO    PINB6
 000E           ; #define       SCK               PORTB7
 000E           ; #define       SS                PORTB4
 000E           ; 
 000E           ; unsigned char SPI_rx_buff[SIZE];  
 000E           ; unsigned char SPI_tx_buff[SIZE];  
 000E           ; unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;  
 000E           ; unsigned char tx_wr_index,tx_rd_index,tx_counter,SPI_ok,SPI_datain;  
 000E           ; 
 000E           ; #pragma interrupt_handler spi_stc_isr:18  
 000E           ; void spi_stc_isr(void)  
 000E           ; {  
 000E                   .dbline 17
 000E           ;   SPI_rx_buff[rx_wr_index] = SPDR;    //从ISP口读出收到的字节  
 000E 80E0              ldi R24,<_SPI_rx_buff
 0010 90E0              ldi R25,>_SPI_rx_buff
 0012 E0910800          lds R30,_rx_wr_index
 0016 FF27              clr R31
 0018 E80F              add R30,R24
 001A F91F              adc R31,R25
 001C 2FB0              in R2,0xf
 001E 2082              std z+0,R2
 0020                   .dbline 18
 0020           ;   SPI_ok=1;
 0020 81E0              ldi R24,1
 0022 80930100          sts _SPI_ok,R24
 0026                   .dbline 19
 0026           ;   SPI_datain=1;
 0026 80930000          sts _SPI_datain,R24
 002A                   .dbline 20
 002A           ;   if (++rx_wr_index == SIZE) rx_wr_index = 0;    //放入接收缓冲区,并调整队列指针  
 002A 80910800          lds R24,_rx_wr_index
 002E 8F5F              subi R24,255    ; addi 1
 0030 282E              mov R2,R24
 0032 20920800          sts _rx_wr_index,R2
 0036 8436              cpi R24,100
 0038 19F4              brne L2
 003A                   .dbline 20
 003A 2224              clr R2
 003C 20920800          sts _rx_wr_index,R2
 0040           L2:
 0040                   .dbline 21
 0040           ;   if (++rx_counter == SIZE)  
 0040 80910600          lds R24,_rx_counter
 0044 8F5F              subi R24,255    ; addi 1
 0046 282E              mov R2,R24
 0048 20920600          sts _rx_counter,R2
 004C 8436              cpi R24,100
 004E 31F4              brne L4
 0050                   .dbline 22
 0050           ;   {  
 0050                   .dbline 23
 0050           ;     rx_counter = 0;  
 0050 2224              clr R2
 0052 20920600          sts _rx_counter,R2
 0056                   .dbline 24
 0056           ;     rx_buffer_overflow = 1;  
 0056 81E0              ldi R24,1
 0058 80930500          sts _rx_buffer_overflow,R24
 005C                   .dbline 25
 005C           ;   }  
 005C           L4:
 005C                   .dbline 26
 005C           ;   if (tx_counter)        //如果发送缓冲区中有待发的数据  
 005C 20900200          lds R2,_tx_counter
 0060 2220              tst R2
 0062 D9F0              breq L6
 0064                   .dbline 27
 0064           ;   {  
 0064                   .dbline 28
 0064           ;      --tx_counter;  
 0064 822D              mov R24,R2
 0066 8150              subi R24,1
 0068 80930200          sts _tx_counter,R24
 006C                   .dbline 29
 006C           ;      SPDR = SPI_tx_buff[tx_rd_index]; //发送一个字节数据,并调整指针  
 006C 80E0              ldi R24,<_SPI_tx_buff
 006E 90E0              ldi R25,>_SPI_tx_buff
 0070 E0910300          lds R30,_tx_rd_index
 0074 FF27              clr R31
 0076 E80F              add R30,R24
 0078 F91F              adc R31,R25
 007A 2080              ldd R2,z+0
 007C 2FB8              out 0xf,R2
 007E                   .dbline 30
 007E           ;      SPI_ok=0;
 007E 2224              clr R2
 0080 20920100          sts _SPI_ok,R2
 0084                   .dbline 31
 0084           ;        if (++tx_rd_index == SIZE) tx_rd_index = 0;  
 0084 80910300          lds R24,_tx_rd_index
 0088 8F5F              subi R24,255    ; addi 1
 008A 282E              mov R2,R24
 008C 20920300          sts _tx_rd_index,R2
 0090 8436              cpi R24,100
 0092 19F4              brne L8
 0094                   .dbline 31
 0094 2224              clr R2
 0096 20920300          sts _tx_rd_index,R2
 009A           L8:
 009A                   .dbline 32
 009A           L6:
 009A                   .dbline -2
 009A           L1:
 009A 2990              ld R2,y+
 009C 2FBE              out 0x3f,R2
 009E F991              ld R31,y+
 00A0 E991              ld R30,y+
 00A2 9991              ld R25,y+
 00A4 8991              ld R24,y+
 00A6 2990              ld R2,y+
 00A8                   .dbline 0 ; func end
 00A8 1895              reti
 00AA                   .dbend
 00AA                   .dbfunc e getSPIchar _getSPIchar fc
 00AA           ;           data -> R16
                        .even
 00AA           _getSPIchar::
 00AA                   .dbline -1
 00AA                   .dbline 36
 00AA           ;   }  
 00AA           ; }  
 00AA           ; 
 00AA           ; unsigned char getSPIchar(void)  
 00AA           ; {  
 00AA           L11:
 00AA                   .dbline 38
 00AA           L12:
 00AA                   .dbline 38
 00AA           ;   unsigned char data;  
 00AA           ;   while (rx_counter == 0);     //无接收数据,等待  
 00AA 20900600          lds R2,_rx_counter
 00AE 2220              tst R2
 00B0 E1F3              breq L11
 00B2                   .dbline 39
 00B2           ;   data = SPI_rx_buff[rx_rd_index];    //从接收缓冲区取出一个SPI收到的数据  
 00B2 80E0              ldi R24,<_SPI_rx_buff
 00B4 90E0              ldi R25,>_SPI_rx_buff
 00B6 E0910700          lds R30,_rx_rd_index
 00BA FF27              clr R31
 00BC E80F              add R30,R24
 00BE F91F              adc R31,R25
 00C0 0081              ldd R16,z+0
 00C2                   .dbline 40
 00C2           ;   if (++rx_rd_index == SIZE) rx_rd_index = 0;    //调整指针  
 00C2 80910700          lds R24,_rx_rd_index
 00C6 8F5F              subi R24,255    ; addi 1
 00C8 282E              mov R2,R24
 00CA 20920700          sts _rx_rd_index,R2
 00CE 8436              cpi R24,100
 00D0 19F4              brne L14
 00D2                   .dbline 40
 00D2 2224              clr R2
 00D4 20920700          sts _rx_rd_index,R2
 00D8           L14:
 00D8                   .dbline 41
 00D8           ;   CLI();  
 00D8 F894              cli
 00DA                   .dbline 42
 00DA           ;   --rx_counter;  
 00DA 80910600          lds R24,_rx_counter
 00DE 8150              subi R24,1
 00E0 80930600          sts _rx_counter,R24
 00E4                   .dbline 43
 00E4           ;   SEI();  
 00E4 7894              sei
 00E6                   .dbline 44
 00E6           ;   return data;  
 00E6                   .dbline -2
 00E6           L10:
 00E6                   .dbline 0 ; func end
 00E6 0895              ret
 00E8                   .dbsym r data 16 c
 00E8                   .dbend
 00E8                   .dbfunc e putSPIchar _putSPIchar fV
 00E8           ;              c -> R16
                        .even
 00E8           _putSPIchar::
 00E8                   .dbline -1
 00E8                   .dbline 48
 00E8           ; }  
 00E8           ; 
 00E8           ; void putSPIchar(char c)  
 00E8           ; {  
 00E8           L17:
 00E8                   .dbline 49
 00E8           L18:
 00E8                   .dbline 49
 00E8           ;   while (tx_counter == SIZE);//发送缓冲区满,等待  
 00E8 80910200          lds R24,_tx_counter
 00EC 8436              cpi R24,100
 00EE E1F3              breq L17
 00F0                   .dbline 50
 00F0           ;   CLI();  
 00F0 F894              cli
 00F2                   .dbline 51
 00F2           ;   if (tx_counter || (SPI_ok==0))//发送缓冲区已中有待发数据  
 00F2 8823              tst R24
 00F4 21F4              brne L22
 00F6 20900100          lds R2,_SPI_ok
 00FA 2220              tst R2
 00FC C9F4              brne L20
 00FE           L22:
 00FE                   .dbline 52
 00FE           ;   {                //或SPI正在发送数据时  
 00FE                   .dbline 53
 00FE           ;     SPI_tx_buff[tx_wr_index] = c;    //将数据放入发送缓冲区排队  
 00FE 80E0              ldi R24,<_SPI_tx_buff
 0100 90E0              ldi R25,>_SPI_tx_buff
 0102 E0910400          lds R30,_tx_wr_index
 0106 FF27              clr R31
 0108 E80F              add R30,R24
 010A F91F              adc R31,R25

⌨️ 快捷键说明

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