聚尔硕无线模块程序

 

              测试PCB板引脚定义

               sbit          CS=P2^6;                    //  12864PIN4     vala显示缓冲valb加减时间处理缓冲
               sbit          SID=P2^7;                  //     12864PIN5
               sbit          SCLK=P1^0;              //     12864PIN6
               sbit          Setkey=P1^5;             //     设置按键
               sbit          funkey=P1^3;              //
               sbit          DATAUP=P1^2;         //加按键
               sbit          DATADOWN=P1^1;  //减按键

 

/

/

///WDT.h

#include "incxx.h"
#include "WDT.h"

#define d_WDTE 1                  //WDT Enable Bit
#define d_WDTM 0x0C              //WDTM[3:0] WDT Clock Source Divider Bit (0~F),4.19s

void WDT_initialize(void)          //Initialize WDT
{
    TAKEY=0x55;                    //**************************************//
    TAKEY=0xAA;                    //Set To Enable The WDTC Write Attribute//
    TAKEY=0x5A;                    //**************************************//
    WDTC=(d_WDTM)|(d_WDTE<<5);     //Set WDT Reset Time and Enable WDT
}

U8 wdtDelay = 0;
void WDT_CountClear(void)
{
    WDTK=0x55;                    //WDT Timer Clear To Zero    

    wdtDelay = 0;
    while(wdtDelay++ < 100)
        ;
}
#if 0
void WDT_Disable(void)
{
    TAKEY=0x55;                    //**************************************//
    TAKEY=0xAA;                    //Set To Enable The WDTC Write Attribute//
    TAKEY=0x5A;                    //**************************************//
    WDTC=0x00;                    //Disable WDT Function
}
#endif
/

boot.c///

#include "incXX.h"

void Init_main()
{
    IFCON |= 0x00 + 0x04;//ALE输出控制寄存器不输出
    EA = 0;    //关闭总中断


    TIMER0_initialize(); //定时器0初始化
    init_UART0();   //串口0初始化

    WDT_initialize();    //看门狗初始化
    WDT_CountClear(); //喂狗

    EA = 1;
  //IO口全部设置为普通的双向IO口
    P0M0 = 0;
    P0M1 = 0;
    
    P1M0 = 0;
    P1M1 = 0;
    
    P2M0 = 0;
    P2M1 = 0;
    
    P3M0 = 0;
    P3M1 = 0;
    
    P4M0 = 0;
    P4M1 = 0;

}
/*
void exint0() interrupt 0
{

}

U8 int001 = 0;
void exint1() interrupt 2
{
    int001 = 1;
    //SX1278_Interupt();
}
*/

void main()
{
    Init_main(); //使能低压中断,初始化定时器、串口,看门狗,设置IO口工作模式
    //开机指示
    P3 &= 0x0f;
    DelayMS(500);
    P3 |= 0xf0;
    DelayMS(500);
    P3 &= 0x0f;
    DelayMS(500);
    P3 |= 0xf0;
    DelayMS(500);
    //UART0_TX(0xaa);
    ProcessMain();

    while(1)
    {


    }
}

/

//1276.c///

#include "incXX.h"
#include "Sx1276.h"

unsigned char   Frequency[3]={0x6c,0x80,0x00};

unsigned char   SpreadingFactor=11;    //7-12,扩频因子选小一些,发射时间会更快一些。

unsigned char   CodingRate=2;        //1-4

unsigned char   Bw_Frequency=7;      //6-9

unsigned char   powerValue= 15;       //功率设置,调试的时候可以先设置小一点
/*
RegPaconfig 0x09
bit            name                  discription
 7         PaSelect             0--> RFO pin, Output power is limited to +14dBm
                                         1--> PA_BOOST pin, Output power is limited to +20dBm

6~4         MaxPower      Select max output power:Pmax=10.8+0.6*MaxPower [dBm]

3~0         OutputPower   if PaSelect=0, Pout=Pmax-(15-OutputPower)
                                         if PaSelect=1, Pout=17-(15-OutputPower)
*/
unsigned char   power_data[16]={0X80,0X81,0X82,0X83,0X84,0X85,0X86,0X87,0X88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f};

unsigned char   RF_EX0_STATUS;

unsigned char   CRC_Value;

unsigned char   SX1278_RLEN;


void Delay1s(unsigned int ii)
{
    unsigned char j;
    
    while(ii--)
    {
        for(j=0;j<200;j++);
    }
}

#if 0
void FSK_SEND_PACKET(void)
{
    SX1276LoRaSetOpMode( Stdby_mode );
    SX1276WriteBuffer(REG_LR_DIOMAPPING1,0x01);
    SX1276WriteBuffer(REG_LR_DIOMAPPING2,0x20);
}
#endif    

void SX1276WriteBuffer( unsigned char addr, unsigned char buffer)

    gSwitchEnStatus(enOpen); //NSS = 0;
    gByteWritefunc( addr | 0x80 );
    gByteWritefunc( buffer);
    gSwitchEnStatus(enClose); //NSS = 1;

}
    
unsigned char SX1276ReadBuffer(unsigned char addr)
{
    unsigned char Value;
    gSwitchEnStatus(enOpen); //NSS = 0;
    gByteWritefunc( addr & 0x7f  );
    Value = gByteReadfunc();
    gSwitchEnStatus(enClose);//NSS = 1;
    return Value; 
}
    
void SX1276LoRaSetOpMode( RFMode_SET opMode )
{
    unsigned char opModePrev;
    opModePrev=SX1276ReadBuffer(REG_LR_OPMODE);  //读0x01模式寄存器
    opModePrev &=0xf8;  //清零低三位
    opModePrev |= (unsigned char)opMode; //或上形参
    SX1276WriteBuffer( REG_LR_OPMODE, opModePrev); //重新写回去    
}

void SX1276LoRaFsk( Debugging_fsk_ook opMode )
{
    unsigned char opModePrev;
    opModePrev=SX1276ReadBuffer(REG_LR_OPMODE); //读0x01模式寄存器
    opModePrev &=0x7F; //清零最高位
    opModePrev |= (unsigned char)opMode;  //或上形参
    SX1276WriteBuffer( REG_LR_OPMODE, opModePrev); //重新写回去        
}
    
void SX1276LoRaSetRFFrequency(void)
{
    SX1276WriteBuffer( REG_LR_FRFMSB, Frequency[0]);  //写0x06寄存器
    SX1276WriteBuffer( REG_LR_FRFMID, Frequency[1]);  //写0x07寄存器
    SX1276WriteBuffer( REG_LR_FRFLSB, Frequency[2]);  //写0x08寄存器
}

void SX1276LoRaSetRFPower(unsigned char power )
{
    //Set Pmax to +20dBm for PA_HP, Must turn off PA_LF or PA_HF, and set RegOcp
    //SX1276WriteBuffer( REG_LR_PACONFIG,  power_data[power] ); //若没有这一句,频谱仪几乎测不到信号,但是可以进行正常收发。
    //SX1276WriteBuffer( REG_LR_OCP, 0x3f);  //add by skay,20160810, 写电流保护寄存器,
    SX1276WriteBuffer( REG_LR_PADAC, 0x87);  //high power
    SX1276WriteBuffer( REG_LR_PACONFIG,  power_data[power] ); //若没有这一句,频谱仪几乎测不到信号,但是可以进行正常收发。
}

    
void SX1276LoRaSetSpreadingFactor(unsigned char factor )
{
    unsigned char RECVER_DAT;
    SX1276LoRaSetNbTrigPeaks( 3 ); //0x03-->SF7 to SF12
    RECVER_DAT=SX1276ReadBuffer( REG_LR_MODEMCONFIG2); //读0x1E寄存器  
    RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG2_SF_MASK ) | ( factor << 4 );
    SX1276WriteBuffer( REG_LR_MODEMCONFIG2, RECVER_DAT );     
}
    
void SX1276LoRaSetNbTrigPeaks(unsigned char value )
{
    unsigned char RECVER_DAT;
    RECVER_DAT = SX1276ReadBuffer( 0x31);  //Read RegDetectOptimize,
    RECVER_DAT = ( RECVER_DAT & 0xF8 ) | value; //process;
    SX1276WriteBuffer( 0x31, RECVER_DAT );  //write back;
}
    
void SX1276LoRaSetErrorCoding(unsigned char value )
{    
    unsigned char RECVER_DAT;
    RECVER_DAT=SX1276ReadBuffer( REG_LR_MODEMCONFIG1); //读0x1D寄存器
    RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG1_CODINGRATE_MASK ) | ( value << 1 );
    SX1276WriteBuffer( REG_LR_MODEMCONFIG1, RECVER_DAT);
}
    
void SX1276LoRaSetPacketCrcOn(BOOL_t enable )
{    
    unsigned char RECVER_DAT;
    RECVER_DAT= SX1276ReadBuffer( REG_LR_MODEMCONFIG2);  //读0x1E寄存器 
    RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) | ( enable << 2 );
    SX1276WriteBuffer( REG_LR_MODEMCONFIG2, RECVER_DAT );
}
    
void SX1276LoRaSetSignalBandwidth(unsigned char bw )
{
    unsigned char RECVER_DAT;
    RECVER_DAT=SX1276ReadBuffer( REG_LR_MODEMCONFIG1);  //读0x1D寄存器
    RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG1_BW_MASK ) | ( bw << 4 );
    SX1276WriteBuffer( REG_LR_MODEMCONFIG1, RECVER_DAT );
}
    
void SX1276LoRaSetImplicitHeaderOn(BOOL_t enable )
{
    unsigned char RECVER_DAT;
    RECVER_DAT=SX1276ReadBuffer( REG_LR_MODEMCONFIG1 );  //读0x1D寄存器
    RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) | ( enable );
    SX1276WriteBuffer( REG_LR_MODEMCONFIG1, RECVER_DAT );
}
    
void SX1276LoRaSetSymbTimeout(unsigned int value )
{
    unsigned char RECVER_DAT[2];
    RECVER_DAT[0]=SX1276ReadBuffer( REG_LR_MODEMCONFIG2 );    //读0x1E寄存器
    RECVER_DAT[1]=SX1276ReadBuffer( REG_LR_SYMBTIMEOUTLSB );  //读0x1F寄存器
    RECVER_DAT[0] = ( RECVER_DAT[0] & RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) | ( ( value >> 8 ) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK );
    RECVER_DAT[1] = value & 0xFF;
    SX1276WriteBuffer( REG_LR_MODEMCONFIG2, RECVER_DAT[0]);
    SX1276WriteBuffer( REG_LR_SYMBTIMEOUTLSB, RECVER_DAT[1]);
}
    
void SX1276LoRaSetPayloadLength(unsigned char value )
{
    SX1276WriteBuffer( REG_LR_PAYLOADLENGTH, value );  //写0x22寄存器

    
#if 0
void SX1276LoRaSetPreamLength(unsigned int value )
{
    unsigned char a[2];
    a[0]=(value&0xff00)>>8;
    a[1]=value&0xff;
    SX1276WriteBuffer( REG_LR_PREAMBLEMSB, a[0] );
    SX1276WriteBuffer( REG_LR_PREAMBLELSB, a[1] );
}
#endif

void SX1276LoRaSetMobileNode(BOOL_t enable )
{     
    unsigned char RECVER_DAT;
    RECVER_DAT=SX1276ReadBuffer( REG_LR_MODEMCONFIG3 );  //读0x26寄存器
    RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG3_MOBILE_NODE_MASK ) | ( enable << 3 );
    SX1276WriteBuffer( REG_LR_MODEMCONFIG3, RECVER_DAT );
}

void SX1276LORA_INT(void)
{
    SX1276LoRaSetOpMode(Sleep_mode);  //设置睡眠模式
    SX1276LoRaFsk(LORA_mode);         // 设置扩频模式
    SX1276LoRaSetOpMode(Stdby_mode);  // 设置为普通模式
    SX1276WriteBuffer( REG_LR_DIOMAPPING1,GPIO_VARE_1); //写0x40寄存器,DIO引脚映射设置
    SX1276WriteBuffer( REG_LR_DIOMAPPING2,GPIO_VARE_2); //写0x41寄存器
    SX1276LoRaSetRFFrequency();  //频率设置
    SX1276LoRaSetRFPower(powerValue);  //功率设置
    SX1276LoRaSetSpreadingFactor(SpreadingFactor);     // 扩频因子设置
    SX1276LoRaSetErrorCoding(CodingRate);         //有效数据比
    SX1276LoRaSetPacketCrcOn(true);             //CRC 校验打开
    SX1276LoRaSetSignalBandwidth( Bw_Frequency );     //设置扩频带宽, 125khz
    SX1276LoRaSetImplicitHeaderOn(false);         //同步头是显性模式
    SX1276LoRaSetPayloadLength( 0xff);
    SX1276LoRaSetSymbTimeout( 0x3FF );
    SX1276LoRaSetMobileNode(true);              // 低数据的优化

    RF_RECEIVE();
}
    
void FUN_RF_SENDPACKET(unsigned char *RF_TRAN_P,unsigned char LEN)
{    
    unsigned char ASM_i;
    
    SX1276LoRaSetOpMode( Stdby_mode );
    SX1276WriteBuffer( REG_LR_HOPPERIOD, 0 );    //不做频率跳变
    SX1276WriteBuffer(REG_LR_IRQFLAGSMASK,IRQN_TXD_Value);    //打开发送中断
    SX1276WriteBuffer( REG_LR_PAYLOADLENGTH, LEN);     //最大数据包
    SX1276WriteBuffer( REG_LR_FIFOTXBASEADDR, 0); //写Tx FIFO基址
    SX1276WriteBuffer( REG_LR_FIFOADDRPTR, 0 ); //SPI interface address pointer in FIFO data buffer
    gSwitchEnStatus(enOpen);   //开片选
    gByteWritefunc( 0x80 );
    for( ASM_i = 0; ASM_i < LEN; ASM_i++ )
    {
        gByteWritefunc( *RF_TRAN_P );RF_TRAN_P++;
    }
    gSwitchEnStatus(enClose);  //关片选
    SX1276WriteBuffer(REG_LR_DIOMAPPING1,0x40);  //发射中断映射到DIO0引脚
    SX1276WriteBuffer(REG_LR_DIOMAPPING2,0x00);
    SX1276LoRaSetOpMode( Transmitter_mode );     //设置为传输模式
    
}
void RF_RECEIVE (void)
{
    SX1276LoRaSetOpMode(Stdby_mode );
    SX1276WriteBuffer(REG_LR_IRQFLAGSMASK,IRQN_RXD_Value);  //0x11,打开接收中断
    SX1276WriteBuffer(REG_LR_HOPPERIOD,    PACKET_MIAX_Value );//0x24寄存器
    SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X00 ); //DIO引脚映射设置,按默认
    SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0X00 );    
    SX1276LoRaSetOpMode( Receiver_mode );  //设置为连续接收模式
}
#if 0    
void RF_CAD_RECEIVE (void)
{
    SX1276LoRaSetOpMode( Stdby_mode );
    SX1276WriteBuffer(REG_LR_IRQFLAGSMASK,  IRQN_CAD_Value);    //打开发送中断
    SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X80 );
    SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0X00 );    
    SX1276LoRaSetOpMode( CAD_mode );
}
#endif

#if 0
void RF_SEELP(void)
{
    SX1276LoRaSetOpMode( Stdby_mode );
    SX1276WriteBuffer(REG_LR_IRQFLAGSMASK,  IRQN_SEELP_Value);  //打开发送中断
    SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X00 );
    SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0X00 );    
    SX1276LoRaSetOpMode( Sleep_mode );
}
#endif

//**************下面是中断里面处理的代码*******************************
unsigned char recv[10];
unsigned char RF_REC_RLEN_i;
void SX1278_Interupt(void)
{
    RF_EX0_STATUS=SX1276ReadBuffer( REG_LR_IRQFLAGS ); 
    if((RF_EX0_STATUS&0x40)==0x40)  //接收完成
    {
        CRC_Value=SX1276ReadBuffer( REG_LR_MODEMCONFIG2 );
        if(CRC_Value&0x04==0x04) //是否打开CRC校验
        {
            SX1276WriteBuffer (REG_LR_FIFOADDRPTR,0x00);
            SX1278_RLEN = SX1276ReadBuffer(REG_LR_NBRXBYTES); //读取最后一个包的字节数
            gSwitchEnStatus(enOpen);
            gByteWritefunc( 0x00 );
            if(SX1278_RLEN > 10)  //接收不超过10个字节
                SX1278_RLEN = 10;            
            for(RF_REC_RLEN_i=0;RF_REC_RLEN_i<SX1278_RLEN;RF_REC_RLEN_i++)
            {
                recv[RF_REC_RLEN_i]=gByteReadfunc();        
            }
            gSwitchEnStatus(enClose);
        }
        fqcRecvData(recv,SX1278_RLEN);  //处理下接收到的数据

        SX1276LoRaSetOpMode( Stdby_mode );
        SX1276WriteBuffer(REG_LR_IRQFLAGSMASK, IRQN_RXD_Value);  //打开发送中断
        SX1276WriteBuffer(REG_LR_HOPPERIOD,    PACKET_MIAX_Value);
        SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X00 );
        SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0x00 );    
        SX1276LoRaSetOpMode( Receiver_mode );

    }
    else if((RF_EX0_STATUS&0x08)==0x08)  //发射完成
    {
        SX1276LoRaSetOpMode( Stdby_mode );
        SX1276WriteBuffer(REG_LR_IRQFLAGSMASK,IRQN_RXD_Value);    //打开发送中断
        SX1276WriteBuffer(REG_LR_HOPPERIOD,   PACKET_MIAX_Value );
        SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X00 );
        SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0x00 );    
        SX1276LoRaSetOpMode( Receiver_mode );
        
    }
    else if((RF_EX0_STATUS&0x04)==0x04)  //cad完成
    {  
        if((RF_EX0_STATUS&0x01)==0x01)
        {     
        //表示CAD 检测到扩频信号 模块进入了接收状态来接收数据
            SX1276LoRaSetOpMode( Stdby_mode );
            SX1276WriteBuffer(REG_LR_IRQFLAGSMASK,IRQN_RXD_Value);    //打开发送中断
            SX1276WriteBuffer(REG_LR_HOPPERIOD,   PACKET_MIAX_Value );
            SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X02 );
            SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0x00 );    
            SX1276LoRaSetOpMode( Receiver_mode );
            
        }
        else
        {                           
        // 没检测到
            SX1276LoRaSetOpMode( Stdby_mode );
            SX1276WriteBuffer(REG_LR_IRQFLAGSMASK,    IRQN_SEELP_Value);    //打开发送中断
            SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X00 );
            SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0X00 );    
            SX1276LoRaSetOpMode( Sleep_mode );
            
        }
    }
    else
    {
        SX1276LoRaSetOpMode( Stdby_mode );
        SX1276WriteBuffer(REG_LR_IRQFLAGSMASK,IRQN_RXD_Value);    //打开发送中断
        SX1276WriteBuffer(REG_LR_HOPPERIOD,   PACKET_MIAX_Value );
        SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X02 );
        SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0x00 );    
        SX1276LoRaSetOpMode( Receiver_mode );
        
    }
    SX1276WriteBuffer( REG_LR_IRQFLAGS, 0xff  );

}

///
///
///
///
///

void Delaycc(void)
{
    unsigned int xccv,ysdfg;
    for(xccv=0; xccv<1000; xccv++)
        for(ysdfg=0; ysdfg<110; ysdfg++);
}

void Delaymm(void)
{
    //unsigned char xccv;
   // for(xccv=0; xccv<20; xccv++);
}

void GPIO_Config(void)
{
    RF_REST_L;
    RF_CKL_L;
    RF_CE_H;
    RF_SDI_H;               //MOSI
    SX1278_SDO = 1;  //MISO
}

void SX1276Reset(void)
{
    RF_REST_L;    
    Delay1s(200);  //125.673ms
    RF_REST_H;
    Delay1s(500);
}

void RF_SPI_MasterIO(unsigned char outtt)
{
    unsigned char i;
    for (i=0;i<8;i++)
    {   
        if (outtt & 0x80)            /* check if MSB is high */
            RF_SDI_H;
        else 
            RF_SDI_L;                        /* if not, set to low */

        RF_CKL_H;                          /* toggle clock high */
        Delaymm();
        outtt = (outtt << 1);    /* shift 1 place for next bit */
        RF_CKL_L;                            /* toggle clock low */
        Delaymm();
    }
}


unsigned char RF_SPI_READ_BYTE()
{     
    unsigned char j;
    unsigned char i;
    j=0;
    for (i = 0; i < 8; i++)
    {     
        RF_CKL_H; 
        Delaymm();
        j = (j << 1);            // shift 1 place to the left or shift in 0 //
        if( SX1278_SDO )    // check to see if bit is high //
            j = j | 0x01;     // if high, make bit high //
                                          // toggle clock high // 
        RF_CKL_L;               // toggle clock low //  
        Delaymm();
    }
    return j;                        // toggle clock low //
}

void cmdSwitchEn(cmdEntype_t cmdcmd)
{
    switch(cmdcmd)
    {
        case enOpen:
        {
            RF_CE_L;
            break;
        }
        case enClose:
        {
            RF_CE_H;
            break;
        }
        
        default:
            break;
    }
}

void fqcRecvData(unsigned char *lpbuf,unsigned short len)// 接收到RF的数
{
    unsigned char i;
    unsigned char Irq_flag=0;
    switch(lpbuf[1]&0x0f)
    {
        case 0x0e:P3_4=0;
            break;
        case 0x0d:P3_5=0;
            break;
        case 0x0b:P3_6=0;
            break;
        case 0x07:P3_7=0;
            break;
        default: P3 |=0xf0;
            break;
    }
    uartSendRecv();
    Delaycc();
    WDT_CountClear(); //喂狗
    Delaycc();
#if 1
    for(i=0; i<3; i++)
    {
        FUN_RF_SENDPACKET(lpbuf,len); //发射数据
        Irq_flag=SX1276ReadBuffer( REG_LR_IRQFLAGS ); 
        //while(Irq_flag&0x08 != 0x08)  //xx
        while((Irq_flag&0x08) != 0x08)
        {
            DelayMS(1);
            Irq_flag=SX1276ReadBuffer( REG_LR_IRQFLAGS ); 
        }
    }
    SX1278_RLEN = 0;
#endif
    //uartSendRecv();
    //Delaycc();
    //Delaycc();
    P3 |=0xf0;

}

void main_init(void)
{   
    GPIO_Config();
    SX1276Reset();
    SX1276LORA_INT();
    //enableInterrupts();
    SX1278_RLEN = 0;   
}

void uartSendRecv()
{
    if(SX1278_RLEN)
    {
        UartTestSend(recv,SX1278_RLEN);
        //SX1278_RLEN = 0;
    }

}

///
///
///
///
/client.c

//************************************************************************************
//    ProjectCode                    :    Sx1278_Demo
//    Function                        :    Press one key, Send a set of data to other Board,
//                                                After the other Board recept the data, Send it back and light
//                                                on the corresponding LED, also send the data to serial port.
//    CreateBy                        :    skay.chan    
//    CreateDate                    :    2016-7-20
//    ModifyDate                    :    2016-9-29
//    Document                        :    
//    WorkPlatform                : Keil4    
//    Others                            :    QQ:2168916131
//    Copyright                        :    Lchstar.com
//*************************************************************************************
#include "incXX.h"

U32 __DelayTimerMs;
void DelayMS(U8 ms)
{
    __DelayTimerMs = GetTimer();
    while(SpanTime(__DelayTimerMs) < ms)
        WDT_CountClear();

}

void UartTestSend(U8* pbuffer,U8 len)
{
    U8 i;
    for(i=0; i<len; i++)
        UART0_TX(pbuffer[i]);
}

U32 Timer0Count = 0;
void TimerTick()
{
    Timer0Count++;    
}

U32 Timer0Temp;
U32 GetTimer()
{
    ET0 = 0;
    Timer0Temp = Timer0Count;
    ET0 = 1;
    return Timer0Temp;
}
/********扫描时间间隔函数*********/
U32 SpanTime(U32 OldTime)
{
    ET0 = 0;  //关T0中断
    Timer0Temp = Timer0Count; //取当前定时计数器的计数值。
    ET0 = 1;  //使能T0中断
    if(Timer0Temp >= OldTime)
        return Timer0Temp - OldTime;  //返回两次计数器的差值
    else //如果新的值小于老的值,说明计数器已经至少走过了一轮了
        return (U32)-1 - OldTime + Timer0Temp;
}

/*
void INTInit()
{
    IE0 = 0;
    IT0 = 1;
    EX0 = 1;

    IE1 = 0;
    IT1 = 1;
    EX1 = 1;
}
*/

void ProcessMain()
{
    main_init();//复位及初始化1276
    //INTInit();
    EA = 1;  //开总中断
    DelayMS(500);
    while(1)
    {
        WDT_CountClear(); //喂狗
        DelayMS(1);              //1.10189ms
        ProcessIdle();    //处理空闲模式,发射接收都在里面,主要的就是这个函数
    }
}

U8 _getinputVar = 0;
U8 _geti;
/******获取输入函数*******/
U8 GetInput()
{
    _geti = 0;
    _getinputVar = P2 & 0xF0; //读取P2.7~4的值
  //P2.7=KEY3, P2.6=KEY2, P2.5=KEY1, P2,4=KEY0
    while(_geti < 5)
    {        
        DelayMS(5);
        if(_getinputVar == (P2 & 0xF0))
            break;
        else
            _getinputVar = P2 & 0xF0;
        
        _geti++;
    }
    while((P2&0xf0) != 0xF0)
        ;
    _getinputVar >>= 4;  //右移4位,将高4位的键值移到低4位
    return _getinputVar;

}

void scLED(ledCmdType_t _ledcmd,ledVarType_t _ledvar)
{
    switch(_ledcmd)
    {
        case ledONE:
        {
            __LED0__ = _ledvar;  //#define __LED0__ P3_4
            break;
        }
        case ledTWO:
        {
            __LED1__ = _ledvar;  //#define __LED1__ P3_5
            break;
        }
        case ledTHREE:
        {
            __LED2__ = _ledvar;  //#define __LED2__ P3_6
            break;
        }
        case ledFOUR:
        {
            __LED3__ = _ledvar;  //#define __LED3__ P3_7;板上显示led4
            break;
        }
        default:
            break;
    }
}

U8 inputStatue = 0x0F;
U8 inputValue = 0x00;
U8 gSendBuffer[SENDBUFFERLEN];
U8 gRecvBuffer[SENDBUFFERLEN];

void ProcessIdle()
{
    inputValue = GetInput();
    if(inputValue != inputStatue) //有按键按下,inputStatue默认是为0x0f;
    {    
        UART0_TX(inputValue);          //先发串口看看
        ProcessOutput(inputValue);     //LED输出下状态?
        ProcessSend();                             //发射
        inputValue=0x00;                      //键值清零
        P3 |= 0xf0;                                  //关LED灯
    }
    ProcessRecv();                              //接收    
}

void ProcessRecv()
{
    if(SX1276ReadBuffer( REG_LR_IRQFLAGS ))  //读0x12状态寄存器
        SX1278_Interupt();
}

U8 inputStatueOld = 0x0F;
void ProcessSend()
{
    unsigned char i;
    unsigned char Irq_flag=0;

    gSendBuffer[0] = 0x5a;
    gSendBuffer[1] = inputValue;
    gSendBuffer[2] = 0xfa;
    for(i=0; i<3; i++)
    {
        FUN_RF_SENDPACKET(gSendBuffer,SENDBUFFERLEN); //发射数据
        Irq_flag=SX1276ReadBuffer( REG_LR_IRQFLAGS ); 
        //while(Irq_flag&0x08 != 0x08)  //xx
        while((Irq_flag&0x08) != 0x08)
        {
            DelayMS(1);
            Irq_flag=SX1276ReadBuffer( REG_LR_IRQFLAGS ); 
        }
    }
}

void ProcessOutput(U8 outputStatue)
{
    U8 temp;
    temp = outputStatue;
    if(temp & 0x01)  //是否没有按下key0
    {
        scLED(ledONE,ledOFF);          //关闭LED1
    }
    else //如果有按下key0
    {
        scLED(ledONE,ledON);            //开启LED1
    }        
    if(temp & 0x02)
    {
        scLED(ledTWO,ledOFF);           //关闭LED2
    }
    else
    {
        scLED(ledTWO,ledON);            //开启LED2
    }
    
    if(temp & 0x04)
    {
        scLED(ledTHREE,ledOFF);           //关闭LED3
    }
    else
    {
        scLED(ledTHREE,ledON);            //开启LED3
    }
    
    if(temp & 0x08)
    {
        scLED(ledFOUR,ledOFF);          //关闭LED4
    }
    else
    {
        scLED(ledFOUR,ledON);            //开启LED4
    }

}


///
///
///
//uart0.c///

#include "incXX.h"
#include "UART0.h"

//===============================================================
//DEFINITIONs
//===============================================================
// 22.1184M 115200
//#define d_S0RELH            0x03
//#define d_S0RELL            0xFA

//9600
//22.1184M
#define d_S0RELH            0x03
#define d_S0RELL            0xB8

//4M
//#define d_S0RELH            0x03
//#define d_S0RELL            0xF3

//8M
//#define d_S0RELH            0x03
//#define d_S0RELL            0xE6

//===============================================================
//GLOBAL VARIABLE
//===============================================================
bit bU0TX    = 0;

unsigned char UartBuffer[__UARTBUFFERLEN];
unsigned char UartBufferLen = 0;
U32 __UartTimer = 0;
//=========================================================================
void init_UART0(void)
{
    S0RELH     = d_S0RELH;  //串口0重载寄存器高字节
    S0RELL     = d_S0RELL;  //串口0重载寄存器字低节
    AUX        |= 0x80;            // BRS = 1
    PCON    |= 0x80;            // SMOD =1,串口通信的波特率倍增
    IEN0     |= 0x90;            // EA=1, ES0=1, interrupt enable,使能串口0中断
    S0CON     = 0x50;            // mode 1, SM20=0, Revice enable
    TI=0;   //清除发射中断标志
}

void UART0_ISR(void) interrupt d_UART0_Vector
{
    unsigned char RXBUF0;

    if(RI)                        // INT_RX
    {
        RI = 0;                    // RI clear
        RXBUF0 = S0BUF;            // Read BUF, user code...
        UartBuffer[UartBufferLen++] = RXBUF0;
        if(UartBufferLen >= __UARTBUFFERLEN)
            UartBufferLen = __UARTBUFFERLEN - 1;
        __UartTimer = GetTimer();
    }
    else                        // INT_TX
    {
        bU0TX    =0;
        TI        =0;                // TI clear
    }
}

void UART0_TX(unsigned char n_temp0)
{    
    bU0TX    = 1;
    S0BUF    = n_temp0;
    while(bU0TX)
    {
        ;
    }
}

/

///timer.c///

#include "Timer.h"
#include "incXX.h"

#define TIMER0_VECTOR 1 //TIMER0 Interrupt Vevtor
#define d_T0MOD 0x01 //TMOD[3:0] TIMER0 Mode setting 
#define d_T1MOD 0x01 //TMOD[7:4] TIMER1 Mode setting
#define ET2 0x00 //TIMER2 overflow Interrupt Enable (Default 0 Disable)
#define ET1 0x00 //TIMER1 overflow Interrupt Enable (Default 0 Disable)
#define ET0 0x01 //TIMER0 overflow Interrupt Enable (Default 0 Disable)
unsigned int d_MODEVALUE_T0 = 65536; //MODE0 13bit 8192
                          //MODE1 16bit 65536
                          //MODE2 8bit 256(Auto Reload)
                          //MODE3 8bit 256                          
unsigned int d_RELOADVALUE_T0 = 128; //User Define Reload Value 

int i=100;

#define FOSC 22118400
//#define FOSC 8000000
#define T0MS    (65535 - FOSC/12/1000 + 5)


void TIMER0_initialize(void)  //Initialize TIMER0
{
    IEN0=(ET2<<5)|(ET1<<3)|(ET0<<1); //IE=IEN0,使能外部中断1
    TMOD=(d_T1MOD<<4)|(d_T0MOD); //T1,T0都为16位定时计数器.
    
    TL0 = T0MS;
    TH0 = T0MS>>8;
    TF0 = 0; //清除定时器0溢出标志

  TR0=1; //Timer0 Start bit     
}

void TIMER0_ISR(void) interrupt TIMER0_VECTOR 
{
    
    TL0 = T0MS;
    TH0 = T0MS>>8;
    TF0 = 0;

    TimerTick();
    
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值