资深版主
- 积分
- 10541
- 金钱
- 10541
- 注册时间
- 2017-2-18
- 在线时间
- 1908 小时
|
本帖最后由 peng1554 于 2018-12-4 22:10 编辑
论坛有用户想用战舰V3板子上的按键实现通过NRF24L01模块无线控制板子LED
http://www.openedv.com/forum.php ... 62&page=1#pid908290
因为不想改按键扫描函数,所以实现的是:
1.当发送模块所在的板子按下KEY0后,接收方板子的DS0灯变化状态
2.当发送模块所在的板子按下KEY1后,接收方板子的DS1灯变化状态
3.当发送模块所在的板子按下KEY2后,接收方板子的DS0+DS1灯一起变化状态
要求准备两个NRF24L01模块和两战舰V3板子,模块分别接在板子左上角的WIRELESS接口
测试程序基于战舰V3的无线通信实验例程修改,NRF24L01驱动程序和按键扫描程序没做修改
整个工程最重要的是收发模块对KEY0 ,KEY1,KEY2的处理
main函数中通过while(1)循环来选择模块是发送还是接收模式
[mw_shl_code=c,true] while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
mode=0;
break;
}else if(key==KEY1_PRES)
{
mode=1;
break;
}
t++;
if(t==100)LCD_ShowString(10,150,230,16,16,"KEY0:RX_Mode KEY1:TX_Mode"); //闪烁显示提示信息
if(t==200)
{
LCD_Fill(10,150,230,150+16,WHITE);
t=0;
}
delay_ms(5);
} [/mw_shl_code]
如果处于接收模式则执行接收部分的代码,如果处于发送模式则执行发送部分的代码
接收和发送部分代码如下:
[mw_shl_code=c,true] if(mode==0)//RX模式
{
LCD_ShowString(30,150,200,16,16,"NRF24L01 RX_Mode");
LCD_ShowString(30,170,200,16,16,"Received DATA:");
NRF24L01_RX_Mode(); //设置模块为接收模式
while(1)
{
if(NRF24L01_RxPacket(receive_buf)==0)//一旦接收到信息,则显示出来.
{
for(i=0;i<34;i++) //解析接收到的数据
{
if(receive_buf==49) //解析KEY0
{
j=receive_buf;
LED0=!LED0;
}
if(receive_buf==50) //解析KEY1
{
j=receive_buf;
LED1=!LED1;
}
if(receive_buf==51) //解析KEY2
{
j=receive_buf;
LED0=!LED0;
LED1=!LED1;
}
}
LCD_ShowString(30,190,lcddev.width-1,32,16,"Received data is:");
LCD_ShowString(30,220,lcddev.width-1,32,16,receive_buf);
}
};
}else//TX模式
{
LCD_ShowString(30,150,200,16,16,"NRF24L01 TX_Mode");
NRF24L01_TX_Mode();
while(1)
{ key_val=KEY_Scan(0);
if(key_val==KEY0_PRES) //对KEY0的处理
{
send_buf[0]=49;
NRF24L01_TxPacket(send_buf);
}
if(key_val==KEY1_PRES) //对KEY1的处理
{
send_buf[0]=50;
NRF24L01_TxPacket(send_buf);
}else if(key_val==KEY2_PRES) //对KEY2的处理
{
send_buf[0]=51;
NRF24L01_TxPacket(send_buf);
}
};
} [/mw_shl_code]
|
|