📄 jifeng_jieshou.lst
字号:
(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 + -