📄 nrf2401.lst
字号:
0342 2766 CLR R22
0343 C02F RJMP 0x0373
(0050) case 116:kk=6;displayint(0x98,kk);KeyValue=0;break;
0344 E086 LDI R24,6
0345 2EA8 MOV R10,R24
0346 2F28 MOV R18,R24
0347 2733 CLR R19
0348 E908 LDI R16,0x98
0349 E010 LDI R17,0
034A DDC7 RCALL _displayint
034B 2766 CLR R22
034C C026 RJMP 0x0373
(0051) case 108:kk=7;displayint(0x98,kk);KeyValue=0;break;
034D E087 LDI R24,7
034E 2EA8 MOV R10,R24
034F 2F28 MOV R18,R24
0350 2733 CLR R19
0351 E908 LDI R16,0x98
0352 E010 LDI R17,0
0353 DDBE RCALL _displayint
0354 2766 CLR R22
0355 C01D RJMP 0x0373
(0052) case 117:kk=8;displayint(0x98,kk);KeyValue=0;break;
0356 E088 LDI R24,0x8
0357 2EA8 MOV R10,R24
0358 2F28 MOV R18,R24
0359 2733 CLR R19
035A E908 LDI R16,0x98
035B E010 LDI R17,0
035C DDB5 RCALL _displayint
035D 2766 CLR R22
035E C014 RJMP 0x0373
(0053) case 125:kk=9;displayint(0x98,kk);KeyValue=0;break;
035F E089 LDI R24,0x9
0360 2EA8 MOV R10,R24
0361 2F28 MOV R18,R24
0362 2733 CLR R19
0363 E908 LDI R16,0x98
0364 E010 LDI R17,0
0365 DDAC RCALL _displayint
0366 2766 CLR R22
0367 C00B RJMP 0x0373
(0054) case 90: kk='k'; KeyValue=0;
0368 E68B LDI R24,0x6B
0369 2EA8 MOV R10,R24
036A 2766 CLR R22
(0055) lcd_write_comm(0x98);
036B E908 LDI R16,0x98
036C E010 LDI R17,0
036D DE4C RCALL _lcd_write_comm
(0056) lcd_write_data('k');
036E E60B LDI R16,0x6B
036F E010 LDI R17,0
0370 DE34 RCALL _lcd_write_data
(0057) break;
0371 C001 RJMP 0x0373
(0058) default :KeyValue=0;break;
0372 2766 CLR R22
0373 CF26 RJMP 0x029A
0374 9622 ADIW R28,2
0375 9508 RET
_int0_isr:
0376 922A ST R2,-Y
0377 923A ST R3,-Y
0378 924A ST R4,-Y
0379 938A ST R24,-Y
037A 939A ST R25,-Y
037B 93EA ST R30,-Y
037C 93FA ST R31,-Y
037D B62F IN R2,0x3F
037E 922A ST R2,-Y
(0059) }
(0060)
(0061)
(0062) }
(0063) }
(0064)
(0065)
(0066) #pragma interrupt_handler int0_isr:2
(0067) void int0_isr(void)
(0068) {
(0069) static unsigned char IntNum=0,index=0;
(0070)
(0071) if((IntNum>0)&&(IntNum<9))
037F 2422 CLR R2
0380 903000A3 LDS R3,IntNum
0382 1423 CP R2,R3
0383 F4C8 BCC 0x039D
0384 2D83 MOV R24,R3
0385 3089 CPI R24,0x9
0386 F4B0 BCC 0x039D
(0072) {
(0073) KeyI[index]>>=1;
0387 EB89 LDI R24,0xB9
0388 E090 LDI R25,0
0389 902000A4 LDS R2,index
038B 2433 CLR R3
038C 0E28 ADD R2,R24
038D 1E39 ADC R3,R25
038E 01F1 MOVW R30,R2
038F 8040 LDD R4,Z+0
0390 9446 LSR R4
0391 8240 STD Z+0,R4
(0074) if(PINB&0x80)
0392 9BB7 SBIS 0x16,7
0393 C009 RJMP 0x039D
(0075) KeyI[index]|=0x80;
0394 902000A4 LDS R2,index
0396 2433 CLR R3
0397 0E28 ADD R2,R24
0398 1E39 ADC R3,R25
0399 01F1 MOVW R30,R2
039A 8180 LDD R24,Z+0
039B 6880 ORI R24,0x80
039C 8380 STD Z+0,R24
(0076) }
(0077)
(0078) IntNum++;
039D 918000A3 LDS R24,IntNum
039F 5F8F SUBI R24,0xFF
03A0 938000A3 STS IntNum,R24
(0079) // while (!Key_CLK); //等待PS/2CLK拉高 use??????
(0080) if(IntNum>10)
03A2 E08A LDI R24,0xA
03A3 902000A3 LDS R2,IntNum
03A5 1582 CP R24,R2
03A6 F488 BCC 0x03B8
(0081) {
(0082) IntNum=0;
03A7 2422 CLR R2
03A8 922000A3 STS IntNum,R2
(0083) index++;
03AA 918000A4 LDS R24,index
03AC 5F8F SUBI R24,0xFF
03AD 938000A4 STS index,R24
(0084) if(index==3)
03AF 3083 CPI R24,3
03B0 F439 BNE 0x03B8
(0085) {
(0086) IntNum=0;
03B1 922000A3 STS IntNum,R2
(0087) index=0;
03B3 922000A4 STS index,R2
(0088) KeyFlag=1;
03B5 E081 LDI R24,1
03B6 938000A1 STS KeyFlag,R24
(0089) }
(0090) }
03B8 9029 LD R2,Y+
03B9 BE2F OUT 0x3F,R2
03BA 91F9 LD R31,Y+
03BB 91E9 LD R30,Y+
03BC 9199 LD R25,Y+
03BD 9189 LD R24,Y+
03BE 9049 LD R4,Y+
03BF 9039 LD R3,Y+
03C0 9029 LD R2,Y+
03C1 9518 RETI
_nrf2401A_WR:
i --> R20
temp --> R22
val --> R16
03C2 D0F0 RCALL push_gset2
FILE: F:\programme\nrf2401\nrf2401.c
(0001) #include "config.h"
(0002)
(0003) //extern void DelayMs(uchar ms);
(0004) //extern void DelayUs(uint us);
(0005)
(0006) //注意:
(0007) //1、nef2401A配置字是先写第15字节的!!
(0008) //2、发送后要延时等发送结束后才能转回接收模式,否则数据发送不出
(0009)
(0010)
(0011) #define SIZE 20 //最大数据包长度 32-ADDR4-CRC2=26Byte 25
(0012) #define ADDRSIZE 4 //地址长度Byte
(0013)
(0014) #define CH_NO 2 //频段编号
(0015)
(0016) #define BPS_1M //编译控制:1M or 250Kbps
(0017)
(0018) uchar TxBuf[SIZE]={101,102,103,104,105,106,107,108,109,110,
(0019) 111,112,113,114,115,116,117,118,119,120};
(0020) uchar RxBuf[SIZE];
(0021)
(0022) /*-------------------------------------------------------------------------------------------
(0023) nrf2401A配置寄存器宏定义
(0024) nrf2401A配置寄存器(15Byte)
(0025) 工作频率f=2.4G+CH_NO*1MHz
(0026) -------------------------------------------------------------------------------------------*/
(0027) #define RX_ADDRESS 0xCCCCCCCC //接收有效地址(本方)
(0028) #define TX_ADDRESS 0xCCCCCCCC //发送有效地址(对方)
(0029)
(0030) #define CH_NO_FREQ CH_NO<<1 //工作频段 Byte1.7-2
(0031) #define RX_EN 1 //接收发送切换 Byte1.0 1接收 0发送
(0032)
(0033) #define RX2EN_YES 128 //第2接收通道使能1 Byte2.7
(0034) #define RX2EN_NO 0 //第2接收通道使能0 Byte2.7
(0035) #define CM_SHOCK 64 //收发模式ShockBurst Byte2.6
(0036) #define CM_DIRECT 0 //收发模式DirectMode Byte2.6
(0037) #define RFDR_1M 32 //空中Baud=1M Byte2.5
(0038) #define RFDR_250K 0 //空中Baud=250K Byte2.5
(0039) #define XOF_20MHz 4*4 //晶体振荡器频率20MHz Byte2.4~2
(0040) #define XOF_16MHz 3*4 //晶体振荡器频率16MHz
(0041) #define XOF_12MHz 2*4 //晶体振荡器频率12MHz
(0042) #define XOF_8MHz 1*4 //晶体振荡器频率8MHz
(0043) #define XOF_4MHz 0*4 //晶体振荡器频率4MHz
(0044) #define PA_PWR_0 0 //输出功率-20dBm Byte2.1~0
(0045) #define PA_PWR_1 1 //输出功率-10dBm
(0046) #define PA_PWR_2 2 //输出功率-5dBm
(0047) #define PA_PWR_3 3 //输出功率 0dBm
(0048)
(0049) #define ADDR_W (ADDRSIZE<<5) //地址位数 Byte3.7~2
(0050) #define CRC_MODE_16BIT 2 //CRC16模式 Byte3.1 1
(0051) #define CRC_MODE_8BIT 0 //CRC8模式 Byte3.1
(0052) #define CRC_EN 1 //CRC使能 Byte3.0 1
(0053) #define CRC16_EN 3 //CRC16模式使能
(0054) #define CRC8_EN 1 //CRC8模式使能
(0055)
(0056) #define RX_ADDRESS_0 RX_ADDRESS & 0xff //通道1接收有效地址第1字节 Byte4
(0057) #define RX_ADDRESS_1 (RX_ADDRESS >> 8) & 0xff //通道1接收有效地址第2字节 Byte5
(0058) #define RX_ADDRESS_2 (RX_ADDRESS >> 16) & 0xff //通道1接收有效地址第3字节 Byte6
(0059) #define RX_ADDRESS_3 RX_ADDRESS >> 24 //通道1接收有效地址第4字节 Byte7
(0060) #define RX_ADDRESS_4 0 //通道1接收有效地址第5字节 Byte8
(0061)
(0062) #define RX_ADDRESS2 0 //Byte9,10,11,12,13字节为通道2接收地址
(0063)
(0064) #define DATA1_W SIZE*8 //接收通道1数据包长度,Bit计算 Byte14
(0065) #define DATA2_W SIZE*8 //接收通道2数据包长度,Bit计算 Byte15
(0066)
(0067) #define TX_ADDRESS_4 0 //发送有效地址第5字节
(0068) #define TX_ADDRESS_3 TX_ADDRESS >> 24 //发送有效地址第4字节
(0069) #define TX_ADDRESS_2 (TX_ADDRESS >> 16) & 0xff //发送有效地址第3字节
(0070) #define TX_ADDRESS_1 (TX_ADDRESS >> 8) & 0xff //发送有效地址第2字节
(0071) #define TX_ADDRESS_0 TX_ADDRESS & 0xff //发送有效地址第1字节
(0072)
(0073)
(0074) //写1Byte
(0075) void nrf2401A_WR(uchar val)
(0076) {uchar temp,i;
(0077) //MSB first 高位开始,先输出DATA,然后CLK_Up,再CLK_Dn
(0078) SET(DDRC,DATA);//置DATA输出
03C3 9AA3 SBI 0x14,3
(0079) temp=val;
03C4 2F60 MOV R22,R16
(0080)
(0081) for (i=0;i<8;i++)
03C5 2744 CLR R20
03C6 C011 RJMP 0x03D8
(0082) {
(0083) if ((temp&0x80)>0)
03C7 2422 CLR R2
03C8 2F86 MOV R24,R22
03C9 7880 ANDI R24,0x80
03CA 1628 CP R2,R24
03CB F410 BCC 0x03CE
(0084) SET(PORTC,DATA);
03CC 9AAB SBI 0x15,3
03CD C001 RJMP 0x03CF
(0085) else
(0086) CLR(PORTC,DATA);
03CE 98AB CBI 0x15,3
(0087)
(0088) NOP();
03CF 0000 NOP
(0089) SET(PORTC,CLK1);
03D0 9AA9 SBI 0x15,1
(0090) NOP();
03D1 0000 NOP
(0091) NOP();
03D2 0000 NOP
(0092) NOP();
03D3 0000 NOP
(0093) NOP();
03D4 0000 NOP
(0094) CLR(PORTC,CLK1);
03D5 98A9 CBI 0x15,1
(0095)
(0096) temp=temp<<1;
03D6 0F66 LSL R22
03D7 9543 INC R20
03D8 3048 CPI R20,0x8
03D9 F368 BCS 0x03C7
03DA D0CC RCALL pop_gset2
03DB 9508 RET
(0097) }
(0098) }
(0099)
(0100) //读1Byte
(0101) uchar nrf2401A_RD()
(0102) {uchar temp=0,i;
_nrf2401A_RD:
i --> R16
temp --> R18
03DC 2722 CLR R18
(0103) //MSB first 高位开始,先读入DATA,然后CLK_Up,再CLK_Dn
(0104) CLR(DDRC,DATA);//置DATA输入
03DD 98A3 CBI 0x14,3
(0105) temp=0;
(0106)
(0107) for (i=0;i<8;i++)
03DE 2700 CLR R16
03DF C00C RJMP 0x03EC
(0108) {
(0109) temp=temp<<1;
03E0 0F22 LSL R18
(0110) if ((PINC&(1<<DATA)))
03E1 9B9B SBIS 0x13,3
03E2 C002 RJMP 0x03E5
(0111) temp=temp|0x01;
03E3 6021 ORI R18,1
03E4 C001 RJMP 0x03E6
(0112) else temp=temp&0xfe;
03E5 7F2E ANDI R18,0xFE
(0113)
(0114) SET(PORTC,CLK1);
03E6 9AA9 SBI 0x15,1
(0115) NOP();
03E7 0000 NOP
(0116) NOP();
03E8 0000 NOP
(0117) NOP();
03E9 0000 NOP
(0118) CLR(PORTC,CLK1);
03EA 98A9 CBI 0x15,1
03EB 9503 INC R16
03EC 3008 CPI R16,0x8
03ED F390 BCS 0x03E0
(0119) }
(0120)
(0121) return temp;
03EE 2F02 MOV R16,R18
03EF 9508 RET
(0122) }
(0123)
(0124) //PwrDown->StandBy
(0125) void nrf2401A_StandBy()
(0126) {
(0127) SET(PORTB,PWR);
_nrf2401A_StandBy:
03F0 9AC6 SBI 0x18,6
(0128) CLR(PORTD,CE);
03F1 9894 CBI 0x12,4
(0129) CLR(PORTB,CS);
03F2 98C1 CBI 0x18,1
03F3 9508 RET
(0130) }
(0131)
(0132) //->PwrDown
(0133) void nrf2401A_Off()
(0134) {
(0135) CLR(PORTB,PWR);
_nrf2401A_Off:
03F4 98C6 CBI 0x18,6
(0136) CLR(PORTD,CE);
03F5 9894 CBI 0x12,4
(0137) CLR(PORTB,CS);
03F6 98C1 CBI 0x18,1
03F7 9508 RET
(0138) }
(0139)
(0140) //配置模式
(0141) void nrf2401A_RwOn()
(0142) {
(0143) SET(PORTB,PWR);
_nrf2401A_RwOn:
03F8 9AC6 SBI 0x18,6
(0144) CLR(PORTD,CE);
03F9 9894 CBI 0x12,4
(0145) SET(PORTB,CS);
03FA 9AC1 SBI 0x18,1
03FB 9508 RET
(0146) }
(0147)
(0148) //工作模式
(0149) void nrf2401A_Run()
(0150) {
(0151) SET(PORTC,PWR);
_nrf2401A_Run:
03FC 9AAE SBI 0x15,6
(0152) CLR(PORTB,CS); //first
03FD 98C1 CBI 0x18,1
(0153) SET(PORTD,CE);
03FE 9A94 SBI 0x12,4
03FF 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -