|
网上买了几片G01-D模块兼容NRF24l01 ,陆陆续续弄了好长时间终于可以使用了。
最远距离没测试,10多米没有压力。感兴趣的可以看看。
程序有些乱。
- /***********nrf 24i01.h***********/
- #ifndef NRF24L01_h//FASONG
- #define NRF24L01_h
- #include <pic.h>
- //__CONFIG(0X3B31);
- #define uint8 unsigned char
- #define uint16 unsigned int
- void delays(uint16 us);
- void SpiInit();
- uint8 SPI_RW(uint8 byte);
- uint8 SPI_Read(uint8 reg);
- uint8 SPI_RW_Reg(uint8 reg,uint8 value);
- uint8 SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 uchars);
- unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
- void TX_MODE(void);
- void SetRX_Mode(void);
- void Transmit(uint8 *tx_buf);
- void ce24();
- #define CSN RD1
- #define IRQ RC1
- #define CE RD0
- #define MOSI RC3
- #define MISO RC0
- #define SCK RC2
- #define BACK_LED RD4
- #define KEY RB0
- /*********************
- #define CSN RE1
- #define IRQ RE0
- #define CE RE2
- #define MOSI RC4
- #define MISO RC5
- #define SCK RC3
- #define BACK_LED RC1
- #define KEY RB7
- ************************/
- #define TX_ADR_WIDTH 5
- #define RX_ADR_WIDTH 5
- #define RX_PLOAD_WIDTH 10
- #define TX_PLOAD_WIDTH 10
- uint8 TX_ADDRESS[TX_ADR_WIDTH]={0X34,0X43,0X10,0X10,0X01};
- uint8 RX_ADDRESS[RX_ADR_WIDTH]={0X34,0X43,0X10,0X10,0X01};
- uint8 Tx_Buf[TX_PLOAD_WIDTH]={0};
- /*
- uint8 Tx_Buf[TX_PLOAD_WIDTH]={0xff,0xee,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,
- 0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb
- ,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xee,0xff};//32
- */
- uint8 sta=0;//NRF24L01状态
- /***********************寄存器指令***********************/
- #define READ_REG 0X00 //读寄存器指令
- #define WRITE_REG 0X20 //写寄存器指令
- #define RD_RX_PLOAD 0X61 //读取接收数据指令
- #define WR_TX_PLOAD 0XA0 //写待发数据指令
- #define FLUSH_TX 0XE1 //清除发送FIFO指令
- #define FLUSH_RX 0XE2 //清除接收FIFO指令
- #define REUSE_TX_PL 0XE3 //定义重复装载数据指令
- #define NOPP 0XFF //保留
- /***********************寄存器地址***********************/
- #define config 0X00 //配置收发状态,CRC校验及收发响应方式
- #define EN_AA 0X01 //自动应答功能设置
- #define EN_RXADDR 0X02 //可用信道设置
- #define SETUP_AW 0X03 //收发地址宽度设置
- #define SETUP_RETR 0X04 //自动重发功能设置
- #define RF_CH 0X05 //工作频率设置
- #define RF_SETUP 0X06 //发送速率,功耗功能设置
- #define STATUS 0X07 //状态寄存器
- #define OBSERVE_TX 0X08 //发送监测功能
- #define CD 0X09 //地址检测
- #define RX_ADDR_P0 0X0A //频道0接收数据地址
- #define RX_ADDR_P1 0X0B //频道1接收数据地址
- #define RX_ADDR_P2 0X0C //频道2接收数据地址
- #define RX_ADDR_P3 0X0D //频道3接收数据地址
- #define RX_ADDR_P4 0X0E //频道4接收数据地址
- #define RX_ADDR_P5 0X0F //频道5接收数据地址
- #define TX_ADDR 0X10 //发送地址寄存器
- #define RX_PW_P0 0x11 // 接收频道0接收数据有效数据长度
- #define RX_PW_P1 0x12 // 接收频道1接收数据有效数据长度
- #define RX_PW_P2 0x13 // 接收频道2接收数据有效数据长度
- #define RX_PW_P3 0x14 // 接收频道3接收数据有效数据长度
- #define RX_PW_P4 0x15 // 接收频道4接收数据有效数据长度
- #define RX_PW_P5 0x16 // 接收频道5接收数据有效数据长度
- #define FIFO_STATUS 0X17 //FIFO栈入栈出状态寄存器设置
- #define MAX_RT 0X10 //MAX_RTD在第5位|
- #define TX_DS 0X20 //TX_DS在第6位 | 在读回STATUS时与其相与,就知道该位是否为1
- #define RX_DR 0X40 //RX_DR在第7位 |
- void ce24()
- {
- if(KEY==0)
- {
- delays(1000);
- if(KEY==0)
- {
- //while(KEY==0);
- BACK_LED=1;
- delays(5000);
- BACK_LED=0;
- //TX_MODE();
- // Transmit(0xff);
- delays(5000);
- sta=SPI_Read(READ_REG+STATUS);
- SPI_RW_Reg(WRITE_REG+STATUS,sta);//STATUS清0
- CE=0;
- }
- }
- }
- void delays(uint16 us)
- {
- while(us--);
- }
- /*****************************************************************/
- void SpiInit()
- {
- TRISC=0X03;//设置RC3/SCK,RC5/SDO为输出0X20//misoshuru
- TRISD=0X00;//IRQ为输入,CE,CSN为输出0X01
- CE=0;
- CSN=1;
- CSN=1;
- SCK=0;
- IRQ=1;
- //delay(50000);
- TX_MODE();
- //Transmit(Tx_Buf);
- delays(50000);
- sta=SPI_Read(READ_REG+STATUS);
- SPI_RW_Reg(WRITE_REG+STATUS,sta);//STATUS清0
- CE=0;
- }
- uint8 SPI_RW(uint8 byte)
- {
- uint8 bit_ctr;
- //DI();
- for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
- {
- if(byte & 0x80)
- {MOSI = 1;}
- else
- { MOSI = 0;}
- byte = (byte << 1); // shift next bit into MSB..
- SCK = 1; // Set nRF24L01_SCK high..
- if(MISO) byte |= 1;
- NOP();NOP();NOP();NOP();
- SCK = 0; // ..then set nRF24L01_SCK low again
- NOP();NOP();NOP();NOP();
- }
- //EI();
- return(byte); // return read byte
- }
- /*uint8 SPI_Read() //通过SPI读一个字节
- {
- CSN=0;
- SSPBUF=0X00;//读一个字节前必需先写入一个字节
- while(!BF);
- CSN=1;
- return(SSPBUF);
- }*/
- uint8 SPI_Read(uint8 reg)
- {
- uint8 reg_val;
- CSN=0;
- SPI_RW(reg);
- reg_val=SPI_RW(0);
- CSN=1;
- return(reg_val);
- }
- uint8 SPI_RW_Reg(uint8 reg,uint8 value)//向寄存器写一个字节,同时返回状态字
- {
- uint8 status;
- CSN=0;
- status=SPI_RW(reg);
- SPI_RW(value);
- CSN=1;
- return(status);
- }
- /*****************************************************************************************/
- /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
- /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
- /****************************************************************************************/
- uint8 SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 uchars)
- {
- uint8 status,uchar_ctr;
- CSN = 0; // Set CSN low, init SPI tranaction
- status = SPI_RW(reg); // Select register to write to and read status uchar
- for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
- pBuf[uchar_ctr] = SPI_RW(0); //
- CSN = 1;
- return(status); // return nRF24L01 status uchar
- }
- //*/////////////
- uint8 SPI_Write_Buf(uint8 reg,uint8 *pBuf,uint8 bytes)//向寄存器写入一个字符串
- {
- uint8 status,byte_ctr;
- CSN=0;
- status=SPI_RW(reg);
- for(byte_ctr=0;byte_ctr< bytes; byte_ctr++)
- {
- SPI_RW(*pBuf++);
- }
- CSN=1;
- return(status);
- }
- /***************************以上为SPI通讯程序**********************************/
- /******************************************************************************/
- //发送模式代码
- void TX_MODE(void)
- //void TX_MODE(unsigned char *tx_data)
- {
- CE=0;
- // CSN=1; // Spi disable
- SCK=0; //
- SPI_RW_Reg(FLUSH_TX,0X00);
- SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); // 写本地地址
- SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);// 写接收端地址
- // SPI_Write_Buf(WR_TX_PLOAD, tx_data, TX_ADR_WIDTH); //写有效数据地址 + 有效数据 + 有效数据宽度
- SPI_RW_Reg(WRITE_REG+EN_AA,0X01); // 频道0自动 ACK应答允许
- SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01); // 允许接收地址只有频道0,
- SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X15);//禁止重发0X00//0AZIDONG 0x15 5ci
- SPI_RW_Reg(WRITE_REG+RF_CH,40); // 设置信道工作为2.4GHZ,收发必须一致
- SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);//设置发射速率为1MHZ,发射功率
- SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//设置接收数据长度,本次设置为32字节
- SPI_RW_Reg(WRITE_REG+config,0X0e);//发送上电,16位CRC校验,CRC使能
- CE=1;
- IRQ=1;
- delays(5000);
- }
- void Transmit(uint8 *tx_buf)
- {
- CE=0;
- SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
- SPI_RW_Reg(FLUSH_TX,0X00);
- SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
- SPI_RW_Reg(WRITE_REG+config,0X0E);
- CE=1;
- delays(100);
- }
- /***********************************************************************************************************
- /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
- /*功能:发送 tx_buf中数据
- /**********************************************************************************************************/
- void nRF24L01_TxPacket(unsigned char * tx_buf)
- {
- TX_MODE();
- CE=0; //StandBy I模式
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
- SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
- SPI_RW_Reg(WRITE_REG + config, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送////////
- CE=1; //置高CE,激发数据发送
- delays(200);
- }
- /****************************************************************************/
- /****************************************************************************************************/
- /*函数:void SetRX_Mode(void)
- /*功能:数据接收配置
- /****************************************************************************************************/
- void SetRX_Mode(void)
- {
- CE=0;
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
- CE = 1;
- delays(180);
- }
- /******************************************************************************************************/
- /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
- /*功能:数据读取后放如rx_buf接收缓冲区中
- /******************************************************************************************************/
- unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
- {
- unsigned char revale=0;
- sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
- if(RX_DR) // 判断是否接收到数据
- {
- CE = 0; //SPI使能
- SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
- revale =1; //读取数据完成标志
- }
- SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
- return revale;
- }
- unsigned char Check_ACK(void)
- {
- sta=SPI_Read(WRITE_REG+STATUS);//读取寄存状态 // 返回状态寄存器
- return 1;
- if(MAX_RT || TX_DS)
- {
- SPI_RW_Reg(WRITE_REG + STATUS, 0xff); // 清除TX_DS或MAX_RT中断标志
- CSN = 0;
- SPI_RW(FLUSH_TX);
- CSN = 1;
- IRQ = 1;
- return 0;
- }
- IRQ = 1;
- //else
-
- }
- /****************************************/
- /**************************************************
- 函数:Check_ACK()
- 描述:
- 检查接收设备有无接收到数据包,设定没有收到应答信
- 号是否重发
- /***********************************************
- uchar Check_ACK(bit clear)
- {
- delay(2000);
- while(IRQ);
- sta = SPI_RW(NOP); // 返回状态寄存器
- if(TX_DS)
- {
- blink(3);
- }
- //blink(5);
- if(MAX_RT)
- if(clear) // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
- SPI_RW(FLUSH_TX);
- SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志
- IRQ = 1;
- if(TX_DS)
- return(0x00);
- else
- return(0xff);
- }
- *************************************************/
- /*************************************/
- #endif
- /************************发送main********************/
- /*************发送模式**********/
- /********2021.2.1**************/
- #include <pic.h>//pic新开发板使用
- __CONFIG(0X3B31);//关闭看门狗,选择高速晶振,上电延时复位,掉电复位使能,代码保护
- #include "NRF24L01.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define DQ RA0
- #define DQ_in TRISA0=1
- #define DQ_LOW() TRISA0=0;DQ=0
- #define DQ_HIGH() TRISA0=1
- uint temper;
- char m=0;
- uchar flag_fu=0; //温度正负值标志位
- uchar a1,a2,a3,a4;
- uchar bz1,bz2,bz3;
- void delayms(uint x);
- void delayus(uint ,uchar );
- void init();
- void reset18();
- void write_byte(uchar date);
- uchar read_byte();
- void get_tem();
- void timer1_init();
- uchar counter=0;
- #define LED RD0
- uchar dispaly[8];
- const int table[]={0,1,2,3,4,5,6,7,8,9};
- void timer1_init()
- {
- GIE=1;
- PEIE=1;
- T1CKPS0=1;T1CKPS1=1; //1:8
- TMR1CS=0;
- TMR1IE=1;
- TMR1ON=1;
- TMR1H=0xfb;
- TMR1L=0x1e;
- }
- void interrupt ISR(void)
- {
-
- if(TMR1IF==1)
- {
-
- TMR1IF=0;
- TMR1H=0xfb;
- TMR1L=0x1e;
- if(++counter>=120)
- {
- // disp(a1,a2,a3,a4);
- LED=~LED;
- counter=0;
- }
- }
- }
- /**********main***********/
- void main()
- {
- int i;
- //unsigned char TX_Buf[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
- ADON=0;
- timer1_init();
- init();
- SpiInit();
- //write_byte(0x20);
- delayms(1000);
- delayms(1000);
- while(1)
- {
- uchar num;
- RD2=1;
- get_tem();
- delayms(1000);
- RD2=0;
- delayms(1000);
- ce24();
- }
- }
- /*************************************/
- void delayms(unsigned int x)
- {
- unsigned int a,b;
- for(a=x;a>0;a--)
- for(b=110;b>0;b--);
- }
- void init()
- {
- TRISB=0x00;
- TRISD=0x00;
- PORTD=0X00;
- TRISB0=1;
- //PORTD=0x0f;
- ADCON1=0X06;
- delayms(10);
- T0CS=0;
- TRISA=0x00;
- delayms(10);
- //ADON=0;
- //ANSEL=0X07;
- PORTA=0x00;
- delayms(10);
- PORTD=0xFF;
- RA5=1;
- delayms(1000);
- PORTD=0x00;
- }
- void delayus(uint x,uchar y)
- {
- uint i;uchar j;
- for(i=x;i>0;i--)
- for(j=y;j>0;j--) ;
- }
- void reset18()
- {
- uchar st=1;
- DQ_HIGH();
- NOP();NOP();
- while(st)
- {
- DQ_LOW();
- delayus(15,10);//750us
- DQ_HIGH();
- delayus(3,2);//70us
- st=DQ;
- if(DQ==1)
- st=1;
- else
- st=0;
- delayus(11,10);//500us
- }
- }
- void write_byte(uchar date)
- {
- uchar i,temp;
- DQ_HIGH();
- NOP();NOP();
- for(i=8;i>0;i--)
- {
- temp=date&0x01;
- DQ_LOW();
- delayus(0,0);
- if(temp==1)
- DQ_HIGH();
- delayus(2,1);//45us
- DQ_HIGH();
- date=date>>1;
- }
- }
- uchar read_byte()
- {
- uchar i,date;
- static bit j;
- for(i=8;i>0;i-- )
- {
- date=date>>1;
- DQ_HIGH();
- NOP();NOP();
- DQ_LOW();
- NOP();NOP(); NOP();NOP(); NOP();NOP();
- DQ_HIGH();
- NOP();NOP(); NOP();NOP(); NOP();
- j=DQ;
- if(j==1)
- date=date|0x80;
- delayus(1,1);
- }
- return(date);
- }
- void get_tem()
- {
- bz1=0;bz2=0;bz3=0;
- uchar tem1,tem2,num;
- GIE=0;
- reset18();
- write_byte(0xCC);
- write_byte(0x44);
- // delayus(2,2);//600us(60,15)
- GIE=1;
- GIE=0;
- reset18();
- write_byte(0xCC);
- GIE=1;
- delayus(2,1);
- GIE=0;
- write_byte(0xBE);
- tem1=read_byte();
- tem2=read_byte();
- GIE=1;
- temper = ((tem2<<4)&0xF0)|((tem1>>4)&0x0F);
- if(temper>127)
- {
- //temper = ~temper + 1;
- flag_fu=1;
- bz1=1;
- }
- else
- {
- flag_fu=0;
- bz1=0;
- }
- /*
- if(temper&0x8000)
- {
- temper=~temper;
- temper+=1;
- flag_fu=1;
- }
- else
- {
- flag_fu=0;
- }
- */
- temper=(tem2*256+tem1)*6.25;
- if(flag_fu==1)
- { temper = ~temper + 1;}
- if(temper>10000)
- {
- temper=temper%10000;
- a1=temper/1000;
- a2=temper%1000/100;
- a3=temper%100/10;
- a4=temper%10;
- m=1;
- bz3=1;
- }
- else
- {
- temper=temper%10000;
- a1=temper/1000;
- a2=temper%1000/100;
- a3=temper%100/10;
- a4=temper%10;
- m=0;
- bz3=0;
- }
- //if(a0>2)a0=0;
- //TX_MODE();
- delayms(30);
- if(bz1==bz3){bz2=1;}
- delayus(3,2);
- dispaly[1]=table[a1];
- dispaly[2]=table[a2];
- dispaly[3]=table[a3];
- dispaly[4]=table[a4];
- dispaly[5]=table[bz1];
- dispaly[6]=table[bz2];
- dispaly[7]=table[bz3];
- delayms(3);
- nRF24L01_TxPacket( dispaly); // Transmit Tx buffer data
- SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
- SPI_RW_Reg(FLUSH_TX,0X00);
- //value18=(int)temper;
- }
- /************************数码管接收*******************************/
- #include <pic.h>//接收模式
- __CONFIG(0x3B31);
- //const rom unsigned int CONFIG=0x0101;
- #define uint8 unsigned char
- #define uint16 unsigned int
- #define uchar unsigned char
- #define uint unsigned int
- #define CSN RB5
- #define IRQ RB1
- #define CE RB4
- #define MOSI RB3
- #define MISO RB0
- #define SCK RB2
- #define BACK_LED RD7
- #define KEY RB6
- uint temperx;
- void xianshishuju();
- uchar a1,a2,a3,a4;
- uchar a0;
- #define DOT_SET RD7=0
- #define DOT_CLR RD7=1
- #define RA1_SET RA1=0
- #define RA1_CLR RA1=1
- #define RA2_SET RA2=0
- #define RA2_CLR RA2=1
- #define RA3_SET RA3=0
- #define RA3_CLR RA3=1
- #define RA4_SET RA4=0
- #define RA4_CLR RA4=1
- #define TX_ADR_WIDTH 5
- #define RX_ADR_WIDTH 5
- #define RX_PLOAD_WIDTH 10
- #define TX_PLOAD_WIDTH 10
- uint8 TX_ADDRESS[TX_ADR_WIDTH]={0X34,0X43,0X10,0X10,0X01};
- uint8 RX_ADDRESS[RX_ADR_WIDTH]={0X34,0X43,0X10,0X10,0X01};
- uint8 Tx_Buf[TX_PLOAD_WIDTH];
- uint8 Rx_Buf[RX_PLOAD_WIDTH];
- uint8 sta=0;//NRF24L01状态
- /***********************寄存器指令***********************/
- #define READ_REG 0X00 //读寄存器指令
- #define WRITE_REG 0X20 //写寄存器指令
- #define RD_RX_PLOAD 0X61 //读取接收数据指令
- #define WR_TX_PLOAD 0XA0 //写待发数据指令
- #define FLUSH_TX 0XE1 //清除发送FIFO指令
- #define FLUSH_RX 0XE2 //清除接收FIFO指令
- #define REUSE_TX_PL 0XE3 //定义重复装载数据指令
- //#define NOP 0XFF //保留
- /***********************寄存器地址***********************/
- #define config 0X00 //配置收发状态,CRC校验及收发响应方式
- #define EN_AA 0X01 //自动应答功能设置
- #define EN_RXADDR 0X02 //可用信道设置
- #define SETUP_AW 0X03 //收发地址宽度设置
- #define SETUP_RETR 0X04 //自动重发功能设置
- #define RF_CH 0X05 //工作频率设置
- #define RF_SETUP 0X06 //发送速率,功耗功能设置
- #define STATUS 0X07 //状态寄存器
- #define OBSERVE_TX 0X08 //发送监测功能
- #define CD 0X09 //地址检测
- #define RX_ADDR_P0 0X0A //频道0接收数据地址
- #define RX_ADDR_P1 0X0B //频道1接收数据地址
- #define RX_ADDR_P2 0X0C //频道2接收数据地址
- #define RX_ADDR_P3 0X0D //频道3接收数据地址
- #define RX_ADDR_P4 0X0E //频道4接收数据地址
- #define RX_ADDR_P5 0X0F //频道5接收数据地址
- #define TX_ADDR 0X10 //发送地址寄存器
- #define RX_PW_P0 0x11 // 接收频道0接收数据有效数据长度
- #define RX_PW_P1 0x12 // 接收频道1接收数据有效数据长度
- #define RX_PW_P2 0x13 // 接收频道2接收数据有效数据长度
- #define RX_PW_P3 0x14 // 接收频道3接收数据有效数据长度
- #define RX_PW_P4 0x15 // 接收频道4接收数据有效数据长度
- #define RX_PW_P5 0x16 // 接收频道5接收数据有效数据长度
- #define FIFO_STATUS 0X17 //FIFO栈入栈出状态寄存器设置
- #define MAX_RT 0X10 //MAX_RTD在第5位|
- #define TX_DS 0X20 //TX_DS在第6位 | 在读回STATUS时与其相与,就知道该位是否为1
- #define RX_DR 0X40 //RX_DR在第7位 |
- uchar const seg_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
- //0-9的显示代码
- void delay(uint16 us)//延时函数
- {
- while(us--);
- }
- void SpiInit()
- {
- TRISC=0X00;//设置RC3/SCK,RC5/SDO为输出0X20//rc0shuru
- // ANSELE=0X00;
- // TRISD=0X00;//IRQ为输入,CE,CSN为输出0X01
- TRISB=0X43;
- delay(20);
- CE=0; // chip enable
- delay(20);
- CSN=1; // Spi disable
- delay(20);
- SCK=0;
- delay(20);
- }
- uint8 SPI_RW(uint8 byte)
- {
- uint8 bit_ctr;
- //DI();
- for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
- {
- if(byte & 0x80)
- MOSI = 1;
- else
- MOSI = 0;
- byte = (byte << 1); // shift next bit into MSB..
- SCK = 1; // Set nRF24L01_SCK high..
- if(MISO) byte |= 1;
- NOP();NOP();NOP();NOP();
- SCK = 0; // ..then set nRF24L01_SCK low again
- NOP();NOP();NOP();NOP();
- }
- //EI();
- return(byte);
- }
- uint8 SPI_Read(uint8 reg)
- {
- uint8 reg_val;
- CSN=0;
- SPI_RW(reg);
- reg_val=SPI_RW(0);
- CSN=1;
- return(reg_val);
- }
- uint8 SPI_RW_Reg(uint8 reg,uint8 value)//向寄存器写一个字节,同时返回状态字
- {
- uint8 status;
- CSN=0;
- status=SPI_RW(reg);
- SPI_RW(value);
- CSN=1;
- return(status);
- }
- uint8 SPI_Write_Buf(uint8 reg,uint8 *pBuf,uint8 bytes)//向寄存器写入一个字符串
- {
- uint8 status,byte_ctr;
- CSN=0;
- status=SPI_RW(reg);
- for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
- {
- //SPI_RW(pBuf[byte_ctr]); //
- SPI_RW(*pBuf++);//gaiguo
- }
- CSN=1;
- return(status);
- }
- /***************************以上为SPI通讯程序**********************************/
- /******************************************************************************/
- //接收模式代码
- void RX_MODE(void)
- {
- CE=0;
- SPI_RW_Reg(FLUSH_TX,0X00);///////////////////gaiguo/////////////
- SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);// 写本地地址
- SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);// 写接收端地址
- SPI_RW_Reg(WRITE_REG+EN_AA,0X01);// 频道0自动 ACK应答允许
- SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01);// 允许接收地址只有频道0,如果需要多频道,可以参考Page21
- //SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X1a);/////////////////////gaiguo
- SPI_RW_Reg(WRITE_REG+RF_CH,40);
- SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);
- SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
- SPI_RW_Reg(WRITE_REG+config,0X0f);//接受
- delay(200);
- CE=1;
- delay(200);
- }
- uint8 SPI_Read_Buf(uint8 reg,uint8 *pBuf,uint8 bytes)
- {
- uint8 status,uchar_ctr;
- CSN=0;
- status=SPI_RW(reg);
- for(uchar_ctr=0;uchar_ctr<bytes;uchar_ctr++) //for(byte_ctr=0;byte_ctr< bytes; byte_ctr++)
- {
- pBuf[uchar_ctr]=SPI_RW(0);//*pBUF++=SPIR_RW(0xff);
- }
- CSN=1;
- return(status);
- }
- /*********************************************************/
- uint8 nRF24l01_RxPacket(uint8 *rx_buf)
- {
- uint8 revale=0;
- CE = 1;
- delay(10);
- // RX_MODE();
- // delay(10);
- sta=SPI_Read(STATUS);// 读取状态寄存其来判断数据接收状况
- if(sta&RX_DR)//判断是否接收到数据 if(sta&RX_DR)
- {
- CE = 0;//SPI使能///tianjia
- delay(2);
- SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);
- SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志.
- revale=1;
- CSN=0;
- // SPI_RW(FLUSH_RX);
-
- SPI_RW_Reg(FLUSH_RX,0X00);//////////////////////////////////////////gaiiiii
- CSN=1;
- }
- IRQ=1;//////////////////////////gaiguo+++
- return(revale);
- }
- /*************************
- uint8 nRF24l01_RxPacket(uint8 *rx_buf)
- {
- uint8 revale=0;
- // RX_MODE();
- // delay(10);
- sta=SPI_Read(STATUS);// 读取状态寄存其来判断数据接收状况
- if(sta&RX_DR)//判断是否接收到数据 if(sta&RX_DR)
- {
- CE = 0;//SPI使能///tianjia
- delay(2);
- SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);
- revale=1;
- //SPI_RW_Reg(FLUSH_RX,0X00);//////////////////////////////////////////gaiiiii
- }
- SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志.
- IRQ=1;//////////////////////////gaiguo+++
- return(revale);
- }
- ********************/
- /********************
- void xianshishuju()
- {
-
- // a1=RxBuf[3]; //符号位
- a2=((RxBuf[2]<<4)|RxBuf[1]); //整数位
- a1=RxBuf[0]; //小数位
- a3=RxBuf[2]; //十位
- a4=RxBuf[1]; //个位
-
-
- PORTD=seg_data[0];
- RA5=1;
- delay(20);
- RA5=0;
- PORTD=seg_data[a1]; //显示个位
- RA4_CLR;
- DOT_CLR;
- delay(20);
- RA4_SET;
- PORTD=seg_data[a2];
- RA3_CLR;
-
- delay(20);
- RA3_SET;
- PORTD=seg_data[a3];
- RA2_CLR;
- delay(20);
- RA2_SET;
- PORTD=seg_data[a4];
- RA1_CLR;
- delay(20);
- RA1_SET;
-
- }
- /*******************************
- if(nRF24l01_RxPacket(Rx_Buf))
- {
- a1=Rx_Buf[1]; //小数位
- a2=Rx_Buf[2]; //整数位
- a3=Rx_Buf[3]; //十位
- a4=Rx_Buf[4]; //个位
-
- };break;
- **************************/
- void main()
- {
- uint8 recv=0;
- uint k=0;
- int s;
- //unsigned char RX_Buf[20] = {0};
- //OPTION=0X00; //设置A口为普通I/O口
- TRISD = 0; //portd 输出
- TRISB = 0X00; //设置B口低4位为输入//高四位为输出
- TRISA = 0; //porta 输出
- PORTA = 0x00;//先关闭所有显示
- //PORTD = 0x0f;
- //delay(1);
- TRISE0=0;
- RE0=1;
- delay(1000);
- SpiInit();
- delay(1000);
- RX_MODE();
- delay(3500);
- nRF24l01_RxPacket(Rx_Buf);
- delay(2500);
- RX_MODE();
- delay(3500);
- delay(500);
- while(1)
- {
- k++;
-
- switch(k)
- {
- case 1000: if(nRF24l01_RxPacket(Rx_Buf)){break;}
- break;
-
-
-
- case 1003:k=0;break;//SPI_RW_Reg(FLUSH_RX,0X00);
- }
- // a0=Rx_Buf[5]; //biaozhiwei
- a1=Rx_Buf[1]; //shi数位
- a2=Rx_Buf[2]; //ge数位
- a3=Rx_Buf[3]; //0.位
- a4=Rx_Buf[4]; //0.00
- a0=Rx_Buf[5]; //biaozhiwei
- s=a0;
- if(s==0)
- {
- RE0=1;
- PORTD=seg_data[0];
- RA5=1;
- delay(20);
- RA5=0;
- PORTD=seg_data[a1]; //显示个位
- RA4_CLR;
-
- delay(20);
- RA4_SET;
- PORTD=seg_data[a2];
- RA3_CLR;
- DOT_CLR;
- delay(20);
- RA3_SET;
- PORTD=seg_data[a3];
- RA2_CLR;
- delay(20);
- RA2_SET;
- PORTD=seg_data[a4];
- RA1_CLR;
- delay(20);
- RA1_SET;
- // xianshishuju( temperx);
- }
- if(s!=0)
- {
- RE0=1;
- PORTD=seg_data[1];
- RA5=1;
- delay(20);
- RA5=0;
- PORTD=seg_data[a1]; //显示个位
- RA4_CLR;
-
- delay(20);
- RA4_SET;
- PORTD=seg_data[a2];
- RA3_CLR;
- DOT_CLR;
- delay(20);
- RA3_SET;
- PORTD=seg_data[a3];
- RA2_CLR;
- delay(20);
- RA2_SET;
- PORTD=seg_data[a4];
- RA1_CLR;
- delay(20);
- RA1_SET;
- // xianshishuju( temperx);
- }
-
- }
- }
- /**************************************12864接收************/
- #include <pic.h>//接收模式2020.2.4
- __CONFIG(0x3B31);
- //const rom unsigned int CONFIG=0x0101;
- //#include "tab1.h"
- #include "tab2.h"
- #include "dianzhen12864.h"
- #include "ds18b20_74.h"
- #include "nrf24_74.h"
- #define uint8 unsigned char
- #define uint16 unsigned int
- #define uchar unsigned char
- #define uint unsigned int
- void delayms(unsigned int x);
- void delay(uint16 us);
- uint temperx;
- uint temper;
- uchar d1,d2,d3,d4;
- void get_tem();
- uchar flag_fu=0; //温度正负值标志位
- #define BG RA5
- #define key RB0
- uchar f1,f2,f3,f4;
- int table[]={0,1,2,3,4,5,6,7,8,9};
- //0-9的显示代码
- char const wen1[]={
- /*-- 文字: 温 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
- 0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,
- };
- char const du1[]={
- /*-- 文字: 度 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
- 0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,
- };
- char const du2[]={
- /*-- 文字: ℃ --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,
- 0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00,
- };
- /***********************/
- char const shi[]={
- /*-- 文字: 室 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x10,0x0C,0x24,0x24,0xA4,0x64,0x25,0x26,0x24,0x24,0xA4,0x24,0x24,0x14,0x0C,0x00,
- 0x40,0x40,0x48,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x4B,0x48,0x40,0x40,0x00,
- };
- char const wai[]={
- /*-- 文字: 外 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0xC0,0x30,0x1F,0x10,0x10,0xF0,0x00,0x00,0xFF,0x20,0x40,0x80,0x00,0x00,0x00,
- 0x81,0x40,0x21,0x12,0x0C,0x03,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x03,0x00,0x00,
- };
- char const nei[]={
- /*-- 文字: 内 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0xF8,0x08,0x08,0x08,0x08,0x88,0x7F,0x88,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,
- 0x00,0xFF,0x00,0x08,0x04,0x02,0x01,0x00,0x00,0x01,0x02,0x4C,0x80,0x7F,0x00,0x00,
- };
- /***************************/
- /*************************************/
- void delayms(uint x)
- {
- unsigned int a,b;
- for(a=x;a>0;a--)
- for(b=110;b>0;b--);
- }
- void delay(uint16 us)//延时函数
- {
- while(us--);
- }
- void get_tem()
- {
- uchar i,m;
- uchar tem1,tem2,num;
- GIE=0;
- reset18();
- write_byte(0xCC);
- write_byte(0x44);
- // delayus(2,2);//600us(60,15)
- GIE=1;
-
- GIE=0;
- reset18();
- write_byte(0xCC);
-
-
- write_byte(0xBE);
- tem1=read_byte();
- tem2=read_byte();
- GIE=1;
- temper = ((tem2<<4)&0xF0)|((tem1>>4)&0x0F);
- if(temper>127)
- {
- //temper = ~temper + 1;
- flag_fu=1;
- }
- else
- {
- flag_fu=0;
- }
-
-
-
- temper=(tem2*256+tem1)*6.25;
- if(flag_fu==1)
- { temper = ~temper + 1;}
- if(temper>10000)
- {
- d1=temper/10000;
- d2=temper%10000/1000;
- d3=temper%1000/100;
- d4=temper%100/10;
- m=1;
- }
- else
- {
- d1=temper/1000;
- d2=temper%1000/100;
- d3=temper%100/10;
- d4=temper%10;
- m=0;
- }
-
- if (flag_fu==1)
- {
- DisplayString1608(1,60,"-");
- delay(10);
- //DisplayNumber1608(1, 33, 0);
- DisplayNumber1608(1, 68, d1);
- //delay(100);
- delay(10);
- DisplayNumber1608(1, 76,d2 );
- //delay(100);
- delay(10);
-
- DisplayString1608(1,84,".");
- delay(10);
- DisplayNumber1608(1,88,d3 );
- //delay(100);
- delay(10);
- DisplayNumber1608(1, 96,d4 );
- //delay(100);
- }
- else{
- if(m==1)
- {
-
- DisplayNumber1608(1, 60, 1);
- delay(10);
- DisplayNumber1608(1, 68, d1);
- //delay(100);
- delay(10);
- DisplayNumber1608(1, 76,d2 );
- //delay(100);
-
- delay(10);
-
- DisplayString1608(1,84,".");
- delay(10);
- DisplayNumber1608(1,88,d3 );
- //delay(100);
- delay(10);
- DisplayNumber1608(1, 96,d4 );
- //delay(100);
- }
-
- else
- {
- DisplayString1608(1,60," ");
- delay(10);
- //DisplayNumber1608(1, 33, 0);
- DisplayNumber1608(1, 68, d1);
- //delay(100);
- delay(10);
- DisplayNumber1608(1, 76,d2 );
- //delay(100);
- delay(10);
-
- DisplayString1608(1,84,".");
- delay(10);
- DisplayNumber1608(1,88,d3 );
- //delay(100);
- delay(10);
- DisplayNumber1608(1, 96,d4 );
- //delay(100);
- }
- }
- }
- void main()
- {
- uint k=0;
- uchar a1,a2,a3,a4;
- uchar bz1,bz2,bz3;//bz1:正负标志bz2: 正常标志bz3:超100标志
- bz1=0;
- bz2=0;
- bz3=0;
- uchar aw1,aw2,aw3;
- //unsigned char RX_Buf[20] = {0};
- //OPTION=0X00; //设置A口为普通I/O口
- TRISD = 0; //portd 输出
- TRISB = 0X01; //设置B口低4位为输入//高四位为输出
- ADCON1=0X06;
- delay(100);
- T0CS=0;
- TRISA=0x00;
- PORTD = 0x00;
- //delay(1);
- TRISE0=0;
- RE0=1;
- BG=1;
- InitLCD();
- delay(1000);
- clear_screen();
- reset18();
- delay(1000);
- SpiInit();
- delay(1000);
- RX_MODE();
- delay(3500);
- nRF24l01_RxPacket(Rx_Buf);
- delay(2500);
- RX_MODE();
- delay(3500);
- display_graphic_16x16(1,1,shi); /*在第 1 页,第 1 列显示单个汉字""*/
- display_graphic_16x16(1,16,nei); /*在第 1 页,第 1 列显示单个汉字""*/
- display_graphic_16x16(1,32,wen1); /*在第 1 页,第 1 列显示单个汉字""*/
- display_graphic_16x16(1,(48),du1); /*在第 1 页,第 17 列显示单个汉字""*/
- display_graphic_16x16(1,(114),du2); /*在第 5 页,第 89 列显示单个数字"9"*/
- display_graphic_16x16(3,1,shi); /*在第 1 页,第 1 列显示单个汉字""*/
- display_graphic_16x16(3,16,wai); /*在第 1 页,第 1 列显示单个汉字""*/
- display_graphic_16x16(3,32,wen1); /*在第 1 页,第 1 列显示单个汉字""*/
- display_graphic_16x16(3,(48),du1); /*在第 1 页,第 17 列显示单个汉字""*/
- display_graphic_16x16(3,(114),du2); /*在第 5 页,第 89 列显示单个数字"9"*/
- delay(500);
- while(1)
- {
-
-
- get_tem();
- k++;
-
- switch(k)
- {
- case 30: if(nRF24l01_RxPacket(Rx_Buf))
- {
- RD4=1;
- }
-
- break;
-
-
-
- case 38:k=0;// CSN=0;SPI_RW(FLUSH_RX); CSN=1;
- RD4=0;break;//SPI_RW_Reg(FLUSH_RX,0X00);
- }
- delayms(10);
-
-
- a1=Rx_Buf[1]; //小数位
- a2=Rx_Buf[2]; //整数位
- a3=Rx_Buf[3]; //十位
- a4=Rx_Buf[4]; //个
- bz1=Rx_Buf[5];
- bz2=Rx_Buf[6];
- bz3=Rx_Buf[7];
- delayms(10);
-
-
- f1=table[a1];
- f2=table[a2];
- f3=table[a3];
- f4=table[a4];
- aw1=table[bz1];
- aw2=table[bz2];
- aw3=table[bz3];
- if(aw2==0)
- {
- if(aw3==1)
- {
- DisplayString1608(3,60,1);
- delay(100);
- //DisplayNumber1608(1, 33, 0);
- DisplayNumber1608(3, 68, f1);
- //delay(100);
- delay(100);
- DisplayNumber1608(3, 76,f2 );
- //delay(100);
- delay(100);
- //display_graphic_8x16(3,(17),dian);
- DisplayString1608(3,84,".");
- delay(100);
- DisplayNumber1608(3,88,f3 );
- //delay(100);
- delay(100);
- DisplayNumber1608(3, 96,f4);
- delay(100);
- }
- if(aw1==1)
- {
- DisplayString1608(3,60,"-");
- delay(100);
- //DisplayNumber1608(1, 33, 0);
- DisplayNumber1608(3, 68, f1);
- //delay(100);
- delay(100);
- DisplayNumber1608(3, 76,f2 );
- //delay(100);
- delay(100);
- //display_graphic_8x16(3,(17),dian);
- DisplayString1608(3,84,".");
- delay(100);
- DisplayNumber1608(3,88,f3 );
- //delay(100);
- delay(100);
- DisplayNumber1608(3, 96,f4);
- delay(100);
- }
-
- else{
- DisplayString1608(3,68,"?");
- DisplayString1608(3,76,"?");
- DisplayString1608(3,84,"?");
- DisplayString1608(3,92,"?");
- }
-
- }
- delayms(10);
- if(aw2==1)
- {
-
- DisplayString1608(3,60," ");
- delay(100);
- //DisplayNumber1608(1, 33, 0);
- DisplayNumber1608(3, 68, f1);
- //delay(100);
- delay(100);
- DisplayNumber1608(3, 76,f2 );
- //delay(100);
- delay(100);
- //display_graphic_8x16(3,(17),dian); /*在第 5 页,第 89 列显示单个数字"9"*/
- DisplayString1608(3,84,".");
- delay(100);
- DisplayNumber1608(3,88,f3 );
- //delay(100);
- delay(100);
- DisplayNumber1608(3, 96,f4);
- delay(100);
-
- }
- if(key==0)
- {
- delayms(20);
- if(key==0)
- {
- BG=~BG;
- }
-
-
- }
- }
- }
- /*********************************************************/
复制代码
12864驱动以前发过可以找找。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|