本程序可讀出大部分遙控器的鍵值全碼
#include <reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit p22=P2^2;
sbit p23=P2^3;
sbit p24=P2^4;
sbit beep= P1^5;
sbit indate=P3^4;
sbit oe =P3^5;
sbit clk =P3^6;
uchar ritime;
uchar startflag;
uchar ridate[33];
uchar bitnum;
uchar rireceok;
uchar ricode[4];
uchar riprosok;
uchar dis[8];
uchar key;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void riwork(void);
void ripros(void);
void keyscan(void);
void display(void);
void delay(uint z);
void wr_date(uchar a);
void bep(void)
{
beep=0;delay(10);beep=1;
}
void delay(uint z)
{
uint x,y;
for(x=20;x>0;x--)
for(y=z;y>0;y--);
}
void display(void)
{
P0=table[dis[0]];
p22=0;p23=0;p24=0;
delay(10) ;
P0=table[dis[1]];
p22=1;p23=0;p24=0;
delay(10) ;
P0=table[dis[2]];
p22=0;p23=1;p24=0;
delay(10) ;
P0=table[dis[3]];
p22=1;p23=1;p24=0;
delay(10) ;
P0=table[dis[4]];
p22=0;p23=0;p24=1;
delay(10) ;
P0=table[dis[5]];
p22=1;p23=0;p24=1;
delay(10);
P0=table[dis[6]];
p22=0;p23=1;p24=1;
delay(10) ;
P0=table[dis[7]];
p22=1;p23=1;p24=1;
delay(10);
}
void timer0init(void) //開定時器2
{
TMOD=0X02;
TH0=0X00;
TL0=0X00;
ET0=1;
EA=1;
TR0=1;
}
void init0init(void) //外部中斷
{
IT0=1;
EX0=1;
EA=1;
}
void riwork(void)
{
dis[0]=ricode[0]/16;
dis[1]=ricode[0]%16;
dis[2]=ricode[1]/16;
dis[3]=ricode[1]%16;
dis[4]=ricode[2]/16;
dis[5]=ricode[2]%16;
dis[6]=ricode[3]/16;
dis[7]=ricode[3]%16;
}
void ripros(void)
{ uchar j,k,i,value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1;
if(ridate[k]>10)
{
value=value|0x80;
}
k++;
}
ricode[j]=value;
}
riprosok=1;
}
void main()
{ wr_date(0x00);///595第一次寫不進 全 1
wr_date(0xff);
timer0init();
init0init();
while(1)
{
if(rireceok==1)
{bep();
ripros();
rireceok=0;
}
if(riprosok==1)
{
riwork();
riprosok=0;
}
display();
keyscan();
if(key==1)wr_date(0xfe);
if(key==2)wr_date(0xfd);
if(key==3)wr_date(0xfc);
if(key==4)wr_date(0x55);
if(key==5)wr_date(0xaa);
if(key==6)wr_date(0xf9);
if(key==7)wr_date(0xf8);
if(key==8)wr_date(0x00);
if(key==9)wr_date(0xff);
}
}
void timer0 () interrupt 1
{
ritime++;
}
void int0() interrupt 0
{
if(startflag==1)
{
if(ritime>32)//檢測引導碼
{
bitnum=0;
}
ridate[bitnum]=ritime;
ritime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
rireceok=1;
}
}
else
{
startflag=1;
ritime=0;
}
}
void keyscan(void)
{
if(ricode[1]==0xff) //驗證用戶碼
{ key=0;
switch(ricode[2])
{case 0x16:key=21;break;
case 0x0c:key=1;break;
case 0x18:key=2;break;
case 0x5e:key=3;break;
case 0x08:key=4;break;
case 0x1c:key=5;break;
case 0x5a:key=6;break;
case 0x42:key=7;break;
case 0x52:key=8;break;
case 0x4a:key=9;break;
case 0x19:key=10;break;
case 0x0d:key=11;break;
case 0x45:key=12;break;
case 0x46:key=13;break;
case 0x47:key=14;break;
case 0x44:key=15;break;
case 0x40:key=16;break;
case 0x43:key=17;break;
case 0x07:key=18;break;
case 0x15:key=19;break;
case 0x09:key=20;break;
}
}
}
void wr_date(uchar a) ///595
{ uchar i;
oe=0; //使能置0
for(i=0;i<8;i++)
{ clk=0;//時鐘給脈沖
a=a<<1;
indate=CY; //加數據
clk=1;
/*clk=0;
indate=a&0x01;
a=a>>1;
clk=1;*/
}
oe=1; //使能置1
}
|