⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir_decoder.c

📁 特殊的IR解码源程序
💻 C
字号:
#include <absacc.h>
#include <stdio.h>
#include <reg51.h>

#define LIESHU 8  //列参数
#define HANGSHU 13  //行参数

#define uchar unsigned char

uchar xdata *addr=0x0;  //存储起始地址
uchar code duanma[27]=
{0x77,0x41,0x3b,0x6b,0x4d,0x6e,0x7e,0x43,0x7f,0x6f,0x0,0x7c,0x36,0x79,0x3e,0x3d,
                 0x40,0x0d6,0x0a0,0x82,0x16,0x0a,0x08,0x0d2,0x0,0x02,0x0fe};

uchar code ykbiao[64]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
                     0x08,0x09,0x0A,0x7F,0x8A,0x7F,0x8C,0x84,
                     0x85,0x86,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
                     0x7F,0x7F,0x7F,0x7F,0x89,0x7F,0x0B,0x7F,
                     0x88,0x82,0x7F,0x7F,0x7F,0x7F,0x86,0x7F,
                     0x7F,0x7F,0x7F,0x81,0x87,0x7F,0x7F,0x7F,
                     0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
                     0x83,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x8A};
 
uchar code LIE[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uchar  buf[10]={0,1,2,3,4,5,6,7,8,9};
uchar clkbuf[8]={0x20};
uchar clkscr[14];


char hangno=0;  //扫描行计数
uchar i;     
uchar ykcd;
bdata uchar ykbit;
bdata uchar ykcode;
bdata uchar clkbit;

sbit ykbit0=ykbit^0;  //接收到1状态
sbit ykbit1=ykbit^1;   //送表状态 
sbit ykbit2=ykbit^2;  //闪烁状态 
sbit ykbit6=ykbit^6;  //读时间标志
sbit ykbit5=ykbit^5; //遥控数据菪效标志
sbit ykbit4=ykbit^4; //校时标志
sbit ykbit7=ykbit^7;

sbit ykcode0=ykcode^0;
sbit clkbit0=clkbit^0;

sbit REST=P1^4;
sbit IO=P1^3;
sbit SCLK=P1^2;
sbit P17=P1^7;
uchar ykbnum; //
uchar ykbtc;
uchar ykdelay;
unsigned int tt=0;
void st1302(void);
void w1302(void);
void r1302(void);
void rtime(void);
void wtime(void);
void ykfs(void);
main()
{uchar qqq;
 TMOD=0x11;
 SCON=0x00;
 TH0=0x0fa;
 TL0=0x50;
 TH1=0;
 TL1=0;
 PCON=0X80;  //MOV     87H,#80H               ;加倍 --- 2400B
 IE=0X83;    //SETB    EX0 0x1  外部中断 0 允许
          //SETB    ET0 0x2  定时器 0 中断允许
              //SETB    EA  0x80 开中断
 TCON=0x51;  //SETB    TR0 0x10
          //SETB    TR1 0x40
          //SETB    IT0 0x1  外中断 0 下跳沿激活
 IP=0x01;   //SETB       INT0中断优先

ykbit=0;
ykbit6=1;
i=0;
ykbnum=0;
ykcode=0;
ykdelay=0;

REST=0;
SCLK=0;
st1302();
rtime();

for(;1;)
   {if(ykbit6&&(ykbit4==0)){rtime();ykbit6=0;
               for(qqq=0;qqq<8;qqq++)
                  {clkscr[qqq*2]=clkbuf[qqq]/0x10;
                   clkscr[qqq*2+1]=clkbuf[qqq]%0x10;
                   } 
               }
     if(ykbit5){ykfs();ykbit5=0;}
    }
}

void int1() interrupt 0 using 2
{ykbtc=TH1;TH1=0;TL1=0;TR1=1;ET1=1;
 switch(ykbnum)
   {case(0):ykbnum=1;
            break;
    case(1):if(ykbtc==6)ykbnum=2;
            else ykbnum=0;
            break;
    case(2):if(ykbtc==6||ykbtc==9)ykbnum=3;
            else ykbnum=0; 
            break;
    case(3):if(ykbtc==9||ykbtc==6){ykbnum=4;}
            else ykbnum=0;
            break;
    default:if(ykbnum<7)if(ykbtc==6)ykbnum++;
                        else ykbnum=0;

            else {if(ykbtc==6){if(ykcode0)ykcode=ykcode*2+1;
                               else ykcode=ykcode*2;
                               ykbnum++;
                              }
                  else if(ykbtc==9){if(ykcode0){ykbnum++;ykcode=ykcode*2;}  
                                    else 
{ykbnum+=2;ykcode=ykcode*2;ykcode=ykcode*2+1;}
                            
       }
                  else if(ykbtc>11&&ykbtc<15)
{ykbnum+=2;ykcode=ykcode*2;ykcode=ykcode*2+1;}
                  else if(ykbtc>30){EX0=1;}
                  else ykbnum=0;        
    
                 }
   }
  
}  

void int2() interrupt 3 using 3
{if(ykdelay){ykdelay--;EX0=0;}
 else{if(ykbnum==13){ykcd=ykbiao[ykcode*=2];ykdelay=3;EX0=0;buf[0]
=/*ykcd*/ykcode/0x10;buf[1]=/*ykcd*/ykcode%0x10;ykbit5=1;}
      else if(ykbnum==14){ykcd=ykbiao[ykcode];ykdelay=3;EX0=0;buf[0]
=/*ykcd*/ykcode/0x10;buf[1]=/*ykcd*/ykcode%0x10;ykbit5=1;}
      else EX0=1;
      ykbnum=0;
      ykcode=0;
     }
}  


void ykfs(void)
{switch(ykcd)
   {/*case(1):if(ykbit1!=1)ykbit0=1;  //送表号 1,2...
            else {w2864(j);
                  if(lie1==0){lie1=LIESHU-1;hang1++;}
                  else lie1--; 
                  shanshuo();  //闪烁标志
                 }
             
        break;*/
    /*case(0x85):if(ykbit0){ykbit1=1;hang1=0;lie1=LIESHU-1;ykbit2=1;shanshuo();}
        break;*/
    case(0x84):ykbit4=1;wtime();ykbit4=0;
        break;
    /*case(0x86):ykbit0=0;ykbit1=0;ykbit2=0;
               *(addr+lie1+hang1*0x40)=shuzc;  //确定
        break;
    case(0x88):if(hang1){*(addr+lie1+hang1*0x40)=shuzc; //原数据恢复
                         hang1--;
                          shanshuo
();}  //shang
              
        break;
    case(0x82):if(hang1<HANGSHU-1){*(addr+lie1+hang1*0x40)
=shuzc;hang1++;shanshuo();} //xia
               
        break;
    case(0x87):if(lie1<LIESHU-1){*(addr+lie1+hang1*0x40)
=shuzc;lie1++;}     //zuo
               else if(hang1){*(addr+lie1+hang1*0x40)=shuzc;lie1=0;hang1--;} 
               shanshuo();
        break;
    case(0x81):if(lie1){*(addr+lie1+hang1*0x40)=shuzc;lie1--;shanshuo
();}  //you
               else if(hang1<HANGSHU-1){*(addr+lie1+hang1*0x40)
=shuzc;lie1=LIESHU-1;hang1++;shanshuo();}
               
        break;
    case(0x0b):if(lie1<LIESHU-1)*(addr+lie1+hang1*0x40+1)=(*
(addr+lie1+hang1*0x40+1)|0x10);
*/    default:/*if(j<=10&&j>=0&&ykbit4==1)
                 {w2864(j);
                  if(lie1==0){lie1=LIESHU-1;hang1++;}
                  else lie1--;
                  shanshuo();
                 }*/
             
    break;
   }
}

/*void shanshuo(void)
{shuzc=*(addr+lie1+hang1*0x40);
 *(addr+lie1+hang1*0x40)=10;
 ykbit2=1;tt=400;
}

*/
void int0() interrupt 1 using 1
  { TH0=0x0fa;
    TL0=0x50;
    tt++;
    if(tt==600){tt=0;ykbit6=1;
                 if(P17)P17=0;
                 else P17=1;}
    P0=0xff;
    if(i==LIESHU)i=0;
    SBUF=duanma[buf[i]];
    for(;TI==0;)TI=0;
    SBUF=duanma[clkscr[i]];
    for(;TI==0;)TI=0;
    SBUF=duanma[clkscr[i+8]];
    for(;TI==0;)TI=0;
    P0=LIE[i];
    i++;
}  

void st1302(void)
{uchar qqq;
 qqq++;
 qqq++;
 qqq++;
 REST=1;
 clkbit=0x8e;
 w1302();
 clkbit=0x0;
 w1302();
 REST=0;
 qqq++;
qqq++;
qqq++;
 REST=1;
 clkbit=0x90;
 w1302();
 clkbit=0xa7;
 w1302();
 REST=0;
}

void w1302(void)
{uchar qqq;
for(B=8;B;B--)
  {if(clkbit0)IO=1;
   else IO=0;
   clkbit/=2;
   SCLK=1;
   qqq++;
   SCLK=0;
} }

void wtime(void)
{uchar qqqq;
 REST=1;
 clkbit=0x8c;  //年
 w1302();
 clkbit=0;
 w1302();
 REST=0;
  REST=1;
 clkbit=0x88; //月
 w1302();
 clkbit=1;
 w1302();
 REST=0;
  REST=1;
 clkbit=0x86;  //日
 w1302();
 clkbit=2;
 w1302();
 REST=0;
  REST=1;
 clkbit=0x84; //小时
 w1302();
 clkbit=3;
 w1302();
 REST=0;
  REST=1;
 clkbit=0x82;  //分
 w1302();
 clkbit=4;
 w1302();
 REST=0;
  REST=1;
 clkbit=0x80;  //秒
 w1302();
 clkbit=5;
 w1302();
 REST=0;
  REST=1;
 clkbit=0x8a;  //星期
 w1302();
 clkbit=6;
 w1302();
 REST=0;
 
 }
void rtime(void)
{REST=1;
 clkbit=0xbf;
 w1302();
 r1302();
 clkbuf[6]=clkbit; //SEC
 r1302();
 clkbuf[5]=clkbit; //MIN
 r1302();
 clkbuf[4]=clkbit; //HOUR
 r1302();
 clkbuf[3]=clkbit;  //DAY
 r1302();
 clkbuf[2]=clkbit;  //MON
 r1302();
 clkbuf[7]=clkbit;  //WEEK
 r1302();
 clkbuf[1]=clkbit;   //YEAR
 REST=0;
}

void r1302(void)
{
 char qqq;
 SCLK=0;
 for(B=8;B;B--)
   {if(IO){clkbit/=2;clkbit=clkbit|0X80;}
    else clkbit/=2;
    SCLK=1;
    qqq++;
    SCLK=0;
}  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -