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

📄 洗衣机.lst

📁 自己做的AVR洗衣机模型程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0182) 	GICR=0X40;
     372 E480      LDI	R24,0x40
     373 BF8B      OUT	0x3B,R24
     374 9508      RET
(0183) }
(0184) 
(0185) void init_sys()
(0186) {
(0187) 	DDRD|=0X02;//串口发送TX为输出
_init_sys:
     375 9A89      SBI	0x11,1
(0188)  	CE_0;   // 清零CE,处于待机状态
     376 B38B      IN	R24,0x1B
     377 7F8D      ANDI	R24,0xFD
     378 BB8B      OUT	0x1B,R24
(0189)  	CSN_0;  //清零CSN,
     379 B388      IN	R24,0x18
     37A 7E8F      ANDI	R24,0xEF
     37B BB88      OUT	0x18,R24
     37C 9508      RET
_SPI_RW_Reg:
  a                    --> R10
  value                --> R12
  reg                  --> R10
     37D 92AA      ST	R10,-Y
     37E 92CA      ST	R12,-Y
     37F 2EC2      MOV	R12,R18
     380 2EA0      MOV	R10,R16
(0190) }
(0191) 
(0192) 
(0193) 
(0194) /**************************************************
(0195) Function: SPI_RW_Reg();
(0196) 
(0197) Description:
(0198)   Writes value 'value' to register 'reg'
(0199) /**************************************************/
(0200) 
(0201) uchar SPI_RW_Reg(BYTE reg, BYTE value)
(0202) {
(0203)  	uchar a;
(0204) 	CSN_0;
     381 B388      IN	R24,0x18
     382 7E8F      ANDI	R24,0xEF
     383 BB88      OUT	0x18,R24
(0205)    	a=send_spi(reg); 
     384 2D0A      MOV	R16,R10
     385 DFE3      RCALL	_send_spi
     386 2EA0      MOV	R10,R16
(0206)    	send_spi(value);             // ..and write value to it..
     387 2D0C      MOV	R16,R12
     388 DFE0      RCALL	_send_spi
(0207) 	CSN_1;
     389 9AC4      SBI	0x18,4
(0208) 	return(a);            // return nRF24L01 status byte
     38A 2D0A      MOV	R16,R10
     38B 90C9      LD	R12,Y+
     38C 90A9      LD	R10,Y+
     38D 9508      RET
_SPI_Read:
  reg_val              --> R10
  reg                  --> R10
     38E 92AA      ST	R10,-Y
     38F 2EA0      MOV	R10,R16
(0209) }
(0210) /**************************************************/
(0211) 
(0212) /**************************************************/
(0213) BYTE SPI_Read(BYTE reg)
(0214) {
(0215)    
(0216)  	BYTE reg_val;
(0217)    	CSN_0;//CSN IS LOW
     390 B388      IN	R24,0x18
     391 7E8F      ANDI	R24,0xEF
     392 BB88      OUT	0x18,R24
(0218)    	send_spi(reg);            // Select register to read from..
     393 2D0A      MOV	R16,R10
     394 DFD4      RCALL	_send_spi
(0219)    	reg_val=send_spi(0);    // ..then read registervalue
     395 2700      CLR	R16
     396 DFD2      RCALL	_send_spi
     397 2EA0      MOV	R10,R16
(0220) 	CSN_1;
     398 9AC4      SBI	0x18,4
(0221) 	return(reg_val);        // return register value
     399 2D0A      MOV	R16,R10
     39A 90A9      LD	R10,Y+
     39B 9508      RET
_SPI_Read_Buf:
  status               --> R10
  byte_ctr             --> R12
  bytes                --> Y,+6
  pBuf                 --> R14
  reg                  --> R10
     39C 940E 0AD6 CALL	push_xgset00FC
     39E 0179      MOVW	R14,R18
     39F 2EA0      MOV	R10,R16
(0222) }
(0223) /*
(0224) 
(0225) /**************************************************
(0226) Function: SPI_Read_Buf();
(0227) 
(0228) Description:
(0229)   Reads 'bytes' #of bytes from register 'reg'
(0230)   Typically used to read RX payload, Rx/Tx address
(0231) /**************************************************/
(0232) uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
(0233) {
(0234)  	uchar status,byte_ctr;
(0235)  	CSN_0;//CSN IS LOW
     3A0 B388      IN	R24,0x18
     3A1 7E8F      ANDI	R24,0xEF
     3A2 BB88      OUT	0x18,R24
(0236)    	status=send_spi(reg);         // Select register to write to and read status byte
     3A3 2D0A      MOV	R16,R10
     3A4 DFC4      RCALL	_send_spi
     3A5 2EA0      MOV	R10,R16
(0237) 	for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
     3A6 24CC      CLR	R12
     3A7 C008      RJMP	0x03B0
(0238)    		pBuf[byte_ctr] = send_spi(0);    // Perform SPI_RW to read byte from nRF24L01
     3A8 2700      CLR	R16
     3A9 DFBF      RCALL	_send_spi
     3AA 2DEC      MOV	R30,R12
     3AB 27FF      CLR	R31
     3AC 0DEE      ADD	R30,R14
     3AD 1DFF      ADC	R31,R15
     3AE 8300      STD	Z+0,R16
     3AF 94C3      INC	R12
     3B0 800E      LDD	R0,Y+6
     3B1 14C0      CP	R12,R0
     3B2 F3A8      BCS	0x03A8
(0239) 	CSN_1;
     3B3 9AC4      SBI	0x18,4
(0240) 	return(status);
     3B4 2D0A      MOV	R16,R10
     3B5 940C 0AC0 JMP	pop_xgset00FC
_SPI_Write_Buf:
  status               --> R10
  byte_ctr             --> R12
  bytes                --> Y,+6
  pBuf                 --> R14
  reg                  --> R10
     3B7 940E 0AD6 CALL	push_xgset00FC
     3B9 0179      MOVW	R14,R18
     3BA 2EA0      MOV	R10,R16
(0241) }
(0242) /**************************************************/
(0243) 
(0244) /**************************************************
(0245) Function: SPI_Write_Buf();
(0246) 
(0247) Description:
(0248)   Writes contents of buffer '*pBuf' to nRF24L01
(0249)   Typically used to write TX payload, Rx/Tx address
(0250) /**************************************************/
(0251) 
(0252) uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
(0253) {
(0254)  	uchar status,byte_ctr;
(0255)  	CSN_0;//CSN IS LOW
     3BB B388      IN	R24,0x18
     3BC 7E8F      ANDI	R24,0xEF
     3BD BB88      OUT	0x18,R24
(0256)  	status=send_spi(reg);    // Select register to write to and read status byte写的过程顺便读读寄存器状态
     3BE 2D0A      MOV	R16,R10
     3BF DFA9      RCALL	_send_spi
     3C0 2EA0      MOV	R10,R16
(0257) 	for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all byte in buffer(*pBuf)
     3C1 24CC      CLR	R12
     3C2 C005      RJMP	0x03C8
(0258)   		send_spi(*pBuf++);
     3C3 01F7      MOVW	R30,R14
     3C4 9101      LD	R16,Z+
     3C5 017F      MOVW	R14,R30
     3C6 DFA2      RCALL	_send_spi
     3C7 94C3      INC	R12
     3C8 800E      LDD	R0,Y+6
     3C9 14C0      CP	R12,R0
     3CA F3C0      BCS	0x03C3
(0259) 	CSN_1;
     3CB 9AC4      SBI	0x18,4
(0260) 	return(status);
     3CC 2D0A      MOV	R16,R10
     3CD 940C 0AC0 JMP	pop_xgset00FC
(0261) }
(0262) /**************************************************/
(0263) 
(0264) void init_24l01()
(0265) {
(0266)   	SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0(数据通道0自动应答允许)
_init_24l01:
     3CF E021      LDI	R18,1
     3D0 E201      LDI	R16,0x21
     3D1 DFAB      RCALL	_SPI_RW_Reg
(0267)    	SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0(接收数据通道0允许)
     3D2 E021      LDI	R18,1
     3D3 E202      LDI	R16,0x22
     3D4 DFA8      RCALL	_SPI_RW_Reg
(0268)    	SPI_RW_Reg(WRITE_REG + RF_CH, 40);        // Select RF channel 40(设置工作通道频率为40)
     3D5 E228      LDI	R18,0x28
     3D6 E205      LDI	R16,0x25
     3D7 DFA5      RCALL	_SPI_RW_Reg
(0269)   	SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width RX0通道有效数据宽度与TX设置相同
     3D8 E022      LDI	R18,2
     3D9 E301      LDI	R16,0x31
     3DA DFA2      RCALL	_SPI_RW_Reg
(0270)    	SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);   // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR数据传输率2Mbps发射功率0dbm低噪声放大增益
     3DB E02F      LDI	R18,0xF
     3DC E206      LDI	R16,0x26
     3DD DF9F      RCALL	_SPI_RW_Reg
     3DE 9508      RET
_RX_Mode:
     3DF 9721      SBIW	R28,1
(0271) }
(0272) //CRC使能、8位CRC校验、模式为掉电、不屏蔽任何中断reserved
(0273) //接收发射地址宽度:5字节SET-UP_AW
(0274) //自动重发延时:250+86US,自动重发次数:3次SET-UP_RETR
(0275) //发送地址与数据通道0接收地址初始值均相同
(0276) /**************************************************
(0277) Function: RX_Mode();
(0278) 
(0279) Description:
(0280)   This function initializes one nRF24L01 device to
(0281)   RX Mode, set RX address, writes RX payload width,
(0282)   select RF channel, datarate & LNA HCURR.
(0283)   After init, CE is toggled high, which means that
(0284)   this device is now ready to receive a datapacket.
(0285) /**************************************************/
(0286) 
(0287) void RX_Mode(void)
(0288) {
(0289)    	CE_0; 
     3E0 B38B      IN	R24,0x1B
     3E1 7F8D      ANDI	R24,0xFD
     3E2 BB8B      OUT	0x1B,R24
(0290)    	SPI_Write_Buf((WRITE_REG + RX_ADDR_P0), TX_ADDRESS, TX_ADR_WIDTH); //Use the same address on the RX device as the TX device
     3E3 E085      LDI	R24,5
     3E4 8388      STD	Y+0,R24
     3E5 E62A      LDI	R18,0x6A
     3E6 E030      LDI	R19,0
     3E7 E20A      LDI	R16,0x2A
     3E8 DFCE      RCALL	_SPI_Write_Buf
(0291)    	SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..
     3E9 E02F      LDI	R18,0xF
     3EA E200      LDI	R16,0x20
     3EB DF91      RCALL	_SPI_RW_Reg
(0292)    	CE_1; // Set CE 
     3EC 9AD9      SBI	0x1B,1
     3ED 9621      ADIW	R28,1
     3EE 9508      RET
_TX_Mode:
     3EF 9721      SBIW	R28,1
(0293) }
(0294) /**************************************************/
(0295) 
(0296) /**************************************************
(0297) Function: TX_Mode();
(0298) 
(0299) Description:
(0300)   This function initializes one nRF24L01 device to
(0301)   TX mode, set TX address, set RX address for auto.ack,
(0302)   fill TX payload, select RF channel, datarate & TX pwr.
(0303)   PWR_UP is set, CRC(2 bytes) is enabled, & PRIM:TX.
(0304) 
(0305)   ToDo: One high pulse(>10us) on CE will now send this
(0306)   packet and expext an acknowledgment from the RX device.
(0307) /**************************************************/
(0308) 
(0309) void TX_Mode(void)
(0310) {
(0311)    	CE_0;
     3F0 B38B      IN	R24,0x1B
     3F1 7F8D      ANDI	R24,0xFD
     3F2 BB8B      OUT	0x1B,R24
(0312)    	SPI_Write_Buf((WRITE_REG + TX_ADDR), TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01
     3F3 E085      LDI	R24,5
     3F4 8388      STD	Y+0,R24
     3F5 E62A      LDI	R18,0x6A
     3F6 E030      LDI	R19,0
     3F7 E300      LDI	R16,0x30
     3F8 DFBE      RCALL	_SPI_Write_Buf
(0313)    	SPI_Write_Buf((WRITE_REG + RX_ADDR_P0), TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
     3F9 E085      LDI	R24,5
     3FA 8388      STD	Y+0,R24
     3FB E62A      LDI	R18,0x6A
     3FC E030      LDI	R19,0
     3FD E20A      LDI	R16,0x2A
     3FE DFB8      RCALL	_SPI_Write_Buf
(0314)    	SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // Writes data to TX payload
     3FF E082      LDI	R24,2
     400 8388      STD	Y+0,R24
     401 E828      LDI	R18,0x88
     402 E031      LDI	R19,1
     403 EA00      LDI	R16,0xA0
     404 DFB2      RCALL	_SPI_Write_Buf
(0315)    	SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);     // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..
     405 E02E      LDI	R18,0xE
     406 E200      LDI	R16,0x20
     407 DF75      RCALL	_SPI_RW_Reg
(0316)    	delay(1);
     408 E001      LDI	R16,1
     409 E010      LDI	R17,0
     40A DF41      RCALL	_delay
(0317)    	CE_1;
     40B 9AD9      SBI	0x1B,1
     40C 9621      ADIW	R28,1
     40D 9508      RET
FILE: F:\AVR洗衣机\洗衣机主机\driver.h
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include <bit.h>
(0004) #include "define.h"
(0005) #include "LCD_Driver.h"
(0006) #include "Sounds_and_Display.h"
(0007) #include "key.h"
(0008) #include "PWM.h"
(0009) #include "24L01_Driver.h"
(0010) #define out_o_not	   if(flag_start==0)break
(0011) #define PWM_off	   TCCR1A=0x00;TCCR1B = 0x00;DDR_PD4=0 //stop
(0012) #define PWM_on	   TCCR1A=0x23;TCCR1B = 0x1A;DDR_PD4=1 //start
(0013) uchar data_buff[2];
(0014) 
(0015) void Port_close(void)
(0016) {
(0017)  PORTA = 0x00;
_Port_close:
     40E 2422      CLR	R2
     40F BA2B      OUT	0x1B,R2
(0018)  DDRA  = 0x00;
     410 BA2A      OUT	0x1A,R2
(0019)  PORTB = 0x00;
     411 BA28      OUT	0x18,R2
(0020)  DDRB  = 0x00;
     412 BA27      OUT	0x17,R2
(0021)  PORTC = 0x00;
     413 BA25      OUT	0x15,R2
(0022)  DDRC  = 0x00;
     414 BA24      OUT	0x14,R2
(0023)  PORTD = 0x00;
     415 BA22      OUT	0x12,R2
(0024)  DDRD  = 0x00;
     416 BA21      OUT	0x11,R2
     417 9508      RET
(0025) }
(0026) 
(0027) void timer0_init(void)
(0028) {
(0029)  TCNT0 = 0x06; //set count
_timer0_init:
     418 E086      LDI	R24,6
     419 BF82      OUT	0x32,R24
(0030)  TIMSK|=BIT(0);
     41A B789      IN	R24,0x39
     41B 6081      ORI	R24,1
     41C BF89      OUT	0x39,R24
(0031)  SREG|=BIT(7); 
     41D 9478      BSET	7
     41E 9508      RET
_set_watlev:
     41F 934A      ST	R20,-Y
     420 935A      ST	R21,-Y
     421 9722      SBIW	R28,2
(0032) }
(0033) 
(0034) void set_watlev()//水位高3中2低1
(0035) {
(0036) cls;
     422 E081      LDI	R24,1
     423 8388      STD	Y+0,R24
     424 2722      CLR	R18
     425 2700      CLR	R16
     426 DD6A      RCALL	_W_1byte
(0037) Delay(2);
     427 E002      LDI	R16,2
     428 E010      LDI	R17,0
     429 DDDE      RCALL	_Delay
(0038) Char_Set_XY(0,1,"水位设置:");
     42A E68B      LDI	R24,0x6B
     42B E091      LDI	R25,1
     42C 8399      STD	Y+1,R25
     42D 8388      STD	Y+0,R24
     42E E021      LDI	R18,1
     42F 2700      CLR	R16
     430 DCA7      RCALL	_Char_Set_XY
(0039) switch(wat_lv)
     431 9140 0060 LDS	R20,wat_lv
     433 2755      CLR	R21
     434 3041      CPI	R20,1
     435 E0E0      LDI	R30,0
     436 075E      CPC	R21,R30
     437 F0C9      BEQ	0x0451
     438 3042      CPI	R20,2
     439 E0E0      LDI	R30,0
     43A 075E      CPC	R21,R30
     43B F069      BEQ	0x0449
     43C 3043      CPI	R20,3
     43D E0E0      LDI	R30,0
     43E 075E      CPC	R21,R30
     43F F009      BEQ	0x0441
     440 C017      RJMP	0x0458
(0040) 		{ 
(0041)     	 case 3:Char_Set_XY(5,1,"高");break;
     441 E688      LDI	R24,0x68
     442 E091      LDI	R25,1
     443 8399      STD	Y+1,R25
     444 8388      STD	Y+0,R24
     445 E021      LDI	R18,1
     446 E005      LDI	R16,5
     447 DC90      RCALL	_Char_Set_XY
     448 C00F      RJMP	0x0458
(0042) 	     case 2:Char_Set_XY(5,1,"中");break;
     449 E685      LDI	R24,0x65
     44A E091      LDI	R25,1
     44B 8399      STD	Y+1,R25
     44C 8388      STD	Y+0,R24
     44D E021      LDI	R18,1
     44E E005      LDI	R16,5
     44F DC88      RCALL	_Char_Set_XY
     450 C007      RJMP	0x0458
(0043)     	 case 1:Char_Set_XY(5,1,"低");break;
     451 E682      LDI	R24,0x62
     452 E091      LDI	R25,1
     453 8399      STD	Y+1,R25
     454 8388      STD	Y+0,R24

⌨️ 快捷键说明

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