?? 洗衣機.lst
字號:
(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 + -