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

📄 tx.lst

📁 AVR单片机系统开发经典实例部分源程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0047 EFCF      LDI	R28,0xFF
    0048 E1D0      LDI	R29,0x10
    0049 BFCD      OUT	0x3D,R28
    004A BFDE      OUT	0x3E,R29
    004B 51C0      SUBI	R28,0x10
    004C 40D0      SBCI	R29,0
    004D EA0A      LDI	R16,0xAA
    004E 8308      STD	Y+0,R16
    004F 2400      CLR	R0
    0050 E0E1      LDI	R30,1
    0051 E0F1      LDI	R31,1
    0052 E011      LDI	R17,1
    0053 37E1      CPI	R30,0x71
    0054 07F1      CPC	R31,R17
    0055 F011      BEQ	0x0058
    0056 9201      ST	R0,Z+
    0057 CFFB      RJMP	0x0053
    0058 8300      STD	Z+0,R16
    0059 E8EC      LDI	R30,0x8C
    005A E0F0      LDI	R31,0
    005B E0A0      LDI	R26,0
    005C E0B1      LDI	R27,1
    005D E010      LDI	R17,0
    005E 38ED      CPI	R30,0x8D
    005F 07F1      CPC	R31,R17
    0060 F021      BEQ	0x0065
    0061 95C8      LPM
    0062 9631      ADIW	R30,1
    0063 920D      ST	R0,X+
    0064 CFF9      RJMP	0x005E
    0065 940E0228  CALL	_main
_exit:
    0067 CFFF      RJMP	_exit
_Write_Command:
  statueval            --> R20
  command              --> R20
    0068 940E02B7  CALL	push_gset1
    006A 2F40      MOV	R20,R16
FILE: C:\AVR\cc2420驱动程序\code\cc2420.c
(0001) #include "cc2420.h"
(0002) #include "spi.h"
(0003) #include "common.h"
(0004) 
(0005) /*******************************************
(0006) *函数功能:写命令寄存器
(0007) *输入参数:命令字
(0008) *输出参数:无
(0009) *返 回 值:状态寄存器的值
(0010) ********************************************/
(0011) unsigned char Write_Command(unsigned char command)
(0012) {
(0013)   unsigned char statueval;
(0014)   
(0015)   enable_spi();     //使能SPI口
    006B 940E02A5  CALL	_enable_spi
(0016)   statueval=SpiWrite(command);
    006D 2F04      MOV	R16,R20
    006E 940E029A  CALL	_SpiWrite
    0070 2F40      MOV	R20,R16
(0017)   disable_spi();      //禁止SPI口  
    0071 940E02A7  CALL	_disable_spi
(0018)   
(0019)   return statueval;
    0073 2F04      MOV	R16,R20
    0074 940E02BA  CALL	pop_gset1
    0076 9508      RET
_Read_Status:
  statuevalue          --> R20
    0077 940E02B7  CALL	push_gset1
(0020) }
(0021) 
(0022) /*******************************************
(0023) *函数功能:读状态寄存器
(0024) *输入参数:无
(0025) *输出参数:无
(0026) *返 回 值:状态寄存器的值
(0027) ********************************************/
(0028) unsigned char Read_Status(void)
(0029) {
(0030)   unsigned char statuevalue;
(0031)   statuevalue=Write_Command(SNOP);        //空操作命令,为了读取当前状态寄存器的值
    0079 2700      CLR	R16
    007A DFED      RCALL	_Write_Command
    007B 2F40      MOV	R20,R16
(0032)   return statuevalue;
    007C 940E02BA  CALL	pop_gset1
    007E 9508      RET
_Write_ConfigureWord:
  statuevalue          --> R20
  DataL                --> Y+4
  DataH                --> R22
  Addr                 --> R20
    007F 940E02B5  CALL	push_gset2
    0081 2F62      MOV	R22,R18
    0082 2F40      MOV	R20,R16
(0033) }
(0034) 
(0035) /*******************************************
(0036) *函数功能:写配置字
(0037) *输入参数:Addr:配置寄存器的地址;
(0038)            DataH:配置字的高字节;
(0039) 		   DataL:配置字的低字节;
(0040) *输出参数:无
(0041) *返 回 值:状态寄存器的值
(0042) ********************************************/
(0043) unsigned char Write_ConfigureWord(unsigned char Addr,unsigned char DataH,unsigned char DataL)
(0044) {
(0045)   unsigned char statuevalue;
(0046)   
(0047)   // enable_spi();     //使能SPI口   以具体情况而定使能/禁止SPI口放在何处
(0048)   statuevalue=SpiWrite(Addr);  //发送配置寄存器的地址,同时返回当前状态寄存器的值
    0083 2F04      MOV	R16,R20
    0084 940E029A  CALL	_SpiWrite
    0086 2F40      MOV	R20,R16
(0049)   SpiWrite(DataH); //发送配置字的高字节
    0087 2F06      MOV	R16,R22
    0088 940E029A  CALL	_SpiWrite
(0050)   SpiWrite(DataL); //发送配置字的低字节
    008A 810C      LDD	R16,Y+4
    008B 940E029A  CALL	_SpiWrite
(0051)   // disable_spi();      //禁止SPI口  
(0052)  
(0053)   return statuevalue;
    008D 2F04      MOV	R16,R20
    008E 940E02A9  CALL	pop_gset2
    0090 9508      RET
_Read_ConfigureWord:
  statuevalue          --> R20
  DataL                --> Y+4
  DataH                --> R22
  Addr                 --> R20
    0091 940E02B5  CALL	push_gset2
    0093 01B9      MOVW	R22,R18
    0094 2F40      MOV	R20,R16
(0054) }
(0055) 
(0056) /*******************************************
(0057) *函数功能:读配置字
(0058) *输入参数:Addr:配置寄存器的地址;	   
(0059) *输出参数:DataH:配置字的高字节;
(0060)            DataL:配置字的低字节;
(0061) *返 回 值:状态寄存器的值
(0062) ********************************************/
(0063) unsigned char Read_ConfigureWord(unsigned char Addr,unsigned char *DataH,unsigned char *DataL)
(0064) {
(0065)   unsigned char statuevalue;
(0066)   
(0067)   Addr|=0x40;     //读标志位为1
    0095 6440      ORI	R20,0x40
(0068)   enable_spi();     //使能SPI口   以具体情况而定使能/禁止SPI口放在何处
    0096 940E02A5  CALL	_enable_spi
(0069)   statuevalue=SpiWrite(Addr);  //发送配置寄存器的地址,同时返回当前状态寄存器的值
    0098 2F04      MOV	R16,R20
    0099 940E029A  CALL	_SpiWrite
    009B 2F40      MOV	R20,R16
(0070)   *DataH=SpiWrite(0xff); //读配置字的高字节
    009C EF0F      LDI	R16,0xFF
    009D 940E029A  CALL	_SpiWrite
    009F 01FB      MOVW	R30,R22
    00A0 8300      STD	Z+0,R16
(0071)   *DataL=SpiWrite(0xff); //读配置字的低字节
    00A1 EF0F      LDI	R16,0xFF
    00A2 940E029A  CALL	_SpiWrite
    00A4 2E20      MOV	R2,R16
    00A5 81EC      LDD	R30,Y+4
    00A6 81FD      LDD	R31,Y+5
    00A7 8220      STD	Z+0,R2
(0072)   disable_spi();      //禁止SPI口  
    00A8 940E02A7  CALL	_disable_spi
(0073)  
(0074)   return statuevalue;
    00AA 2F04      MOV	R16,R20
    00AB 940E02A9  CALL	pop_gset2
    00AD 9508      RET
_Read_RXFIFO:
  Addr                 --> R20
  statuevalue          --> R20
  i                    --> R22
  p_Data               --> R10
  Data_Num             --> R12
    00AE 940E02B1  CALL	push_gset4
    00B0 0159      MOVW	R10,R18
    00B1 2EC0      MOV	R12,R16
(0075) }
(0076) 
(0077) /*******************************************
(0078) *函数功能:读RXFIFO 
(0079) *输入参数:Data_Num:欲读取的字节个数
(0080) *输出参数:p_Data:存储数据的缓存首地址;
(0081) *返 回 值:状态寄存器的值
(0082) ********************************************/
(0083) unsigned char Read_RXFIFO(unsigned char Data_Num,unsigned char *p_Data) 
(0084) {
(0085)   unsigned char statuevalue,Addr,i;
(0086)   
(0087)   Addr=RXFIFO|0x40;     //读标志位为1
    00B2 E74F      LDI	R20,0x7F
(0088)   enable_spi();         //使能SPI口 
    00B3 940E02A5  CALL	_enable_spi
(0089)   statuevalue=SpiWrite(Addr);
    00B5 2F04      MOV	R16,R20
    00B6 940E029A  CALL	_SpiWrite
    00B8 2F40      MOV	R20,R16
(0090)   
(0091)   for(i=0;i<Data_Num;i++)
    00B9 2766      CLR	R22
    00BA C009      RJMP	0x00C4
(0092)   {
(0093)     *(p_Data+i)=SpiWrite(0xff);
    00BB EF0F      LDI	R16,0xFF
    00BC 940E029A  CALL	_SpiWrite
    00BE 2FE6      MOV	R30,R22
    00BF 27FF      CLR	R31
    00C0 0DEA      ADD	R30,R10
    00C1 1DFB      ADC	R31,R11
    00C2 8300      STD	Z+0,R16
    00C3 9563      INC	R22
    00C4 156C      CP	R22,R12
    00C5 F3A8      BCS	0x00BB
(0094)   }
(0095)   
(0096)   disable_spi();      //禁止SPI口  
    00C6 940E02A7  CALL	_disable_spi
(0097)  
(0098)   return statuevalue;
    00C8 2F04      MOV	R16,R20
    00C9 940E02AC  CALL	pop_gset4
    00CB 9508      RET
_Read_RXFIFO_Byte:
  Addr                 --> R20
  readvalue            --> R20
    00CC 940E02B7  CALL	push_gset1
(0099) }
(0100) 
(0101) /*******************************************
(0102) *函数功能:读一字节RXFIFO
(0103) *输入参数:无
(0104) *输出参数:无
(0105) *返 回 值:读取的数据
(0106) ********************************************/
(0107) unsigned char Read_RXFIFO_Byte(void)
(0108) {
(0109)   unsigned char readvalue,Addr;
(0110)   
(0111)   Addr=RXFIFO|0x40;     //读标志位为1
    00CE E74F      LDI	R20,0x7F
(0112)   enable_spi();         //使能SPI口 
    00CF 940E02A5  CALL	_enable_spi
(0113)   SpiWrite(Addr);
    00D1 2F04      MOV	R16,R20
    00D2 940E029A  CALL	_SpiWrite
(0114)   readvalue=SpiWrite(0xff);
    00D4 EF0F      LDI	R16,0xFF
    00D5 940E029A  CALL	_SpiWrite
    00D7 2F40      MOV	R20,R16
(0115)   disable_spi();      //禁止SPI口  
    00D8 940E02A7  CALL	_disable_spi
(0116)   return readvalue;  
    00DA 2F04      MOV	R16,R20
    00DB 940E02BA  CALL	pop_gset1
    00DD 9508      RET
_Write_TXFIFO:
  statuevalue          --> R20
  i                    --> R22
  p_Data               --> R10
  Data_Num             --> R12
    00DE 940E02B1  CALL	push_gset4
    00E0 0159      MOVW	R10,R18
    00E1 2EC0      MOV	R12,R16
(0117) }
(0118) 
(0119) /*******************************************
(0120) *函数功能:写TXFIFO
(0121) *输入参数:Data_Num:欲写入的字节个数
(0122) *输出参数:p_Data:存储数据的缓存首地址;
(0123) *返 回 值:状态寄存器的值
(0124) ********************************************/
(0125) unsigned char Write_TXFIFO(unsigned char Data_Num,unsigned char *p_Data)
(0126) {
(0127)   unsigned char statuevalue,i;
(0128)   
(0129)   enable_spi();         //使能SPI口 
    00E2 940E02A5  CALL	_enable_spi
(0130)   SpiWrite(TXFIFO);
    00E4 E30E      LDI	R16,0x3E
    00E5 940E029A  CALL	_SpiWrite
(0131)   
(0132)   for (i=0;i<Data_Num;i++)
    00E7 2766      CLR	R22
    00E8 C00F      RJMP	0x00F8
(0133)   {
(0134)     statuevalue=SpiWrite(*(p_Data+i));
    00E9 2FE6      MOV	R30,R22
    00EA 27FF      CLR	R31
    00EB 0DEA      ADD	R30,R10
    00EC 1DFB      ADC	R31,R11
    00ED 8100      LDD	R16,Z+0
    00EE 940E029A  CALL	_SpiWrite
    00F0 2F40      MOV	R20,R16
(0135) 	
(0136) 	if ((statuevalue&(1<<TX_UNDERFLOE))!=0x00)         //发生下溢
    00F1 FF05      SBRS	R16,5
    00F2 C004      RJMP	0x00F7
(0137) 	{
(0138) 	  Write_Command(SFLUSHTX);
    00F3 E009      LDI	R16,0x9
    00F4 DF73      RCALL	_Write_Command
(0139) 	  enable_spi();     //重新使能SPI口
    00F5 940E02A5  CALL	_enable_spi
    00F7 9563      INC	R22
    00F8 156C      CP	R22,R12
    00F9 F378      BCS	0x00E9
(0140) 	}
(0141)   }
(0142)   
(0143)   disable_spi();      //禁止SPI口 
    00FA 940E02A7  CALL	_disable_spi
(0144)   return statuevalue;
    00FC 2F04      MOV	R16,R20
    00FD 940E02AC  CALL	pop_gset4
    00FF 9508      RET
_Write_TXFIFO_Byte:
  statuevalue          --> R20
  p_Data               --> R20
    0100 940E02B7  CALL	push_gset1
    0102 2F40      MOV	R20,R16
(0145) } 
(0146) 
(0147) /*******************************************
(0148) *函数功能:写一字节TXFIFO
(0149) *输入参数:p_Data:要写入的数据
(0150) *输出参数:无
(0151) *返 回 值:状态寄存器的值
(0152) ********************************************/
(0153) unsigned char Write_TXFIFO_Byte(unsigned char p_Data)
(0154) {
(0155)   unsigned char statuevalue;
(0156)   
(0157)   enable_spi();         //使能SPI口 
    0103 940E02A5  CALL	_enable_spi
(0158)   SpiWrite(TXFIFO);  
    0105 E30E      LDI	R16,0x3E
    0106 940E029A  CALL	_SpiWrite
(0159)   statuevalue=SpiWrite(p_Data);
    0108 2F04      MOV	R16,R20
    0109 940E029A  CALL	_SpiWrite
    010B 2F40      MOV	R20,R16
(0160)   disable_spi();      //禁止SPI口 
    010C 940E02A7  CALL	_disable_spi
(0161)   return statuevalue;
    010E 2F04      MOV	R16,R20
    010F 940E02BA  CALL	pop_gset1
    0111 9508      RET
_Write_RAM:
  statuevalue          --> R20
  i                    --> R22
  p_Data               --> R10
  Data_Num             --> R12
  AddrL                --> R22
  AddrH                --> R20
    0112 940E02B1  CALL	push_gset4
    0114 2F62      MOV	R22,R18
    0115 2F40      MOV	R20,R16
    0116 84C8      LDD	R12,Y+8
    0117 84AA      LDD	R10,Y+10
    0118 84BB      LDD	R11,Y+11
(0162) }
(0163) 
(0164) /*******************************************
(0165) *函数功能:写RAM 
(0166) *输入参数:p_Data:存储数据的缓存首地址;
(0167)            Data_Num:要写入的字节数
(0168) 		   AddrH:在选定的RAM存储块中确定RAM地址
(0169) 		   AddrL:选择RAM存储块
(0170) *输出参数:无
(0171) *返 回 值:状态寄存器的值
(0172) ********************************************/
(0173) unsigned char Write_RAM(unsigned char AddrH,unsigned char AddrL,unsigned char Data_Num,unsigned char *p_Data)
(0174) {
(0175)   unsigned char statuevalue,i;
(0176)   AddrH|=0X80;      //访问RAM位置1
    0119 6840      ORI	R20,0x80
(0177)   AddrL<<=6;
    011A 0F66      LSL	R22
    011B 0F66      LSL	R22
    011C 0F66      LSL	R22
    011D 0F66      LSL	R22
    011E 0F66      LSL	R22
    011F 0F66      LSL	R22
(0178)   AddrL&=0XDF;      //读写操作位置0,表示写操作
    0120 7D6F      ANDI	R22,0xDF
(0179)   
(0180)   enable_spi();         //使能SPI口 
    0121 940E02A5  CALL	_enable_spi
(0181)   statuevalue=SpiWrite(AddrH);  
    0123 2F04      MOV	R16,R20
    0124 940E029A  CALL	_SpiWrite
    0126 2F40      MOV	R20,R16
(0182)   SpiWrite(AddrL);
    0127 2F06      MOV	R16,R22
    0128 940E029A  CALL	_SpiWrite
(0183)   
(0184)   for (i=0;i<Data_Num;i++)
    012A 2766      CLR	R22
    012B C008      RJMP	0x0134
(0185)   {
(0186)     SpiWrite(*(p_Data+i));
    012C 2FE6      MOV	R30,R22
    012D 27FF      CLR	R31
    012E 0DEA      ADD	R30,R10
    012F 1DFB      ADC	R31,R11
    0130 8100      LDD	R16,Z+0
    0131 940E029A  CALL	_SpiWrite

⌨️ 快捷键说明

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