📄 ir_decoder.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 + -