NRF24L01无线模块在此程序中可以直接与MSP430单片机直接相连,单片机的电压和无线模块的电压都是3.3V,
无需加阻流电阻。通信接口为单片机模拟的SP口,LC12864液晶屏主要是用作把接收到数据通过其显示出来。
程序测试通过,可用!
//p4口为液晶屏
//p1口中断
//nRF24L01无线通信
//p5.0 csn
//p5.1 mosi
//p5.3 sck
//p5.2 miso
//p1.2 irq
//p5.7 ce
//ST7920串行控制128*64液晶
//rst p4.3 复位
//rs p4.0 片选
//rw p4.1 数据
//E p4.2 时钟
#include <msp430x16x.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define LCD_CLK_1 (P4OUT |= BIT2)
#define LCD_CLK_0 (P4OUT &=~ BIT2)
#define LCD_D_1 (P4OUT |= BIT1)
#define LCD_D_0 (P4OUT &=~ BIT1)
#define LCD_RST_1 (P4OUT |= BIT3)
#define LCD_RST_0 (P4OUT &=~ BIT3)
#define LCD_CS_1 (P4OUT |= BIT0)
#define LCD_CS_0 (P4OUT &= ~BIT0)
#define TMP121_CS_1 (P5OUT |= BIT7)
#define TMP121_CS_0 (P5OUT &= ~BIT7)
#define TMP121_CLK_1 (P5OUT |= BIT3)
#define TMP121_CLK_0 (P5OUT &= ~BIT3)
#define send_1 (P2OUT |= BIT0)
#define send_0 (P2OUT &= ~BIT0)
#define CPU_F ((double)1000000) // MCLK=1MHZ主频
#define Delayus_us(x) __Delayus_cycles((long)(CPU_F*(double)x/1000000.0))
#define Delayus_ms(x) __Delayus_cycles((long)(CPU_F*(double)x/1000.0))
#define Delayus_s(x) __Delayus_cycles((long)(CPU_F*(double)x/1.0))
uint alldata[32],keyflg;
uchar char11[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
uchar busy='A',hang,lie,flash_flag,bostart;
uchar key0=0,key1='T',key2,boflg,flg,key2flg=0,tab1=1,newsflag1,newsflag2;
uchar key11,key12;
uint LCDL;
uchar tu[32][32]={0x00};
uint Rdata[8]={0},botu[98]={0x0000};
unsigned char Rx_Address[5]={100,101,102,103,104};//本机地址
unsigned char Rx_Buff[32]={7,8,9};
void Delayus(ulong ilinshi)
{ ulong ii;
for(ii=0;ii<=ilinshi;ii++)
{
key0=key0;
}
}
#define nRF24L01_CE_1 (P5OUT|= BIT7)
#define nRF24L01_CE_0 (P5OUT&=~BIT7)
#define nRF24L01_CSN_1 (P5OUT|= BIT0)
#define nRF24L01_CSN_0 (P5OUT&=~BIT0)
#define nRF24L01_SCK_1 (P5OUT|= BIT3)
#define nRF24L01_SCK_0 (P5OUT&=~BIT3)
#define nRF24L01_MOSI_1 (P5OUT|= BIT1)
#define nRF24L01_MOSI_0 (P5OUT&=~BIT1)
//SPI Commands
#define nRF24L01_R_REGISTER 0x00
#define nRF24L01_W_REGISTER 0x20
#define nRF24L01_R_RX_PAYLOAD 0x61
#define nRF24L01_W_TX_PAYLOAD 0xA0
#define nRF24L01_FLUSH_TX 0xE1
#define nRF24L01_FLUSH_RX 0xE2
#define nRF24L01_REUSE_TX_PL 0xE3
#define nRF24L01_NOP 0xFF
//NRF24L01寄存器地址
#define nRF24L01_CONFIG 0x00
#define nRF24L01_EN_AA 0x01
#define nRF24L01_EN_RXADDR 0x02
#define nRF24L01_SETUP_AW 0x03
#define nRF24L01_SETUP_RETR 0x04
#define nRF24L01_RF_CH 0x05
#define nRF24L01_RF_SETUP 0x06
#define nRF24L01_STATUS 0x07
#define nRF24L01_OBSERVE_TX 0x08
#define nRF24L01_CD 0x09
#define nRF24L01_RX_ADDR_P0 0x0A
#define nRF24L01_RX_ADDR_P1 0x0B
#define nRF24L01_RX_ADDR_P2 0x0C
#define nRF24L01_RX_ADDR_P3 0x0D
#define nRF24L01_RX_ADDR_P4 0x0E
#define nRF24L01_RX_ADDR_P5 0x0F
#define nRF24L01_TX_ADDR 0x10
#define nRF24L01_RX_PW_P0 0x11
#define nRF24L01_RX_PW_P1 0x12
#define nRF24L01_RX_PW_P2 0x13
#define nRF24L01_RX_PW_P3 0x14
#define nRF24L01_RX_PW_P4 0x15
#define nRF24L01_RX_PW_P5 0x16
#define nRF24L01_FIFO_STATUS 0x17
void IO_Init(void) //初始化端口
{
P2SEL = 0;
P3SEL = 0;
P4SEL = 0;
P4DIR|=0x0f; //P4.0,1,2,3=OUT
P4OUT|=0x0f;
P2DIR=0xfd; //P2.1=in qita=OUT
P3DIR&=0xf7; //p3.3=in
}
void Init_Port1(void) //P1.0、P1.1为中断,下降沿触发
{
P1SEL=0; //设置为普通I/O口功能
P1DIR=0; //设置为输入方向
P1IE=0;
P1IES=0;
P1IE|=BIT2; //打开中断允许
P1IES|=BIT2; //下降沿触发
P1IFG=0; //P1IES的切换可能使P1IFG置位,需清除
}
/*******************************************************************************/
//无线通信
void Init_nRF24L01_IO()
{
nRF24L01_CE_0;
nRF24L01_CSN_1;
nRF24L01_SCK_0;
nRF24L01_MOSI_0;
}
//NRF24L01的SPI写时序
void nRF24L01SpiWrite(unsigned char byte)
{
unsigned char i;
nRF24L01_SCK_0;
Delayus(1);
for (i=0;i<8;i++) // Setup byte circulation bits
{
if ((byte&BIT7)==BIT7) // Put DATA_BUF.7 on data line
nRF24L01_MOSI_1; //MOSI=1;
else
nRF24L01_MOSI_0; //MOSI=0;
nRF24L01_SCK_1; // Set clock line high
Delayus(2);
byte=byte<<1;
nRF24L01_SCK_0; // Set clock line low
Delayus(2);
}
Delayus(1);
}
//NRF24L01的SPI读时序
unsigned char nRF24L01SpiRead(void)
{
unsigned char i;
unsigned char temp=0;
nRF24L01_SCK_0;
Delayus(2);
for (i=0;i<8;i++) // Setup byte circulation bits
{
nRF24L01_SCK_1; // Set clock line high
Delayus(2);
temp=temp<<1; // Right shift DATA_BUF
if ((P5IN&BIT2)==BIT2)
{temp|=1;} // Read data
nRF24L01_SCK_0; // Set clock line low
Delayus(2);
}
Delayus(2);
return temp;
}
//
void nRF24L01_Flush_TX_FIFO(void)//Clear TX FIFO
{
nRF24L01_CSN_1;
nRF24L01_CSN_0;
nRF24L01SpiWrite(nRF24L01_FLUSH_TX);
nRF24L01_CSN_1;
}
//
void nRF24L01_Flush_RX_FIFO(void)//Clear RX FIFO
{
nRF24L01_CSN_1;
nRF24L01_CSN_0;
nRF24L01SpiWrite(nRF24L01_FLUSH_RX);
nRF24L01_CSN_1;
}
//
void nRF24L01SpiWriteReg(unsigned char SpiCommand,unsigned char Content)
{
nRF24L01_CSN_1;
nRF24L01_CSN_0;
nRF24L01SpiWrite(SpiCommand);
nRF24L01SpiWrite(Content);
nRF24L01_CSN_1;
}
//
void nRF24L01_Set_Rx_Address(unsigned char RX_Address_Pipex,unsigned char *Address,unsigned char Length)//Local
//Address
{
unsigned char i=0;
nRF24L01_CSN_1;
nRF24L01_CSN_0;
nRF24L01SpiWrite(RX_Address_Pipex);
for(i=0;i<Length;i++)
{
nRF24L01SpiWrite(*Address);
Address++;
}
nRF24L01_CSN_1;
}
//
void nRF24L01_Set_Tx_Address(unsigned char TX_AddressReg10,unsigned char *Address,unsigned char Length)//Remote
//Address
{
unsigned char i=0;
nRF24L01_CSN_1;
nRF24L01_CSN_0;
nRF24L01SpiWrite(TX_AddressReg10);
for(i=0;i<Length;i++)
{
nRF24L01SpiWrite(*Address);
Address++;
}
nRF24L01_CSN_1;
}
//
void nRF24L01_Read_Rx_Payload(unsigned char *DataBuff,unsigned char Length)//Payload Out
{
unsigned char i=0;
nRF24L01_CSN_1;
nRF24L01_CSN_0;
nRF24L01SpiWrite(nRF24L01_R_RX_PAYLOAD);
for(i=0;i<Length;i++)
{
*DataBuff=nRF24L01SpiRead();
DataBuff++;
}
nRF24L01_CSN_1;
}
//
void nRF24L01_Write_Tx_Payload(unsigned char *DataByte, unsigned char Length)//Payload IN
{
unsigned char i=0;
nRF24L01_CSN_1;
nRF24L01_CSN_0;
nRF24L01SpiWrite(nRF24L01_W_TX_PAYLOAD);
for(i=0;i<Length;i++)
{
nRF24L01SpiWrite(*DataByte);
DataByte++;
}
nRF24L01_CSN_1;
}
//
void nRF24L01_Transmit_Data(void)//Transmit Pulse
{
Delayus(10);
nRF24L01_CE_1;
Delayus(8000);
nRF24L01_CE_0;
}
//
void nRF24L01_RX_MODE(void)
{
nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_CONFIG,0x3f);//Reflect DX_DR
nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_EN_AA,0x00);////Disable auto_acknowledgment,6 pipes
nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_EN_RXADDR,0x01);//Enabled RX Addresses.Enable data pipe 0
nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_SETUP_AW,0x03);//RX/TX Address field width 5 bytes.
nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_SETUP_RETR,0x00);//Re-Transmit disabled.
nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_RF_CH,0x02);//RF Channel.
nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_RF_SETUP,0x06);//Air Data Rate 1Mbps.RF_PWR:0dBm.LNA Gain 0.
nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_RX_PW_P0,0x03);//Pipe0 1 Bytes Payload.
nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_STATUS,0x4e);//Reset_Rx_DS
}
/******************************************************************************************************************/
//以下是液晶屏显示程序
void Write_command(uchar x)
{
uchar b,i=0;
Delayus(3);
b=x;
LCD_CS_1; //cs=1;
LCD_D_1; //data=1;
for(i=0;i<5;i++) //5 个连续1 '11111'
{
LCD_CLK_0; //clk=0
LCD_CLK_1; ; //clk=1
}
LCD_CLK_0; //clk=0
LCD_D_0; //data=0;
for(i=0;i<3;i++) //RS,RW,0 Rs="Rw"=0 //写命令
{
LCD_CLK_0; //clk=0
LCD_CLK_1; ; //clk=1
}
////////////////////////////////////上面是发送一个完整的启动数据'11111000'
for(i=0;i<4;i++) //发送高4位
{
if((x&0x80)?1:0) //1
LCD_D_1; //data=1;
else
LCD_D_0; //data=0;
LCD_CLK_0; //clk=0
LCD_CLK_1; ; //clk=1
x=x<<1;
}
LCD_D_0; //data=0;
for(i=0;i<4;i++) //RS,RW,0 发送4个0;
{
LCD_CLK_0; //clk=0
LCD_CLK_1; ; //clk=1
}
//////////////////////////////////////////////
for(i=0;i<4;i++) //发送低4位
{
if((b&0x08)?1:0) //1
LCD_D_1; //data=1;
else
LCD_D_0; //data=0;
LCD_CLK_0; //clk=0
LCD_CLK_1; ; //clk=1
b=b<<1;
}
LCD_D_0; //data=0;
for(i=0;i<4;i++) //RS,RW,0 发送4个0;
{
LCD_CLK_0; //clk=0
LCD_CLK_1; ; //clk=1
}
LCD_CS_1; //cs=1;
Delayus(15);
}
void Write_data(uchar x)
{
uchar b,i=0;
Delayus(3);
b=x;
LCD_CS_1; //cs=1;
LCD_D_1; //data=1;
for(i=0;i<5;i++) //5 个连续1 '11111'
{
LCD_CLK_0; //clk=0
LCD_CLK_1; ; //clk=1
}
LCD_CLK_0; //clk=0 //RW=0
LCD_D_0; //data=0;
LCD_CLK_1; //clk=1
LCD_CLK_0; //clk=0 //RS=1
LCD_D_1; //data=0;
LCD_CLK_1; //clk=1
LCD_CLK_0; //clk=0 //0
LCD_D_0; //data=0;
LCD_CLK_1; //clk=1
////////////////////////////////////上面是发送一个完整的启动数据'11111010'
for(i=0;i<4;i++) //发送高4位
{
if((x&0x80)?1:0) //1
LCD_D_1; //data=1;
else
LCD_D_0; //data=0;
LCD_CLK_0; //clk=0
LCD_CLK_1; //clk=1
x=x<<1;
}
LCD_D_0; //data=0;
for(i=0;i<4;i++) //RS,RW,0 发送4个0;
{
LCD_CLK_0; //clk=0
LCD_CLK_1; ; //clk=1
}
//////////////////////////////////////////////
for(i=0;i<4;i++) //发送低4位
{
if((b&0x08)?1:0) //1
LCD_D_1; //data=1;
else
LCD_D_0; //data=0;
LCD_CLK_0; //clk=0
LCD_CLK_1; ; //clk=1
b=b<<1;
}
LCD_D_0; //data=0;
for(i=0;i<4;i++) //RS,RW,0 发送4个0;
{
LCD_CLK_0; //clk=0
LCD_CLK_1; ; //clk=1
}
LCD_CS_1; //cs=1;
Delayus(15);
}
void CLEAR()
{
Write_command(0x30);
Write_command(0x01);
Write_command(0x34);
Write_command(0x30);
}
void drclear(void)
{
//以下是清绘画RAM
uchar i,j;
Write_command(0x34);
for(j=0;j<32;j++)
{
for(i=0;i<32;i++)
{
tu[i][j]=0x00;
}
}
for(j=0;j<32;j++)
{
for(i=0;i<16;i++)
{
tu[i][j]=0x00;
Write_command(0x80+j); //设定垂直坐标
Write_command(0x80+i); //设定水平坐标
Write_data(0x00); //放入数据高字节
Write_data(0x00); //放入数据低字节
}
}
}
void LCD_Init()
{
LCD_RST_0; //rst=0
Delayus(100);
LCD_RST_1; //rst=1
Delayus(100);
Write_command(0x30);
Delayus(20);
Write_command(0x30);
Delayus(20);
Write_command(0x30);
Write_command(0x30);
//--------------
Write_command(0x0c);
//Write_command(0x0C);
Delayus(10);
Write_command(0x01);
Delayus(20);
Write_command(0x06);
/*
//以下是清绘画RAM
uchar i,j;
Write_command(0x34);
for(j=0;j<32;j++)
{
for(i=0;i<16;i++)
{
Write_command(0x80+j); //设定垂直坐标
Write_command(0x80+i); //设定水平坐标
Write_data(0x00); //放入数据高字节
Write_data(0x00); //放入数据低字节
}
}
*/
}
void writechar(uchar x, uint chinese)
{
Write_command(0x30);
Write_command(x);
Write_data(chinese);
}
void writechinese(uchar x,const char *p)
{
uint i;
i=strlen(p);
Write_command(x);
for(;i;i--)
Write_data(*(p++));
}
void hexdisp(uchar f1)
{
Write_data('0'+f1+7*(f1/10));
}
void hex4(uint f2)
{
uchar f1;
f1=(f2&0xf000)>>12;
hexdisp(f1);
f1=(f2&0x0f00)>>8;
hexdisp(f1);
f1=(f2&0xf0)>>4;
hexdisp(f1);
f1=f2&0x0f;
hexdisp(f1);
}
void liney(uchar x,uchar y,uchar l) //在(x,y)向下开始显示长度为l(<=16)的竖线
{
uchar l1,i;
uint x1=0x00,x2=0x00,ix=x/16;
l1=x-ix*16;
if (l1<8)
{
x1=0x80>>l1;
}
else
{
x2=0x80>>(l1-8);
}
for (i=0;i<l;i++)
{
tu[2*ix][y+i]=x1|tu[2*ix][y+i];
tu[2*ix+1][y+i]=x2|tu[2*ix+1][y+i];
Write_command(0x80+y+i); //设定垂直坐标
Write_command(0x80+ix); //设定水平坐标
Write_data(tu[2*ix][y+i]); //放入数据高字节
Write_data(tu[2*ix+1][y+i]); //放入数据低字节
Delayus(100);
}
}
void linex(uchar x,uchar y,uchar l) //在(x,y)向右开始显示长度为l(<=16)的水平线
{
uint l1,l2,x1,x2,x3=0x00,x4=0x00,ix=x/16;
l1=x-ix*16;
if(l+l1<=8)
{
l2=8-l-l1;
x1=0xff>>(l1+l2);
x1=x1<<l2;
x2=0x00;
}
else if(l+l1<=16)
{
if (l1<8)
{
l2=16-l-l1;
x1=0xff>>l1;
x2=0xff<<l2;
}
else
{
l2=16-l-l1;
x1=0x00;
x2=0xff>>(l2+l1-8);
x2=x2<<l2;
}
}
else
{
if (l1<8)
{
x1=0xff>>l1;
x2=0xff;
}
else
{
l2=l1-8;
x1=0x00;
x2=0xff>>l2;
}
if(l+l1<=24)
{
l2=24-l-l1;
x3=0xff<<l2;
x4=0x00;
}
else
{
l2=32-l-l1;
x3=0xff;
x4=0xff<<l2;
}
}
tu[2*ix][y]=x1|tu[2*ix][y];
tu[2*ix+1][y]=x2|tu[2*ix+1][y];
tu[2*ix+2][y]=x3|tu[2*ix+2][y];
tu[2*ix+3][y]=x4|tu[2*ix+3][y];
Write_command(0x80+y); //设定垂直坐标
Write_command(0x80+ix); //设定水平坐标
Write_data(tu[2*ix][y]); //放入数据高字节
Write_data(tu[2*ix+1][y]); //放入数据低字节
Write_data(tu[2*ix+2][y]); //放入数据高字节
Write_data(tu[2*ix+3][y]); //放入数据低字节
}
/**************************************************************************/
//数据采集
//温度读取
unsigned long ReadOp(void)
{ ulong dat=0;
uint k=12,TEMPTMP=0;
TMP121_CS_1;
TMP121_CLK_1;
Delayus_ms(1);
TMP121_CS_0;
Delayus_ms(1);
do
{
TMP121_CLK_0;
dat=dat<<1;
Delayus_ms(1);
TEMPTMP=P5IN&0x04;
Delayus_ms(1);
dat|=TEMPTMP;
TMP121_CLK_1;
Delayus_ms(1);
}while(k--);
TMP121_CS_1;
dat=dat<<1;
return dat;
}
//光照读取
uint light()
{
uint lt;
lt=P3IN&0x08==0x08;
return lt;
}
/**************************************************************************/
//数据转换
ulong convert()
{ ulong buffer,a,x;
uint k,c,y;
x=ReadOp();
y=light();
x&=0xfff8; //取温度前13位
y=y<<2; //光照信息
a=x|y;
buffer=a;
for(k=16;k>0;k--)
{
c^=a&0x0001; //奇偶校验
a=a>>1;
}
buffer=buffer|c;
return buffer;
}
/******************************************************************/
//收发
void send_bit1()
{
send_1;
Delayus(500);
send_0;
Delayus(500);
}
void send_bit0()
{
send_0;
Delayus(1000);
}
void send_data()
{
int k;
ulong buffer2;
buffer2=convert();
for(k=16;k>0;k--)//发送数据位
{
if(buffer2&0x01==0x01)
send_bit1();
else
send_bit0();
buffer2=buffer2>>1;
}
}
void send_adrs(uint z)
{ int k;
uint buffer1=z;
for(k=16;k>0;k--)//发送地址位
{
if(buffer1&0x01==0x01)
send_bit1();
else
send_bit0();
buffer1=buffer1>>1;
}
}
uint recieve_adrs()
{
int k,a;
uint buffer1=0x0000,b=0x0000;
Delayus(250);
for(k=32;k>0;k--)
{
alldata[k]=P2IN&0x02;
Delayus(1000);
}
for(k=32;k>16;k--)
{
a=alldata[k];
a=a>>1;
b=b|a;
b=b<<15;
buffer1=buffer1>>1;
buffer1=buffer1|b;
}
return buffer1;
}
ulong recieve_data()
{
int k,a;
ulong buffer2=0x0000,b=0x0000;
for(k=16;k>0;k--)
{
a=alldata[k];
a=a>>1;
b=b|a;
b=b<<15;
buffer2=buffer2>>1;
buffer2=buffer2|b;
}
return buffer2;
}
/*************************************************************************/
//显示数据
void print_tmp()
{
ulong TEMP=0;
int TEMPFLG=0;
char TEMP1,TEMP2,TEMP3,TEMP4;
TEMP = recieve_data()&0xfff8;
if(TEMP>0x8000)
{
TEMP=TEMP>>3;
TEMP=TEMP<<3;
TEMP=0xffff-TEMP+1;
TEMPFLG=1;
}
TEMP = TEMP*10;
TEMP = TEMP/128;
// if( TEMP>35)
//P1OUT &= ~BIT1;
// Delayus_ms(700);
TEMP1=char11[TEMP/1000];
TEMP2=char11[TEMP%1000/100];
TEMP3=char11[TEMP%100/10];
TEMP4=char11[TEMP%10];
if(TEMP1=='0')
{ if(TEMP2=='0')
{
if(TEMPFLG==1)
writechar(0x90,'-');
writechar(0x91,TEMP3);
writechar(0x92,'.');
writechar(0x93,TEMP4);
}
else
{
if(TEMPFLG==1)
writechar(0x90,'-');
writechar(0x91,TEMP2);
writechar(0x92,TEMP3);
writechar(0x93,'.');
writechar(0x94,TEMP4);
}
}
else
{
if(TEMPFLG==1)
writechar(0x90,'-');
writechar(0x91,TEMP1);
writechar(0x92,TEMP2);
writechar(0x93,TEMP3);
writechar(0x94,'.');
writechar(0x95,TEMP4);
}
}
void print_light()
{
ulong lgt;
lgt=recieve_data()&0x0004;
lgt=lgt>>2;
if(lgt)
writechinese(0x98,"暗");
else
writechinese(0x98,"亮");
}
void print_data()
{
uchar num;
num=char11[Rx_Buff[0]];
writechar(0x90,num);
num=char11[Rx_Buff[1]];
writechar(0x91,num);
num=char11[Rx_Buff[2]];
writechar(0x92,num);
}
/********************************************************************************/
//键盘
void key_Init()
{
P5SEL = 0;
P6SEL = 0;
P6DIR|=0xff; //P6=OUT
P5DIR=0x8b; //P5.2、4、5、6=in,P5.0、1、3、7=out
}
void key_read()
{
//第一排扫描
P6OUT=0x18;
Delayus(100);
key0=P5IN&0x70 ;
if (key0==0x30)
{
key11='1';
if(keyflg==0)
{
CLEAR();
writechinese(0x80,"单独探测节点");
writechinese(0x90,"1-选择1#节点");
writechinese(0x88,"2-选择2#节点");
writechinese(0x98,"g-返回主菜单");
keyflg=1;
}
else if(keyflg==1)
{
CLEAR();
writechinese(0x80,"寻检1#节点");
writechinese(0x90,"d-确认,g-返回");
keyflg=2;
}
Delayus(30000);
}
if (key0==0x40)
{
key11='2';
if(keyflg==0)
{
CLEAR();
writechinese(0x80,"轮寻模式");
writechinese(0x90,"d-确认,g-返回");
keyflg=4;
}
if(keyflg==1)
{
CLEAR();
writechinese(0x80,"寻检2#节点");
writechinese(0x90,"d-确认,g-返回");
keyflg=3;
}
Delayus(30000);
}
if (key0==0x50)
{
key11='3';
Delayus(30000);
}
if (key0==0x60)
{
Delayus(30000);
key11='4';
}
//第二排扫描
P6OUT=0x20;
Delayus(100);
key0=P5IN&0x70 ;
if (key0==0x30)
{
key11='5';
Delayus(30000);
}
if (key0==0x40)
{
key11='6';
Delayus(30000);
}
if (key0==0x50)
{
key11='7';
Delayus(30000);
}
if (key0==0x60)
{
key11='8';
Delayus(30000);
}
//第三排扫描
P6OUT=0x28;
Delayus(100);
key0=P5IN&0x70 ;
if (key0==0x30)
{
key11='9';
Delayus(30000);
}
if (key0==0x40)
{
key11='A';
Delayus(30000);
}
if (key0==0x50)
{
key11='B';
Delayus(30000);
}
if (key0==0x60)
{
key11='C';
Delayus(30000);
}
//第四排扫描
P6OUT=0x30;
Delayus(100);
key0=P5IN&0x70 ;
if (key0==0x30)
{
key11='D';
if(keyflg==2)
{
CLEAR();
writechinese(0x80,"发送1#节点请求");
send_bit1();
send_adrs(0x0001);
_EINT();
//发送1号节点请求
}
if(keyflg==3)
{
CLEAR();
writechinese(0x80,"发送2#节点请求");
send_bit1();
send_adrs(0x0002);
_EINT();
//发送2号节点请求
}
if(keyflg==4)
{
CLEAR();
writechinese(0x80,"发送1#节点请求");
send_bit1();
send_adrs(0x0001);
keyflg=2;
Delayus(20000);
writechinese(0x80,"发送2#节点请求");
send_bit1();
send_adrs(0x0002);
keyflg=3;
_EINT();
}
Delayus(30000);
}
if (key0==0x40)
{
key11='E';
Delayus(30000);
}
if (key0==0x50)
{
key11='F';
Delayus(30000);
}
if (key0==0x60)
{
key11='G';
CLEAR();
writechinese(0x80,"江南大学");
writechinese(0x90,"通信与控制工程");
writechinese(0x88,"无线监测模拟装置");
Delayus(100000);
CLEAR();
writechinese(0x80,"选择接受模式");
writechinese(0x90,"1-单独探测节点");
writechinese(0x88,"2-轮巡模式");
keyflg=0;
Delayus(30000);
Init_nRF24L01_IO();
}
}
void print1(ulong x)
{
ulong cvt0,cvt1;
int k,i;
char data[10];
cvt0=x;
for(k=4,i=0;k>0;k--,i++)
{
cvt1=cvt0&0x000f;
data[i]=char11[cvt1%16];
cvt0=cvt0>>4;
}
writechar(0x90,data[3]);
writechar(0x91,data[2]);
writechar(0x92,data[1]);
writechar(0x93,data[0]);
}
/********************************************************************/
//主程序
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
_DINT();
Init_Port1();
IO_Init();
LCD_Init();
CLEAR();
key11='M';
// LCDL='安';
//汉字显示示例
writechinese(0x80,"江南大学");
writechinese(0x90,"通信与控制工程");
writechinese(0x88,"无线监测模拟装置");
Delayus(100000);
CLEAR();
writechinese(0x80,"调试接收模式");
//writechinese(0x90,"1-单独探测节点");
//writechinese(0x88,"2-轮巡模式");
keyflg=0;
bostart=0x00;
boflg=0x00;
key_Init();
Init_nRF24L01_IO();
nRF24L01_RX_MODE();
nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);
nRF24L01_Flush_RX_FIFO();
nRF24L01_CE_1;
_EINT();
do
{
key11='w' ;
key_read();
}while(1);
}
#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)
{
_DINT();
P1IFG=0;
P1IE=0;
P1IES=0;
Delayus(500);
CLEAR();
writechinese(0x80,"正在接收");
// print_data();
nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_STATUS,0x4e);//Reset_Rx_DS
nRF24L01_Read_Rx_Payload(Rx_Buff,3);
nRF24L01_Flush_RX_FIFO();
print_data();
IO_Init();
Init_Port1();
_EINT();
}