完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
// #include #define uchar unsigned char ***it RF = P1^1; //信号输入 ***it set = P1^2; //学习键 ***it D1 = P3^5; //2号继电器 ***it D3 = P3^7; //4号继电器 ***it deng2 = P5^4; //K2指示灯 ***it deng4 = P3^2; //K4指示灯 ***it aj1 = P1^3; //K1 ***it aj3 = P1^5; //K3 bit decode_ok; //解码成功 bit study; //学习标志 bit m=0,ba=0,ca=0,da=0,ea=0,za=0,aa=0,hv=0,ff=0,ra=0,rb=0,rc=0,rd=0,g=0,hm=0,biao=0,kt=0; bit biao_2=0,g_2=0,kt_2=0,hm_2=0; uchar da1527[2][3]; //解码过程中临时数组 uchar short_k; //窄脉冲宽度 uint dt=0,dr=0,dq=0,rv=0,rv_1=0,rv_2=0,rv_3=0; uchar ReadData=0,ReadData_1=0,ReadData_2=0,ReadData_3=0; uchar xdata key_number[181]; //遥控器编码数组,存放60个遥控器 { for(x;x>0;x--) for(b=3;b>0;b--) for(c=150;c>0;c--); } { { } //==================================================== //==================================================== { //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关 IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用 IAP_ADDRH = 0; }// //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节 { IAP_CONTR = 0x84; //打开IAP 功能, 设置Flash 操作等待时间 IAP_ADDRL = addr&0xff; //设置目标单元地址的低8 位地址 EA = 0; IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动 EA = 1; //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关 }//------------------------------------------------------------------------------ void write_add(uint addr,uchar ch) //直接写EEPROM IAP_CONTR = 0x84; //打开 IAP 功能, 设置Flash 操作等待时间 IAP_ADDRH = addr>>8; //设置目标单元地址的高8 位地址 EA = 0; IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动 EA = 1; //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关 //擦除扇区, 入口:DPTR = 扇区地址 { IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令 IAP_ADDRH =addr>>8; //设置目标单元地址的高8 位地址 IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此 _nop_(); }//------------------------------------------------------------------------------ //============================接收解码部分========================================// void RF_decode() uchar ii=0,j=0,k=0,rep=0; uchar s; short_k=0; { short_k++; while(!RF) delay(1); } //检测头脉冲的宽度 { { { { while(RF && j<245) delay(1); }// { } else {return;} //乱码退出 while(!RF && j<150){delay(2);j++;} //跳过低电平 }//for(ii=0;ii<12;ii++) head_k=0;while(!RF) {delay(1);head_k++;} //检测下一个前导信号的寬度 } if((da1527[0][0]==da1527[1][0]) && (da1527[0][1]==da1527[1][1]) && (da1527[0][2]==da1527[1][2])) //两次接收到的数据相同 uchar u,i,x; for(i=0;i<3;i++) //判定2262与1527 for(u=0;u<4;u++) {if(((da1527[0]>>(u*2)) & 3)==2) {i=80;break;}} //有10则为1527 } { da1527[0][2]=da1527[1][2]>>4; //分出1527的后4位地址 } { for(i=0;i<4;i++){if(((da1527[0][2]>>(i*2))&3)==3) key_d|=1< jmnx=0; //为0是2262,1是1527 } if (!study) //非学习状态 rf_ok=0; { &&(da1527[0][2]==key_number[x*3+3]))//判断是否已学习过的编码 // D1=!(key_d&0x04); // D3=!(key_d&0x01); { if(key_d == 0x02){D0=1;D1=0;D2=1;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;} if(key_d == 0x04){D0=1;D1=1;D2=0;D3=1;}//D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;} // if(key_d == 0x06){D0=1;D1=1;D2=1;D3=1;D4=1;D5=0;D6=1;D7=1;D8=1;D9=1;D10=1;D11=1;} if(key_d == 0x08){D0=1;D1=1;D2=1;D3=0;}//D4=1;D5=1;D6=1;D7=0;D8=1;D9=1;D10=1;D11=1;} // if(key_d == 0x0a){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=0;D10=1;D11=1;} // if(key_d == 0x0c){D0=1;D1=1;D2=1;D3=1;D4=1;D5=1;D6=1;D7=1;D8=1;D9=1;D10=1;D11=0;} else if(ba==0) //B按键自锁 if(key_d == 0x04) if(jk==1) D2=~D2; } { { { } } //A自锁 { { { } } //C自锁 { { { } } //D自锁 { } { } { } { } decode_ok=1; sn=1; so=1; s=30; } } if(decode_ok) //解码有效信号,类似2272 PT脚 s--; { decode_ok=0; if(hh==1){sn=2;} if(hu==1){so=2;} } } void key_buffer() //把遥控器码从 EEPROM 复制到DATA uchar n; for(n=0;n<181;n++) key_number[n]=read_add(0x0000+n); } void KEY_study() //遥控器学习 uchar num_rf; if(study) rf_ok=0; { d_num++; } if(rf_ok==1) if(num_rf>60){num_rf=0;} //如果遥控器数量超过10个,覆盖最先学习的 key_number[num_rf*3+2]=da1527[0][1]; key_number[0]=num_rf+1; Sector_Erase(0x0000); { rf_ok=0; } { { delay_1ms(100); LED=1; } study=0; } void system_res() //系统清零 write_add(0x0000,0x00); { { { h=0; while(!set) delay_1ms(100); if(h>80) study=0; system_res(); while(!set); } h++; if(study) KEY_study(); } * 按键读取 void KeyRead()//读取按键IO口函数 ReadData = aj1^0xff; // 读取按键状态取反后赋值给ReadData cont = ReadData; //cont长按,长按cont=1,抬手后cont=0 ReadData_1 = aj2^0xff; // 读取按键状态取反后赋值给ReadData cont_1 = ReadData_1; //cont长按,长按cont=1,抬手后cont=0 ReadData_2 = aj3^0xff; // 读取按键状态取反后赋值给ReadData cont_2 = ReadData_2; //cont长按,长按cont=1,抬手后cont=0 ReadData_3 = aj4^0xff; // 读取按键状态取反后赋值给ReadData cont_3 = ReadData_3; //cont长按,长按cont=1,抬手后cont=0 /******************************************************************* ********************************************************************/ { { rv=0; //长按延时标志位防止短按到200次后长按启动 g=0; //这是长按只执行一次标志位 } { } // 短按 { if(rv>200) biao=1; //屏蔽短按 yz+=1;//选位标志位 if(yz==2){h=2;m=1;yy=0;yk=0;yu=0;hh=0;hk=0;hu=0;ba=0;ca=0;ea=0;da=0;za=0;} yz=0; //选位标志重个位开始重新选 m=0;za=0; g=1; //只让输出一次 } } /******************************************************************* ********************************************************************/ { { rv_1=0; //长按延时标志位防止短按到200次后长按启动 g_1=0; //这是长按只执行一次标志位 } { } // 短按 { if(rv_1>200) biao_1=1; //屏蔽短按 yy+=1;//选位标志位 if(yy==2){hh=2;m=1;hk=0;h=0;hu=0;yz=0;yk=0;yu=0;ba=0;ca=0;ea=0;da=0;aa=0;} yy=0; //选位标志重个位开始重新选 m=0;aa=0; g_1=1; //只让输出一次 } } * C选位按键 void key_3() if(trg_2 & 0x01) //短按 biao_2=0; //这是长按屏蔽短按标志位 kt_2=1; //这是短按标志位,kt=1说明短按了 if((aj3!=0)&&(kt_2==1)&&(biao_2==0))//判断 D1=~D1;kt_2=0; if((cont_2 & 0x01)&&(g_2==0))//长按 rv_2++; //长按延时 { hm_2=1; if(yk==1){hk=1;ca=1;ff=0;hm_2=0;} if(yk==3){ hk=0; } rv_2=0; //延时时间归零 }//长按 * D选位按键 void key_4() if(trg_3 & 0x01) //短按 biao_3=0; //这是长按屏蔽短按标志位 kt_3=1; //这是短按标志位,kt=1说明短按了 if((aj4!=0)&&(kt_3==1)&&(biao_3==0))//判断 D0=~D0;kt_3=0; if((cont_3 & 0x01)&&(g_3==0))//长按 rv_3++; //长按延时 { hm_3=1; if(yu==1){hu=1;ea=1;hv=0;hm_3=0;} if(yu==3){ hu=0; } rv_3=0; //延时时间归零 }//长按 /******************************************************************* ********************************************************************/ TMOD=0x01;//将定时器0,1都设置为模式1 TL0=0X66; ET0=1;//开定时器0的中断 } * t0定时器 void timer0() interrupt 1 TH0=0XFC;//1ms sk++; { if(dq==1000) if(ra==1){deng1=0;} if(rc==1){deng3=0;} } { if(rb==1){deng2=1;t2=0;rb=0;} if(rd==1){deng4=1;t4=0;rd=0;} } if((t1==2)||(t2==2)||(t3==2)||(t4==2)) //闪烁两下 dt++; { if(rb==1){deng2=0;} if(rd==1){deng4=0;} if(dt==2500) if(ra==1){deng1=1;} if(rc==1){deng3=1;} } { if(rb==1){deng2=0;} if(rd==1){deng4=0;} if(dt==5500) if(ra==1){deng1=1;t1=0;ra=0;} if(rc==1){deng3=1;t3=0;rc=0;} } if((t1==3)||(t2==3)||(t3==3)||(t4==3)) //闪烁三下 dr++; { if(rb==1){deng2=0;} if(rd==1){deng4=0;} if(dr==2500) if(ra==1){deng1=1;} if(rc==1){deng3=1;} } { if(rb==1){deng2=0;} if(rd==1){deng4=0;} if(dr==5500) if(ra==1){deng1=1;} if(rc==1){deng3=1;} } { if(rb==1){deng2=0;} if(rd==1){deng4=0;} if(dr==8500) if(ra==1){deng1=1;t1=0;ra=0;} if(rc==1){deng3=1;t3=0;rc=0;} dr=0; } { P0=0xfe; P3=0xff; } void main() system_start(); //上电初始化 deng1=1; deng3=1; while(1) KeyRead(); //按键读取函数 key_2(); key_4(); set_scan(); //学习按键 if((hh==1)&&(sn==2)){D2=1;}//B按键点动,hh为k2按键按下后hh=1,sn为接收指示灯熄灭后sn=2;控制对应输出断开,形成点动 if((hu==1)&&(so==2)){D0=1;} //D按键点动,hu为k4按键按下后hu=1,so为接收指示灯熄灭后so=2;控制对应输出断开,形成点动 if((yz==1)&&(za==0)){t1=2;za=1;ra=1;} //ra为对应灯输出标志位,ra=1则输出,ra=0则停止 if((yy==0)&&(aa==0)&&(hm_1==1)){t2=1;aa=1;rb=1;}//B按键:主要控制对应灯闪烁,aa为只执行一次闪烁标志位,t2为闪烁标志位t2=1,闪一下,t2=2闪两下,t2=3闪三下 if((yy==2)&&(aa==0)){t2=3;aa=1;rb=1;} if((yk==1)&&(ff==0)){t3=2;ff=1;rc=1;} //rc为对应灯输出标志位,rc=1则输出,rc=0则停止 if((yu==0)&&(hv==0)&&(hm_3==1)){t4=1;hv=1;rd=1;}//D按键:主要控制对应灯闪烁,hv为只执行一次闪烁标志位,t4为闪烁标志位t4=1,闪一下,t4=2闪两下,t4=3闪三下 if((yu==2)&&(hv==0)){t4=3;hv=1;rd=1;} 问题1527不能解码 手上只有STC11F16XE IC |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
820 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第十一章 KEY实验
388 浏览 0 评论
783 浏览 0 评论
801 浏览 2 评论
飞凌嵌入式-ELFBOARD-ELF 2硬件知识分享-最小系统原理
466 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11929 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-12 09:36 , Processed in 0.699673 second(s), Total 67, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号