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

📄 jifeng_jieshou.lst

📁 非常适合实用的无线射频芯片NRF905
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0229) 	uchar i;
(0230) 	Low_nrf905_CSN;		   				// 使能Spi,允许对nrf905进行读写操作
    018E 98C4      CBI	0x18,4
(0231) 	Delay(1);
    018F E001      LDI	R16,1
    0190 E010      LDI	R17,0
    0191 DFC0      RCALL	_Delay
(0232) 	SpiReadSpiWrite(WTP);				// 写数据前先写写数据命令
    0192 E200      LDI	R16,0x20
    0193 DFD6      RCALL	_SpiReadSpiWrite
(0233) 	for (i=0;i<32;i++)
    0194 2744      CLR	R20
    0195 C009      RJMP	0x019F
(0234) 	{
(0235) 	SpiReadSpiWrite(TxRxBuffer[i]);		// 待发送的32字节数据
    0196 E781      LDI	R24,0x71
    0197 E090      LDI	R25,0
    0198 2FE4      MOV	R30,R20
    0199 27FF      CLR	R31
    019A 0FE8      ADD	R30,R24
    019B 1FF9      ADC	R31,R25
    019C 8100      LDD	R16,Z+0
    019D DFCC      RCALL	_SpiReadSpiWrite
    019E 9543      INC	R20
    019F 3240      CPI	R20,0x20
    01A0 F3A8      BCS	0x0196
(0236) 	}						
(0237) 	Hign_nrf905_CSN;
    01A1 9AC4      SBI	0x18,4
(0238) 	Delay(1);							// 关闭Spi,不允许对nrf905进行读写操作
    01A2 E001      LDI	R16,1
    01A3 E010      LDI	R17,0
    01A4 DFAD      RCALL	_Delay
(0239) 	Low_nrf905_CSN;						// 使能Spi
    01A5 98C4      CBI	0x18,4
(0240) 	SpiReadSpiWrite(WTA);				// 写地址前首先先写地址命令
    01A6 E202      LDI	R16,0x22
    01A7 DFC2      RCALL	_SpiReadSpiWrite
(0241) 	for (i=0;i<4;i++)					// 写入4 bytes 接收地址
    01A8 2744      CLR	R20
    01A9 C009      RJMP	0x01B3
(0242) 	{
(0243) 	SpiReadSpiWrite(TxAddress[i]);
    01AA E680      LDI	R24,0x60
    01AB E090      LDI	R25,0
    01AC 2FE4      MOV	R30,R20
    01AD 27FF      CLR	R31
    01AE 0FE8      ADD	R30,R24
    01AF 1FF9      ADC	R31,R25
    01B0 8100      LDD	R16,Z+0
    01B1 DFB8      RCALL	_SpiReadSpiWrite
    01B2 9543      INC	R20
    01B3 3044      CPI	R20,4
    01B4 F3A8      BCS	0x01AA
(0244) 	}
(0245) 	Hign_nrf905_CSN;					// 关闭Spi
    01B5 9AC4      SBI	0x18,4
(0246) 	Hign_nrf905_TRX_CE;					// Set TRX_CE high,start Tx data transmission
    01B6 9A95      SBI	0x12,5
(0247) 	Delay(1);							// 等待DR变高
    01B7 E001      LDI	R16,1
    01B8 E010      LDI	R17,0
    01B9 DF98      RCALL	_Delay
(0248) 	Low_nrf905_TRX_CE;					// 设置TRX_CE=0
    01BA 9895      CBI	0x12,5
    01BB D2DA      RCALL	pop_gset1
    01BC 9508      RET
(0249) }
(0250) //------------------------------设置发送模式------------------------------------
(0251) void SetTxMode(void)
(0252) {
(0253) 	Low_nrf905_TRX_CE;				//
_SetTxMode:
    01BD 9895      CBI	0x12,5
(0254) 	Hign_nrf905_TX_EN;				//发送使能
    01BE 9AC0      SBI	0x18,0
(0255) 	Delay(2); 				// delay for mode change(>=650us)
    01BF E002      LDI	R16,2
    01C0 E010      LDI	R17,0
    01C1 DF90      RCALL	_Delay
    01C2 9508      RET
(0256) }
(0257) //------------------------------设置接收模式激发--------------------------------
(0258) void SetRxMode(void)
(0259) {
(0260) 	Low_nrf905_TX_EN;
_SetRxMode:
    01C3 98C0      CBI	0x18,0
(0261) 	Hign_nrf905_TRX_CE;
    01C4 9A95      SBI	0x12,5
(0262) 	Delay(10); 					// delay for mode change(>=650us)
    01C5 E00A      LDI	R16,0xA
    01C6 E010      LDI	R17,0
    01C7 DF8A      RCALL	_Delay
    01C8 9508      RET
(0263) }
(0264) //------------------------------发送数据----------------------------------------
(0265) void TX(void)
(0266) {
(0267)      SetTxMode();	   // Set nRF905 in Tx mode
_TX:
    01C9 DFF3      RCALL	_SetTxMode
(0268) 	 TxPacket();			   // Send data by nRF905
    01CA DFC2      RCALL	_TxPacket
    01CB 9508      RET
(0269) }
(0270) //-----------------------------判断是否收到数据---------------------------------
(0271) unsigned char CheckDR(void)		//检查是否有新数据传入 
(0272) {
(0273) 	if (PINB & (1 << PB2))
_CheckDR:
    01CC 9BB2      SBIS	0x16,2
    01CD C002      RJMP	0x01D0
(0274) 	{
(0275) 		return 1; 	 	  		//收到数据
    01CE E001      LDI	R16,1
    01CF C001      RJMP	0x01D1
(0276) 	}
(0277) 	else
(0278) 	{
(0279) 		return 0;
    01D0 2700      CLR	R16
    01D1 9508      RET
_RxPacket:
  i                    --> R20
    01D2 D2C0      RCALL	push_gset1
(0280) 	}
(0281) }
(0282) //-----------------------------------读接收数据包-------------------------------
(0283) void RxPacket(void)							//读数据
(0284) {
(0285) 	uchar i;
(0286)     Low_nrf905_TRX_CE;
    01D3 9895      CBI	0x12,5
(0287) 	Low_nrf905_CSN;						    // 使能SPI
    01D4 98C4      CBI	0x18,4
(0288)     Delay(1);
    01D5 E001      LDI	R16,1
    01D6 E010      LDI	R17,0
    01D7 DF7A      RCALL	_Delay
(0289) 	SpiReadSpiWrite(RRP);				   // 写入数据接收缓冲区数据命令
    01D8 E204      LDI	R16,0x24
    01D9 DF90      RCALL	_SpiReadSpiWrite
(0290) 	for (i = 0 ;i < 4 ;i++)
    01DA 2744      CLR	R20
    01DB C00A      RJMP	0x01E6
(0291) 	{   
(0292) 	TxRxBuffer[i]=SpiReadSpiWrite(0);	  // 读取数据接收缓冲区数据       
    01DC 2700      CLR	R16
    01DD DF8C      RCALL	_SpiReadSpiWrite
    01DE E781      LDI	R24,0x71
    01DF E090      LDI	R25,0
    01E0 2FE4      MOV	R30,R20
    01E1 27FF      CLR	R31
    01E2 0FE8      ADD	R30,R24
    01E3 1FF9      ADC	R31,R25
    01E4 8300      STD	Z+0,R16
    01E5 9543      INC	R20
    01E6 3044      CPI	R20,4
    01E7 F3A0      BCS	0x01DC
(0293) 	}
(0294) 	Hign_nrf905_CSN;
    01E8 9AC4      SBI	0x18,4
(0295)     Delay(2);                            //
    01E9 E002      LDI	R16,2
    01EA E010      LDI	R17,0
    01EB DF66      RCALL	_Delay
(0296) 	Hign_nrf905_TRX_CE;							
    01EC 9A95      SBI	0x12,5
    01ED D2A8      RCALL	pop_gset1
    01EE 9508      RET
(0297) }
(0298) //--------------------------------设置接收模式----------------------------------
(0299) void  RX(void)
(0300) {
(0301)     SetRxMode();			          //设置NRF905接收模式
_RX:
    01EF DFD3      RCALL	_SetRxMode
(0302)     while (CheckDR()==0);	         //等待接收完成
    01F0 DFDB      RCALL	_CheckDR
    01F1 2300      TST	R16
    01F2 F3E9      BEQ	0x01F0
(0303) 	RxPacket();                     //读取接收数据缓冲区
    01F3 DFDE      RCALL	_RxPacket
(0304) 	Delay(10);
    01F4 E00A      LDI	R16,0xA
    01F5 E010      LDI	R17,0
    01F6 DF5B      RCALL	_Delay
    01F7 9508      RET
_LCD_Delay:
  i                    --> R20
  time                 --> R16
    01F8 D29A      RCALL	push_gset1
(0305) }
(0306) //******************************************************************************
(0307) //以下为LCD驱动
(0308) //******************************************************************************
(0309) //------------------------------------------------------------------------------
(0310) void LCD_Delay(uint time)
(0311) {
(0312) 	uint i;
(0313) 	for(i=time;i>0;i--);
    01F9 2F40      MOV	R20,R16
    01FA 2F51      MOV	R21,R17
    01FB C002      RJMP	0x01FE
    01FC 5041      SUBI	R20,1
    01FD 4050      SBCI	R21,0
    01FE 3040      CPI	R20,0
    01FF 0745      CPC	R20,R21
    0200 F7D9      BNE	0x01FC
    0201 D294      RCALL	pop_gset1
    0202 9508      RET
(0314) }
(0315) //---------------------------LCD初始化---------------------------------------
(0316) void Lcd_init(void)
(0317) {
(0318)  	DDRC=0xF8;
_Lcd_init:
    0203 EF88      LDI	R24,0xF8
    0204 BB84      OUT	0x14,R24
(0319) 	//ASSR &= ~(1 <<AS2); 
(0320) 	Hign_LCD_CS;
    0205 9AAF      SBI	0x15,7
(0321) 	Low_LCD_RESET;	 	//硬复位
    0206 98AE      CBI	0x15,6
(0322) 	LCD_Delay(50);
    0207 E302      LDI	R16,0x32
    0208 E010      LDI	R17,0
    0209 DFEE      RCALL	_LCD_Delay
(0323) 	Hign_LCD_RESET;			
    020A 9AAE      SBI	0x15,6
(0324) 	////////////////////////////////////////////////////////
(0325) 	Lcd_Write_command(0xe2);	//软复位RESet:initialize the internal functions
    020B EE02      LDI	R16,0xE2
    020C D04A      RCALL	_Lcd_Write_command
(0326) 	LCD_Delay(100);
    020D E604      LDI	R16,0x64
    020E E010      LDI	R17,0
    020F DFE8      RCALL	_LCD_Delay
(0327) 	Lcd_Write_command(0xae);	//DISPLAY OFF 
    0210 EA0E      LDI	R16,0xAE
    0211 D045      RCALL	_Lcd_Write_command
(0328) 	Lcd_Write_command(0xa1);	//ADC SELECT ON
    0212 EA01      LDI	R16,0xA1
    0213 D043      RCALL	_Lcd_Write_command
(0329) 	Lcd_Write_command(0xc0);	//SHL SELECT COM64-COM1
    0214 EC00      LDI	R16,0xC0
    0215 D041      RCALL	_Lcd_Write_command
(0330) 	Lcd_Write_command(0xa2);	//SET LCD BIAS(1/9)
    0216 EA02      LDI	R16,0xA2
    0217 D03F      RCALL	_Lcd_Write_command
(0331) 	//////////////////////////////////////////////////////
(0332) 	Lcd_Write_command(0x2c);//SET POWER CONTROL(VC=1)
    0218 E20C      LDI	R16,0x2C
    0219 D03D      RCALL	_Lcd_Write_command
(0333) 	Lcd_Write_command(0x2e);	//SET POWER CONTROL(VR=1)
    021A E20E      LDI	R16,0x2E
    021B D03B      RCALL	_Lcd_Write_command
(0334) 	Lcd_Write_command(0x2f);	//SET POWER CONTROL(VF=1)
    021C E20F      LDI	R16,0x2F
    021D D039      RCALL	_Lcd_Write_command
(0335) 	////////////////////////////////////////////////////////
(0336) 	Lcd_Write_command(0x26);	//REGULATOR RESISTOR SELECT(R2 R1 R0)=110
    021E E206      LDI	R16,0x26
    021F D037      RCALL	_Lcd_Write_command
(0337) 	Lcd_Write_command(0x81);	//SET REFERENCE VOLTAGE MODE	
    0220 E801      LDI	R16,0x81
    0221 D035      RCALL	_Lcd_Write_command
(0338) 	Lcd_Write_command(0x3f);	//SET REFERENCE VOLTAGE REGISTER 2ch
    0222 E30F      LDI	R16,0x3F
    0223 D033      RCALL	_Lcd_Write_command
(0339) 	//////////////////////////////////////////////////////
(0340) 	Lcd_Write_command(0x7f);	//START DISPLAY LINE(COM1)  起始行
    0224 E70F      LDI	R16,0x7F
    0225 D031      RCALL	_Lcd_Write_command
(0341) 	//////////////////////////////////////////////////////
(0342) 	Lcd_Write_command(0xe0);	//写入数据时地址自动加1,读数据时不变
    0226 EE00      LDI	R16,0xE0
    0227 D02F      RCALL	_Lcd_Write_command
(0343) 	//////////////////////////////////////////////////////////
(0344) 	Lcd_Write_command(0xaf);	//DISPLAY ON  
    0228 EA0F      LDI	R16,0xAF
    0229 D02D      RCALL	_Lcd_Write_command
    022A 9508      RET
_Lcd_Write_Data:
  i                    --> R20
  temp                 --> R22
  DATA                 --> R20
    022B D265      RCALL	push_gset2
    022C 2F40      MOV	R20,R16
(0345) }
(0346) //--------------------------------LCD写数据函数---------------------------------
(0347) void Lcd_Write_Data(uchar DATA)              //写一个字节,再加一列,正好在一页
(0348) {                                            //定好一页后,再一列一列的写
(0349) 	int i,temp;
(0350) 	temp=DATA;
    022D 2F64      MOV	R22,R20
    022E 2777      CLR	R23
(0351) 	Low_LCD_RS;		
    022F 98AD      CBI	0x15,5
(0352) 	Hign_LCD_CS;
    0230 9AAF      SBI	0x15,7
(0353) 	Hign_LCD_SCL;
    0231 9AAC      SBI	0x15,4
(0354) 	LCD_Delay(1);
    0232 E001      LDI	R16,1
    0233 E010      LDI	R17,0
    0234 DFC3      RCALL	_LCD_Delay
(0355) 	Low_LCD_CS;
    0235 98AF      CBI	0x15,7
(0356) 	Low_LCD_SCL;
    0236 98AC      CBI	0x15,4
(0357) 	Hign_LCD_RS;		//RS=1 时为写数据
    0237 9AAD      SBI	0x15,5
(0358) 	LCD_Delay(1);
    0238 E001      LDI	R16,1
    0239 E010      LDI	R17,0
    023A DFBD      RCALL	_LCD_Delay
(0359) 	for(i=0;i<8;i++)
    023B 2744      CLR	R20
    023C 2755      CLR	R21
(0360) 	{
(0361) 		Low_LCD_SCL;
    023D 98AC      CBI	0x15,4
(0362) 		if(temp&0x80)
    023E FF67      SBRS	R22,7
    023F C002      RJMP	0x0242
(0363) 		{
(0364) 		Hign_LCD_SI;
    0240 9AAB      SBI	0x15,3
(0365) 		}
    0241 C001      RJMP	0x0243
(0366) 		else
(0367) 		{
(0368) 		Low_LCD_SI;

⌨️ 快捷键说明

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