📄 具备跳号跳频和跳址的nrf905的c51演示程序 (ourdev_cn 我们的电子开发社区).htm
字号:
<BR> nRFReadWrite();//无线收发模块 <BR> }
<BR> SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] = 0;//清除压键计数器
<BR> } <BR> SystemBuffers.TimeCount++;//继续下1个5mS延时
<BR> if ((SystemBuffers.TimeCount & ~0x80) >= 100){//5mS*100=500mS
<BR> SystemBuffers.WaitTime ++;
<BR> if (SystemBuffers.WaitTime >= SysWaitTime) {//0.5*20=10S
<BR> P0 = 0xff;//关显示
<BR> SystemBuffers.WaitTime = 0;
<BR> }
<BR> SystemBuffers.TimeCount &= 0x80;
<BR> SystemBuffers.TimeCount ^= 0x80;//取反闪烁位
<BR> } <BR>} <BR><BR>/*------------------------------------*/
<BR>void sioproc() interrupt SIO_VECTOR using 1
<BR>{ <BR>unsigned char i;
<BR> if (RI) {//接收中断
<BR> RI = 0;
<BR> if (SioBuffers.SioRXCount && (SioBuffers.SioRXCount <= 32)) {//允许串口接收数据
<BR> SioBuffers.SioRxBuff[32 - SioBuffers.SioRXCount] = SBUF;
<BR> SioBuffers.SioRXCount --;
<BR> if (SioBuffers.SioRXCount == 0) {
<BR> for (i = 0; i < 32; i ++) {
<BR> SioBuffers.SioTxBuff[i] = SioBuffers.SioRxBuff[i];//自收自发
<BR> SystemBuffers.nRFTxBuff[i] = SioBuffers.SioTxBuff[i];//更新无线发送数据
<BR> } <BR>/*
<BR> switch(SystemBuffers.nRFTxBuff[9]) {
<BR> case 0x81: LED0 = 0;break;
<BR> case 0x82: LED1 = 0;break;
<BR> case 0x83: LED2 = 0;break;
<BR> case 0x84: LED3 = 0;break;
<BR> case 0x03: LED2 = 0;break;
<BR> case 0x04: LED3 = 0;break;
<BR> } <BR>*/
<BR> SioBuffers.SioRXCount = 32;//串口接收缓冲区满
<BR> SioBuffers.SioTXCount = 32;//串口发送缓冲区满
<BR> TI = 1;//立即发送
<BR> SystemBuffers.nRFTxCount = 32;//要求间接无线发送
<BR> } <BR> }
<BR> else SioBuffers.SioRXCount = 0;//不允许串口接收数据
<BR> } <BR> if (TI) {//发送中断
<BR> TI = 0;
<BR> if (SioBuffers.SioTXCount && (SioBuffers.SioTXCount <= 32)) {//允许串口发送数据
<BR> SBUF = SioBuffers.SioTxBuff[32 - SioBuffers.SioTXCount];//串口显示
<BR> SioBuffers.SioTXCount --; <BR> }
<BR> else SioBuffers.SioTXCount = 0;//不允许串口发送数据
<BR> } <BR>} <BR><BR><BR>//执行键盘命令
<BR>void KeyCommandExec(unsigned char commgroup, unsigned char commnum) using 0
<BR>{ <BR>unsigned int i; <BR>unsigned key;
<BR>code void *KeyArray[3][4] = {//二维函数数组指针阵列表(散转命令地址表)
<BR> {(void *)Key00 + 0x5b7d, (void *)Key01 + 0xa6ea, (void *)Key02 + 0xf157, (void *)Key03 + 0x4cc4},
<BR> {(void *)Key10 + 0x9731, (void *)Key11 + 0xe2ae, (void *)Key12 + 0x3d1b, (void *)Key13 + 0x8888},
<BR> {(void *)Key20 + 0xd3f5, (void *)Key21 + 0x2e62, (void *)Key22 + 0x79df, (void *)Key23 + 0xc44c}
<BR> };
<BR> if ((commgroup < 3) && (commnum < 4)) {
<BR> ClrWdt();//清除看门狗计数器
<BR> key = commgroup * 4 + commnum + 1;
<BR> i = ((key * 53 & 0xf) * 0x1000)+ ((key * 43 & 0xf) * 0x100) + ((key * 23 & 0xf) * 0x10) + (key * 13 & 0xf);
<BR> _icall_((void *)KeyArray[commgroup][commnum] - i);//键盘命令散转
<BR> } <BR>}
<BR><BR><BR>void BeepSetup(unsigned char mode) <BR>{
<BR>// BeepBuffers.BeepCount = 1;
<BR>// BeepBuffers.BeepMode = mode;
<BR>// BeepBuffers.BeepValue = mode; <BR>}
<BR>/*----------------------------------
<BR> 蜂鸣器100mS发声程序
<BR>----------------------------------*/ <BR>void Beep(void)//蜂鸣器发声
<BR>{ <BR>// BeepBuffers.BeepCount --;
<BR>// if (BeepBuffers.BeepCount == 0){
<BR>// BeepBuffers.BeepCount = 0;
<BR>// BeepBuffers.BeepValue = BeepBuffers.BeepMode;
<BR>// if (BeepBuffers.BeepValue >= 0x80)//单声
<BR>// BeepBuffers.BeepMode = 0; //单声清除
<BR>// }
<BR>// BeepBuffers.BeepValue <<= 1;
<BR>// CY = ~CY; //硬件反向
<BR>// BeepOut = CY;//发声 <BR>}
<BR><BR>void KeyInit(void) using 0//键盘初始化 <BR>{
<BR>unsigned char i;
<BR> for (i = 0; i < 4; i++){
<BR> SystemBuffers.KeyCount[i] = 0;//清除键盘压键次数缓冲区
<BR> } <BR>} <BR><BR>//收发无线读写模块
<BR>void nRFReadWrite(void) <BR>{ <BR>unsigned char i;
<BR>unsigned int t;
<BR> if (!TX_EN && DR && AM) {//收到数据
<BR> ClrWdt();
<BR> TRX_CE = 0;//设置nRF905为待机方式
<BR> _nop_();
<BR> CSN=0; // Spi enable for write a spi command
<BR> SpiReadWrite(RRP); // Read payload command
<BR> for (i = 0; i < 32; i++)
<BR> {
<BR> SystemBuffers.nRFRxBuff[i]=SpiReadWrite(0xff);//读入无线接收缓冲区
<BR> }
<BR> CSN=1; // Disable spi
<BR> TRX_CE = !TX_EN;//再回到原来的无线收发模式
<BR>// TRX_CE = 1;//再回到接收模式
<BR> switch(SystemBuffers.nRFRxBuff[9]) {
<BR> case 0x81: LED0 = 0;break;
<BR> case 0x82: LED1 = 0;break;
<BR> case 0x83: LED2 = 0;break;
<BR> case 0x84: LED3 = 0;break;
<BR> case 0x01: LED0 = 0;break;
<BR> case 0x02: LED1 = 0;break;
<BR> case 0x03: LED2 = 0;break;
<BR> case 0x04: LED3 = 0;break;
<BR> }
<BR> SystemBuffers.WaitTime = 0;
<BR> while(DR || AM);
<BR> SystemBuffers.nRFRxCount = 32;//收到32个字节数据
<BR> if (SioBuffers.SioTXCount == 0){//串口数据已发送完
<BR> for (i = 0; i < 32; i ++)
<BR> SioBuffers.SioTxBuff[i] = SystemBuffers.nRFRxBuff[i];//串口显示
<BR> SioBuffers.SioTXCount = 32;//发送32个字节的显示数据
<BR> TI = 1;//立即显示 <BR> }
<BR> }
<BR> else if(!CD && (SystemBuffers.nRFRxCount == 32)) {//接收命令处理
<BR> SystemBuffers.nRFRxCount = 0;
<BR> for (i = 0; i < 4; i ++)
<BR> SystemBuffers.nRFTxBuff[i] = SystemBuffers.nRFRxBuff[i + 4];//写入串口接收缓冲区
<BR> for (i = 4; i < 8; i ++)
<BR> SystemBuffers.nRFTxBuff[i] = SystemBuffers.nRFRxBuff[i - 4];//写入串口接收缓冲区
<BR> for (i = 8; i < 32; i ++)
<BR> SystemBuffers.nRFTxBuff[i] = SystemBuffers.nRFRxBuff[i];//写入串口接收缓冲区
<BR> if (SystemBuffers.nRFRxBuff[9] == 0x80) {//系统消息请求
<BR> SystemBuffers.nRFTxBuff[9] = 0x00;//主机系统消息应答
<BR> ReadnRFConfig(SystemBuffers.nRFTxBuff);
<BR> SystemBuffers.nRFTxCount = 32;//主机要求间接无线发送
<BR> }
<BR> else if (SystemBuffers.nRFRxBuff[9] == 0x81) {//子机请求
<BR>// LED0 = 0;//主机灯亮
<BR> SystemBuffers.nRFTxBuff[9] = 0x01;//主机应答
<BR> SystemBuffers.nRFTxBuff[10] = 0x20;
<BR> SystemBuffers.nRFTxBuff[11] = 0x04;
<BR> SystemBuffers.nRFTxBuff[12] = 0x10;
<BR> SystemBuffers.nRFTxBuff[13] = 0x18;
<BR> SystemBuffers.nRFTxBuff[14] = 0x11;
<BR> SystemBuffers.nRFTxBuff[15] = 0x28;
<BR> SystemBuffers.nRFTxCount = 32;//主机要求间接无线发送
<BR> }
<BR> else if (SystemBuffers.nRFRxBuff[9] == 0x82) {//子机请求
<BR>// LED1 = 0;//主机灯亮
<BR> SystemBuffers.nRFTxBuff[9] = 0x02;//主机应答
<BR> SystemBuffers.nRFTxBuff[10] = 0x20;
<BR> SystemBuffers.nRFTxBuff[11] = 0x04;
<BR> SystemBuffers.nRFTxBuff[12] = 0x10;
<BR> SystemBuffers.nRFTxBuff[13] = 0x26;
<BR> SystemBuffers.nRFTxBuff[14] = 0x21;
<BR> SystemBuffers.nRFTxBuff[15] = 0x09;
<BR> SystemBuffers.nRFTxCount = 32;//主机要求间接无线发送
<BR> }
<BR> else if (SystemBuffers.nRFRxBuff[9] == 0x83) {//子机变址请求
<BR>// LED2 = 0;//主机变址灯亮
<BR> SystemBuffers.nRFTxBuff[9] = 0x03;//主机变址应答
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -