发 帖  
原厂入驻New
[问答] 下面这段程序网 上找的原来是写在STC15W408AS现在写STC11F16XE有问题望指点 1527不能解码 2262能解码
199
分享


           




//


#include <stc15W408AS.h>
#define uchar unsigned char
sbit RF         =   P1^1;     //信号输入
sbit set        =   P1^2;     //学习键                           
sbit D1         =   P3^5;     //2号继电器
sbit D3         =   P3^7;     //4号继电
sbit deng2      =   P5^4;     //K2指示灯
sbit deng4      =   P3^2;     //K4指示灯
sbit aj1        =   P1^3;     //K1
sbit 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<<i;}   //计算出2262的按键数据                                 
                          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

0
2019-10-9 21:39:06   评论 淘帖 邀请回答 举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

我要提问
关闭

乐虎国际电玩线路

快速回复 返回顶部 返回列表
久赢国际代理手机app 彩88会员中心直营网 澳门永利娱乐手机app 彩票在线游戏直营网 bbin视讯官方开户手机app
十博开户最高占成 金博士官网导航 王子8大优惠 银河vip娱乐官网最高返水 希尔顿客户端最高占成
bet36娱乐官网 ag娱乐平台手机app 娱乐城天上人间视频 专业手机棋牌游戏 欧洲娱乐游戏网站
奔驰上线娱乐登入 九五至尊老品牌值得信赖手机版下载 太阳城娱乐 一号庄娱乐开户送88元 齐发娱乐ag是什么网站