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

📄 spi.lst

📁 avr atmega168v spi的程序
💻 LST
字号:
__start:
__text_start:
      34 EFCF      LDI	R28,0xFF
      35 E0D4      LDI	R29,4
      36 BFCD      OUT	0x3D,R28
      37 BFDE      OUT	0x3E,R29
      38 51C0      SUBI	R28,0x10
      39 40D0      SBCI	R29,0
      3A EA0A      LDI	R16,0xAA
      3B 8308      STD	Y+0,R16
      3C 2400      CLR	R0
      3D E0E0      LDI	R30,0
      3E E0F1      LDI	R31,1
      3F E011      LDI	R17,1
      40 30E0      CPI	R30,0
      41 07F1      CPC	R31,R17
      42 F011      BEQ	0x0045
      43 9201      ST	R0,Z+
      44 CFFB      RJMP	0x0040
      45 8300      STD	Z+0,R16
      46 E6E8      LDI	R30,0x68
      47 E0F0      LDI	R31,0
      48 E0A0      LDI	R26,0
      49 E0B1      LDI	R27,1
      4A E010      LDI	R17,0
      4B 36E8      CPI	R30,0x68
      4C 07F1      CPC	R31,R17
      4D F021      BEQ	0x0052
      4E 95C8      LPM
      4F 9631      ADIW	R30,1
      50 920D      ST	R0,X+
      51 CFF9      RJMP	0x004B
      52 940E 00AE CALL	_main
_exit:
      54 CFFF      RJMP	_exit
FILE: G:\燕洪成\gra_des\exper\inc\myfun.h
(0001) //******DelayTime*******//	 
(0002) void Delayus(int time)
(0003) {     
(0004)  do
(0005)       time--;
_Delayus:
  time                 --> R16
      55 5001      SUBI	R16,1
      56 4010      SBCI	R17,0
(0006)  while(time>1);
      57 E081      LDI	R24,1
      58 E090      LDI	R25,0
      59 1780      CP	R24,R16
      5A 0791      CPC	R25,R17
      5B F3CC      BLT	0x0055
      5C 9508      RET
_Delayms:
  time                 --> R20
      5D 934A      ST	R20,-Y
      5E 935A      ST	R21,-Y
      5F 01A8      MOVW	R20,R16
(0007) }	  
(0008) void Delayms(unsigned int time)
(0009) {
      60 C005      RJMP	0x0066
(0010)  while(time!=0)
(0011) 	  {		
(0012) 	   Delayus(1000);
      61 EE08      LDI	R16,0xE8
      62 E013      LDI	R17,3
      63 DFF1      RCALL	_Delayus
(0013) 	   time--;
      64 5041      SUBI	R20,1
      65 4050      SBCI	R21,0
      66 3040      CPI	R20,0
      67 0745      CPC	R20,R21
      68 F7C1      BNE	0x0061
      69 9159      LD	R21,Y+
      6A 9149      LD	R20,Y+
      6B 9508      RET
FILE: G:\燕洪成\gra_des\exper\spi\spi_slave\spi.c
(0001) // **************************************************************
(0002) // ***         实验:        SPI Interface Slave              ***
(0003) // ***                       2007年10月13日                   ***
(0004) // ***         目标MCU:MEGA168v     晶振:内部  8MHZ          ***
(0005) // **************************************************************
(0006) //set_bit:PORTD |=(1<<PORTD3);
(0007) //clr_bit:PORTD &=~(1<<PORTD3);
(0008) #include<iom168v.h>
(0009) #include<macros.h>
(0010) #include<myfun.h>
(0011) 
(0012) //**PORT_Init()**//
(0013) void PORT_Init()
(0014) {
(0015)  DDRD |=(1<<DDD7);//Interrupt output
_PORT_Init:
      6C 9A57      SBI	0x0A,7
(0016)  PORTD |=(1<<PORTD7);//set high
      6D 9A5F      SBI	0x0B,7
      6E 9508      RET
(0017) }
(0018) 
(0019) //*************************************************
(0020) //******************  USART  **********************
(0021) //*************************************************
(0022) #define USART_DDR DDRD
(0023) #define DDR_TX DDD1
(0024) #define USART_PORT PORTD
(0025) #define USART_RX PORTD0
(0026) //***********串口初始化******************************* 
(0027) //内部8Mhz频率,设置波特率9.6k,8位数据位,
(0028) //无校验,1位停止位
(0029) void USART_Init(void) 
(0030) {  
(0031)   USART_DDR |=(1<<DDR_TX);   //set TX output
_USART_Init:
      6F 9A51      SBI	0x0A,1
(0032)   USART_PORT |=(1<<USART_RX);  //RX pull up 
      70 9A58      SBI	0x0B,0
(0033)    
(0034)   UCSR0B = 0x00; //设置波特率之前先关闭串口
      71 2422      CLR	R2
      72 9220 00C1 STS	0x00C1,R2
(0035)   UCSR0A = 0x00;
      74 9220 00C0 STS	0x00C0,R2
(0036)   UBRR0H=0;
      76 9220 00C5 STS	0x00C5,R2
(0037)   UBRR0L=51;
      78 E383      LDI	R24,0x33
      79 9380 00C4 STS	0x00C4,R24
(0038)   //UCSR0B=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//enable
(0039)   UCSR0B=(1<<RXEN0)|(1<<TXEN0);
      7B E188      LDI	R24,0x18
      7C 9380 00C1 STS	0x00C1,R24
(0040)   UCSR0C=(1<<UCSZ00)|(1<<UCSZ01);//8 data,1 stop 
      7E E086      LDI	R24,6
      7F 9380 00C2 STS	0x00C2,R24
      81 9508      RET
(0041) }
(0042) //***************串口发送数据函数***************************
(0043) void USART_Transmit(unsigned char data)  //查询方式发送接收字符函数 
(0044)  { 
(0045)   while( !(UCSR0A & (1<<UDRE0)))     //等待发送缓冲区为空
_USART_Transmit:
  data                 --> R16
      82 9020 00C0 LDS	R2,0x00C0
      84 FE25      SBRS	R2,5
      85 CFFC      RJMP	_USART_Transmit
(0046)         ;                   
(0047)   UDR0 = data;
      86 9300 00C6 STS	0x00C6,R16
      88 9508      RET
(0048)  }   
(0049) //*************************************************
(0050) //**************** USART_over *********************
(0051) //*************************************************
(0052) //*************************************************
(0053) //******************  SPI  ************************
(0054) //*************************************************
(0055) #define DDR_SPI DDRB
(0056) #define DDR_SS DDB2
(0057) #define DDR_MOSI DDB3
(0058) #define DDR_MISO DDB4
(0059) #define DDR_SCK DDB5
(0060) #define SPI_SS PORTB2
(0061) //**SPI_SlaveInit()**//
(0062) void SPI_SlaveInit(void)
(0063) {
(0064)  DDRB = (1<<DDR_MISO);//设置MISO 为输出,其他为输入
_SPI_SlaveInit:
      89 E180      LDI	R24,0x10
      8A B984      OUT	0x04,R24
(0065)  SPCR = (1<<SPE)|(1<<SPIE);//enable SPI,SPI interrupt
      8B EC80      LDI	R24,0xC0
      8C BD8C      OUT	0x2C,R24
      8D 9508      RET
_SPI_SlaveTransmit:
  cData                --> R10
      8E 92AA      ST	R10,-Y
      8F 92BA      ST	R11,-Y
      90 2EA0      MOV	R10,R16
(0066) }
(0067) //**SPI_SlaveTransmit()**//
(0068) void SPI_SlaveTransmit(unsigned char cData)
(0069) {
(0070)     SPDR=cData;
      91 BCAE      OUT	0x2E,R10
(0071) 	PORTD &= ~(1<<PORTD7);//clr
      92 985F      CBI	0x0B,7
(0072) 	Delayms(10);
      93 E00A      LDI	R16,0xA
      94 E010      LDI	R17,0
      95 DFC7      RCALL	_Delayms
(0073) 	PORTD |= (1<<PORTD7);//set
      96 9A5F      SBI	0x0B,7
(0074) 	Delayms(10);
      97 E00A      LDI	R16,0xA
      98 E010      LDI	R17,0
      99 DFC3      RCALL	_Delayms
      9A 90B9      LD	R11,Y+
      9B 90A9      LD	R10,Y+
      9C 9508      RET
(0075) }
(0076) //**SPI_SlaveReceive()**//
(0077) unsigned char SPI_SlaveReceive(void)
(0078) {
(0079)  while(!(SPSR & (1<<SPIF)))//等待接收结束
_SPI_SlaveReceive:
      9D B42D      IN	R2,0x2D
      9E FE27      SBRS	R2,7
      9F CFFD      RJMP	_SPI_SlaveReceive
(0080)        ;
(0081)  return SPDR;//返回数据
      A0 B50E      IN	R16,0x2E
      A1 9508      RET
_SPI_ovf_isr:
  temp_data            --> R10
      A2 940E 00C6 CALL	push_lset
      A4 92AA      ST	R10,-Y
      A5 92BA      ST	R11,-Y
(0082) }
(0083) //**********中断服务程序*********************
(0084) #pragma interrupt_handler SPI_ovf_isr:18
(0085) void SPI_ovf_isr(void)
(0086) {
(0087)  unsigned char temp_data;
(0088)  temp_data=SPI_SlaveReceive();
      A6 DFF6      RCALL	_SPI_SlaveReceive
      A7 2EA0      MOV	R10,R16
(0089)  USART_Transmit(temp_data);
      A8 DFD9      RCALL	_USART_Transmit
      A9 90B9      LD	R11,Y+
      AA 90A9      LD	R10,Y+
      AB 940E 00DD CALL	pop_lset
      AD 9518      RETI
(0090) }
(0091) //*************************************************
(0092) //******************  SPI_over  *******************
(0093) //*************************************************
(0094) void main(void)
(0095) {
(0096)  unsigned int num=0;
_main:
  num                  --> R20
      AE 2744      CLR	R20
      AF 2755      CLR	R21
(0097)  
(0098)  CLI();
      B0 94F8      BCLR	7
(0099)  PORT_Init();
      B1 DFBA      RCALL	_PORT_Init
(0100)  USART_Init();
      B2 DFBC      RCALL	_USART_Init
(0101)  SPI_SlaveInit();
      B3 DFD5      RCALL	_SPI_SlaveInit
(0102)  SEI();
      B4 9478      BSET	7
      B5 C00E      RJMP	0x00C4
(0103) 
(0104)  while(1)
(0105)       {
(0106) 	   //PORTB &= ~(1<<PORTB0);//clr
(0107) 	   //Delayms(1);
(0108) 	   //PORTB |= (1<<PORTB0);//set
(0109) 	   //Delayms(1);
(0110) 	   SPI_SlaveTransmit(num++);
      B6 011A      MOVW	R2,R20
      B7 5F4F      SUBI	R20,0xFF
      B8 4F5F      SBCI	R21,0xFF
      B9 2D02      MOV	R16,R2
      BA DFD3      RCALL	_SPI_SlaveTransmit
(0111) 	   Delayms(10);
      BB E00A      LDI	R16,0xA
      BC E010      LDI	R17,0
      BD DF9F      RCALL	_Delayms
(0112) 	   if(num==0xFF)
      BE 3F4F      CPI	R20,0xFF
      BF E0E0      LDI	R30,0
      C0 075E      CPC	R21,R30
      C1 F411      BNE	0x00C4
(0113) 	         num=0;
FILE: <library>
      C2 2744      CLR	R20
      C3 2755      CLR	R21
      C4 CFF1      RJMP	0x00B6
      C5 9508      RET
push_lset:
      C6 93FA      ST	R31,-Y
      C7 93EA      ST	R30,-Y
      C8 93BA      ST	R27,-Y
      C9 93AA      ST	R26,-Y
      CA 939A      ST	R25,-Y
      CB 938A      ST	R24,-Y
      CC 933A      ST	R19,-Y
      CD 932A      ST	R18,-Y
      CE 931A      ST	R17,-Y
      CF 930A      ST	R16,-Y
      D0 929A      ST	R9,-Y
      D1 928A      ST	R8,-Y
      D2 927A      ST	R7,-Y
      D3 926A      ST	R6,-Y
      D4 925A      ST	R5,-Y
      D5 924A      ST	R4,-Y
      D6 923A      ST	R3,-Y
      D7 922A      ST	R2,-Y
      D8 921A      ST	R1,-Y
      D9 920A      ST	R0,-Y
      DA B60F      IN	R0,0x3F
      DB 920A      ST	R0,-Y
      DC 9508      RET
pop_lset:
      DD 9009      LD	R0,Y+
      DE BE0F      OUT	0x3F,R0
      DF 9009      LD	R0,Y+
      E0 9019      LD	R1,Y+
      E1 9029      LD	R2,Y+
      E2 9039      LD	R3,Y+
      E3 9049      LD	R4,Y+
      E4 9059      LD	R5,Y+
      E5 9069      LD	R6,Y+
      E6 9079      LD	R7,Y+
      E7 9089      LD	R8,Y+
      E8 9099      LD	R9,Y+
      E9 9109      LD	R16,Y+
      EA 9119      LD	R17,Y+
      EB 9129      LD	R18,Y+
      EC 9139      LD	R19,Y+
      ED 9189      LD	R24,Y+
      EE 9199      LD	R25,Y+
      EF 91A9      LD	R26,Y+
      F0 91B9      LD	R27,Y+
      F1 91E9      LD	R30,Y+
      F2 91F9      LD	R31,Y+
      F3 9508      RET

⌨️ 快捷键说明

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