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

📄 tx.lst

📁 AVR单片机系统开发经典实例部分源程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
    0133 9563      INC	R22
    0134 156C      CP	R22,R12
    0135 F3B0      BCS	0x012C
(0187)   }
(0188)   
(0189)   disable_spi();      //禁止SPI口 
    0136 940E02A7  CALL	_disable_spi
(0190)   return statuevalue;
    0138 2F04      MOV	R16,R20
    0139 940E02AC  CALL	pop_gset4
    013B 9508      RET
_Write_RAM_Byte:
  statuevalue          --> R20
  p_Data               --> Y+4
  AddrL                --> R22
  AddrH                --> R20
    013C 940E02B5  CALL	push_gset2
    013E 2F62      MOV	R22,R18
    013F 2F40      MOV	R20,R16
(0191) }
(0192) 
(0193) /*******************************************
(0194) *函数功能:写一字节RAM
(0195) *输入参数:p_Data:要写入的数据
(0196)            AddrH:在选定的RAM存储块中确定RAM地址
(0197) 		   AddrL:选择RAM存储块
(0198) *输出参数:无
(0199) *返 回 值:状态寄存器的值
(0200) ********************************************/
(0201) unsigned char Write_RAM_Byte(unsigned char AddrH,unsigned char AddrL,unsigned char p_Data)
(0202) {
(0203)   unsigned char statuevalue;
(0204)   AddrH|=0X80;      //访问RAM位置1
    0140 6840      ORI	R20,0x80
(0205)   AddrL<<=6;
    0141 0F66      LSL	R22
    0142 0F66      LSL	R22
    0143 0F66      LSL	R22
    0144 0F66      LSL	R22
    0145 0F66      LSL	R22
    0146 0F66      LSL	R22
(0206)   AddrL&=0XDF;      //读写操作位置0,表示写操作
    0147 7D6F      ANDI	R22,0xDF
(0207)   
(0208)   enable_spi();         //使能SPI口 
    0148 940E02A5  CALL	_enable_spi
(0209)   statuevalue=SpiWrite(AddrH);  
    014A 2F04      MOV	R16,R20
    014B 940E029A  CALL	_SpiWrite
    014D 2F40      MOV	R20,R16
(0210)   SpiWrite(AddrL);
    014E 2F06      MOV	R16,R22
    014F 940E029A  CALL	_SpiWrite
(0211)   
(0212)   SpiWrite(p_Data); 
    0151 810C      LDD	R16,Y+4
    0152 940E029A  CALL	_SpiWrite
(0213)    
(0214)   disable_spi();      //禁止SPI口 
    0154 940E02A7  CALL	_disable_spi
(0215)   return statuevalue;
    0156 2F04      MOV	R16,R20
    0157 940E02A9  CALL	pop_gset2
    0159 9508      RET
_Read_RAM:
  statuevalue          --> R20
  i                    --> R22
  p_Data               --> R10
  Data_Num             --> R12
  AddrL                --> R22
  AddrH                --> R20
    015A 940E02B1  CALL	push_gset4
    015C 2F62      MOV	R22,R18
    015D 2F40      MOV	R20,R16
    015E 84C8      LDD	R12,Y+8
    015F 84AA      LDD	R10,Y+10
    0160 84BB      LDD	R11,Y+11
(0216) }
(0217) 
(0218) /*******************************************
(0219) *函数功能:读RAM
(0220) *输入参数:p_Data:存储数据的缓存首地址;
(0221)            Data_Num:要读取的字节数
(0222) 		   AddrH:在选定的RAM存储块中确定RAM地址
(0223) 		   AddrL:选择RAM存储块
(0224) *输出参数:无
(0225) *返 回 值:状态寄存器的值
(0226) ********************************************/
(0227) unsigned char Read_RAM(unsigned char AddrH,unsigned char AddrL,unsigned char Data_Num,unsigned char *p_Data)  
(0228) {
(0229)   unsigned char statuevalue,i;
(0230)   AddrH|=0X80;      //访问RAM位置1
    0161 6840      ORI	R20,0x80
(0231)   AddrL<<=6;
    0162 0F66      LSL	R22
    0163 0F66      LSL	R22
    0164 0F66      LSL	R22
    0165 0F66      LSL	R22
    0166 0F66      LSL	R22
    0167 0F66      LSL	R22
(0232)   AddrL|=0X20;      //读写操作位置1,表示读操作
    0168 6260      ORI	R22,0x20
(0233)   
(0234)   enable_spi();         //使能SPI口 
    0169 940E02A5  CALL	_enable_spi
(0235)   statuevalue=SpiWrite(AddrH);  
    016B 2F04      MOV	R16,R20
    016C 940E029A  CALL	_SpiWrite
    016E 2F40      MOV	R20,R16
(0236)   SpiWrite(AddrL);
    016F 2F06      MOV	R16,R22
    0170 940E029A  CALL	_SpiWrite
(0237)   
(0238)   for (i=0;i<Data_Num;i++)
    0172 2766      CLR	R22
    0173 C009      RJMP	0x017D
(0239)   {
(0240)     *(p_Data+i)=SpiWrite(0xff);
    0174 EF0F      LDI	R16,0xFF
    0175 940E029A  CALL	_SpiWrite
    0177 2FE6      MOV	R30,R22
    0178 27FF      CLR	R31
    0179 0DEA      ADD	R30,R10
    017A 1DFB      ADC	R31,R11
    017B 8300      STD	Z+0,R16
    017C 9563      INC	R22
    017D 156C      CP	R22,R12
    017E F3A8      BCS	0x0174
(0241)   }
(0242)   
(0243)   disable_spi();      //禁止SPI口 
    017F 940E02A7  CALL	_disable_spi
(0244)   return statuevalue;
    0181 2F04      MOV	R16,R20
    0182 940E02AC  CALL	pop_gset4
    0184 9508      RET
_Read_RAM_Byte:
  readvalue            --> R20
  AddrL                --> R20
  AddrH                --> R22
    0185 940E02B5  CALL	push_gset2
    0187 2F42      MOV	R20,R18
    0188 2F60      MOV	R22,R16
(0245) }
(0246) 
(0247) /*******************************************
(0248) *函数功能:读一字节RAM
(0249) *输入参数:AddrH:在选定的RAM存储块中确定RAM地址
(0250) 		   AddrL:选择RAM存储块
(0251) *输出参数:无
(0252) *返 回 值:读取的数据值
(0253) ********************************************/
(0254) unsigned char Read_RAM_Byte(unsigned char AddrH,unsigned char AddrL)
(0255) {
(0256)   unsigned char readvalue;
(0257)   AddrH|=0X80;      //访问RAM位置1
    0189 6860      ORI	R22,0x80
(0258)   AddrL<<=6;
    018A 0F44      LSL	R20
    018B 0F44      LSL	R20
    018C 0F44      LSL	R20
    018D 0F44      LSL	R20
    018E 0F44      LSL	R20
    018F 0F44      LSL	R20
(0259)   AddrL|=0X20;      //读写操作位置1,表示读操作
    0190 6240      ORI	R20,0x20
(0260)   
(0261)   enable_spi();         //使能SPI口 
    0191 940E02A5  CALL	_enable_spi
(0262)   SpiWrite(AddrH);  
    0193 2F06      MOV	R16,R22
    0194 940E029A  CALL	_SpiWrite
(0263)   SpiWrite(AddrL);                         
    0196 2F04      MOV	R16,R20
    0197 940E029A  CALL	_SpiWrite
(0264)   
(0265)   readvalue=SpiWrite(0xff); 
    0199 EF0F      LDI	R16,0xFF
    019A 940E029A  CALL	_SpiWrite
    019C 2F40      MOV	R20,R16
(0266)   
(0267)   disable_spi();      //禁止SPI口 
    019D 940E02A7  CALL	_disable_spi
(0268)   return readvalue;
    019F 2F04      MOV	R16,R20
    01A0 940E02A9  CALL	pop_gset2
    01A2 9508      RET
(0269) }
(0270) 
(0271) /*******************************************
(0272) *函数功能:关闭电压校准器模式
(0273) *输入参数:无
(0274) *输出参数:无
(0275) *返 回 值:无
(0276) ********************************************/
(0277) void PowerOff(void)
(0278) {
(0279)   PORTE &=~(1<<VREGEN);     //禁止电压校准器   
_PowerOff:
    01A3 981B      CBI	0x03,3
    01A4 9508      RET
_PwOff_PwDown:
    01A5 9721      SBIW	R28,1
(0280) }
(0281) 
(0282) /*******************************************
(0283) *函数功能:从电压校准器关闭模式转换到掉电模式 
(0284) *输入参数:无
(0285) *输出参数:无
(0286) *返 回 值:无
(0287) ********************************************/
(0288) void PwOff_PwDown(void)  
(0289) {
(0290)   PORTE |=1<<VREGEN;     //启动电压校准器  
    01A6 9A1B      SBI	0x03,3
(0291)   Delay600us();  
    01A7 940E0206  CALL	_Delay600us
(0292)   
(0293)   enable_spi();     //使能SPI口 
    01A9 940E02A5  CALL	_enable_spi
(0294)   Write_ConfigureWord(MAIN,0x78,0x00);  //先将reset位设置为低  
    01AB 2422      CLR	R2
    01AC 8228      STD	Y+0,R2
    01AD E728      LDI	R18,0x78
    01AE E100      LDI	R16,0x10
    01AF DECF      RCALL	_Write_ConfigureWord
(0295)   Write_ConfigureWord(MAIN,0xf8,0x00);  //先将reset位设置为高,完成复位过程
    01B0 2422      CLR	R2
    01B1 8228      STD	Y+0,R2
    01B2 EF28      LDI	R18,0xF8
    01B3 E100      LDI	R16,0x10
    01B4 DECA      RCALL	_Write_ConfigureWord
(0296)   disable_spi();      //禁止SPI口 
    01B5 940E02A7  CALL	_disable_spi
    01B7 9621      ADIW	R28,1
    01B8 9508      RET
(0297)   
(0298) }
(0299) 
(0300) /*******************************************
(0301) *函数功能:其他任何模式转换到掉电模式 
(0302) *输入参数:无
(0303) *输出参数:无
(0304) *返 回 值:无
(0305) ********************************************/
(0306) void AllStates_PwDown(void)   
(0307) {
(0308)   Write_Command(SXOSCOFF);
_AllStates_PwDown:
    01B9 E007      LDI	R16,7
    01BA DEAD      RCALL	_Write_Command
    01BB 9508      RET
_PwDown_Idle:
  statue               --> R20
    01BC 940E02B7  CALL	push_gset1
(0309) }
(0310) 
(0311) /*******************************************
(0312) *函数功能:从掉电模式转换到空闲模式 
(0313) *输入参数:无
(0314) *输出参数:无
(0315) *返 回 值:无
(0316) ********************************************/
(0317) void PwDown_Idle(void)
(0318) {
(0319)   unsigned char statue;
(0320)   Write_Command(SXOSCON);
    01BE E001      LDI	R16,1
    01BF DEA8      RCALL	_Write_Command
    01C0 C005      RJMP	0x01C6
(0321)   
(0322)   while(1)              //等待晶体振荡器稳定运行
(0323)   {
(0324)     statue=Read_Status();
    01C1 DEB5      RCALL	_Read_Status
    01C2 2F40      MOV	R20,R16
(0325)     if((statue&(1<<XOSC16M_STABLE))!=0)
    01C3 FF06      SBRS	R16,6
    01C4 C001      RJMP	0x01C6
(0326) 	{
(0327) 	  break;
    01C5 C001      RJMP	0x01C7
    01C6 CFFA      RJMP	0x01C1
    01C7 940E02BA  CALL	pop_gset1
    01C9 9508      RET
(0328) 	}
(0329)   }
(0330) } 
(0331) 
(0332) /*******************************************
(0333) *函数功能:从其他任何模式转换到空闲模式 
(0334) *输入参数:无
(0335) *输出参数:无
(0336) *返 回 值:无
(0337) ********************************************/
(0338) void AllStates_Idle(void)   
(0339) {
(0340)   Write_Command(SRFOFF);
_AllStates_Idle:
    01CA E006      LDI	R16,6
    01CB DE9C      RCALL	_Write_Command
    01CC 9508      RET
(0341) }   
(0342) 
(0343) /*******************************************
(0344) *函数功能:从空闲模式启动发送 
(0345) *输入参数:无
(0346) *输出参数:无
(0347) *返 回 值:无
(0348) ********************************************/
(0349) void Idle_Tx(void)  
(0350) {
(0351)   Write_Command(STXON);
_Idle_Tx:
    01CD E004      LDI	R16,4
    01CE DE99      RCALL	_Write_Command
    01CF 9508      RET
(0352) }    
(0353) 
(0354) /*******************************************
(0355) *函数功能:从接收状态转换到发送模式
(0356) *输入参数:无
(0357) *输出参数:无
(0358) *返 回 值:无
(0359) ********************************************/
(0360) void Rx_Tx(void)                     
(0361) {
_Rx_Tx:
    01D0 C005      RJMP	0x01D6
(0362)   while(1)
(0363)   {
(0364)     if(PINA&(1<<CCA)!=0)      //信道空闲
    01D1 9BC8      SBIS	0x19,0
    01D2 C003      RJMP	0x01D6
(0365)     {
(0366)     Write_Command(STXONCCA);  
    01D3 E005      LDI	R16,5
    01D4 DE93      RCALL	_Write_Command
(0367) 	break;
    01D5 C001      RJMP	0x01D7
    01D6 CFFA      RJMP	0x01D1
    01D7 9508      RET
(0368)     }
(0369)   }
(0370) } 
(0371) 
(0372) /*******************************************
(0373) *函数功能:从空闲模式启动接收模式
(0374) *输入参数:无
(0375) *输出参数:无
(0376) *返 回 值:无
(0377) ********************************************/
(0378) void Idle_Rx(void)
(0379) {
(0380)   Write_Command(SRXON);
_Idle_Rx:
    01D8 E003      LDI	R16,3
    01D9 DE8E      RCALL	_Write_Command
    01DA 9508      RET
_Set_Configure:
  RegisterValueL       --> R22
  RegisterValueH       --> R20
    01DB 940E02B5  CALL	push_gset2
    01DD 9721      SBIW	R28,1
(0381) }     
(0382) 
(0383) /*******************************************
(0384) *函数功能:设置配置字(用于初始化)
(0385) *输入参数:无
(0386) *输出参数:无
(0387) *返 回 值:无
(0388) ********************************************/
(0389) void Set_Configure(void)       
(0390) {
(0391)   unsigned char RegisterValueH,RegisterValueL;
(0392)   PowerOff();   //???????????????????????????????
    01DE DFC4      RCALL	_PowerOff
(0393)   PwOff_PwDown();  //在power down模式下设置配置寄存器
    01DF DFC5      RCALL	_PwOff_PwDown
(0394)   
(0395)   enable_spi();     //使能SPI口 
    01E0 940E02A5  CALL	_enable_spi
(0396)   
(0397)   RegisterValueH=0X0A;
    01E2 E04A      LDI	R20,0xA
(0398)   RegisterValueL=0XE2;  //地址认证使能,自动应答不使能
    01E3 EE62      LDI	R22,0xE2
(0399)   Write_ConfigureWord(MDMCTRL0,RegisterValueH,RegisterValueL); 
    01E4 8368      STD	Y+0,R22
    01E5 2F24      MOV	R18,R20
    01E6 E101      LDI	R16,0x11
    01E7 DE97      RCALL	_Write_ConfigureWord
(0400)   
(0401)   RegisterValueH=0X05;
    01E8 E045      LDI	R20,5
(0402)   RegisterValueL=0X00; 
    01E9 2766      CLR	R22
(0403)   Write_ConfigureWord(MDMCTRL1,RegisterValueH,RegisterValueL); 
    01EA 8368      STD	Y+0,R22
    01EB 2F24      MOV	R18,R20
    01EC E102      LDI	R16,0x12
    01ED DE91      RCALL	_Write_ConfigureWord
(0404)   
(0405)  // RegisterValueH=-50;
(0406)  // RegisterValueL=0X00; 
(0407)  // Write_ConfigureWord(RSSI,RegisterValueH,RegisterValueL); //???????????????????????调试时修改
(0408)   
(0409)   RegisterValueH=0x41;
    01EE E441      LDI	R20,0x41
(0410)   RegisterValueL=0X92;    //2.45GHz
    01EF E962      LDI	R22,0x92
(0411)   Write_ConfigureWord(FSCTRL,RegisterValueH,RegisterValueL); 
    01F0 8368      STD	Y+0,R22
    01F1 2F24      MOV	R18,R20
    01F2 E108      LDI	R16,0x18

⌨️ 快捷键说明

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