📄 ir.c
字号:
/*******************************************************************************/
#include "config.h"
bit IR_flag0=1;
bit IR_flag1=1;
bit IR_flag2=1;
bit IR_flag3=1;
bit IR_flag4=1;
bit IR_flag5=1;
bit IR_flag6=1;
bit IR_flag7=1;
/************************************************************/
extern uint16 xdata ABA,ABB,ABC,ABD,ABE,ABF;
extern uint8 display[];
/************************************************************/
uint8 xdata dataIR[5];
uint8 xdata IR_IP0[8]; //(0-1:IP) (2-3:设定IP)(4-7:设定计划数量)
bit flag=0;
uint8 CA0=0;
uint8 IR_SET=1; //1:(正常) 2:(设定IP) 3-8:(设定1-6)
uint8 IR_IP; // IP
void IR_TASK(void );
/************************************************************/
//bit ir_flag;
/* */
#define KEY_0 0x10
#define KEY_1 0x30
#define KEY_2 0xB0
#define KEY_3 0x70
#define KEY_4 0x08
#define KEY_5 0x88
#define KEY_6 0x48
#define KEY_7 0x28
#define KEY_8 0xA8
#define KEY_9 0x68
#define KEY_POWER 0x00
#define KEY_CH_DEC 0x80
#define KEY_CH_ADD 0x40
#define KEY_EQ 0x20
#define KEY_VOL_ADD 0xA0
#define KEY_VOL_DEC 0x60
#define KEY_ZUO 0x90
#define KEY_YOU 0x50
#define KEY_EMPTY 0xFF
uchar Key1;
uchar IpDZ=00; //对应遥控器IP地址
/********************************************************************
函 数 名:iR_Receive()
功 能:初始化子程序
说 明:
调 用:
入口参数:
出口参数:
***********************************************************************/
void delay_100us(void)
{
unsigned char i=48;
while(--i);
}
/********************************************************************
函 数 名:iR_Receive()
功 能:初始化子程序
说 明:
调 用:
入口参数:
出口参数:
***********************************************************************/
/******************************************/
/*********************外部中断0服务程序**/
/*****************************************/
static void xint0_isr(void) interrupt IE0_VECTOR
{
unsigned char width;
unsigned char i=0;
width = 0x00;
INT0 = 1;
while(!INT0)
{
delay_100us();
width++;
}
if (width < 65)
{
return;
}
width = 0x00;
while(INT0)
{
delay_100us();
width++;
}
if (width < 30)
{
return;
}
// 至此,引导码已校验,以下接收地址码和数据码,一共32位
for(i=0; i<32; i++)
{
flag = 1;
while(!INT0);
width = 0x00;
while(INT0)
{
delay_100us();
width++;
}
dataIR[i/8] <<= 1;
if (width > 0x08)dataIR[i/8] |= 0x01;
else dataIR[i/8] &= 0XFE;
}
if ((IpDZ == dataIR[0]) && (dataIR[2] == (~dataIR[3])))
{
switch (dataIR[2])
{
case KEY_0 :
case KEY_1 :
case KEY_2 :
case KEY_3 :
case KEY_4 :
case KEY_5 :
case KEY_6 :
case KEY_7 :
case KEY_8 :
case KEY_9 :
// case KEY_POWER :
case KEY_CH_DEC:
case KEY_CH_ADD:
case KEY_EQ :
case KEY_VOL_DEC:
case KEY_VOL_ADD:
case KEY_ZUO :
case KEY_YOU :
Key1 = dataIR[2];
break;
default:
Key1 = KEY_EMPTY;
break;
}
//*******判断运行/设定*****************************************************
if(dataIR[2]==KEY_POWER)
{
IR_flag0=~IR_flag0;
if(IR_flag0==0)
{
CA0=0;
IR_SET=1;
IR_flag1=0;
T10_K=0; // 遥控接受秘码不对6秒后解除
T10K=0;
}
else
{
T10_K=1;
T10K=0; // 遥控接受秘码不对6秒后解除
IR_flag1=1;
IR_flag2=1;
IR_SET=1; //运行
dataIR[0] = 0X00;
dataIR[1] = 0X00;
dataIR[2] = 0X00;
dataIR[3] = 0X00;
dataIR[4] = 0X00;
}
}
//如果设定+没有输入秘密*************************************************
if((IR_flag1==0)&&(IR_flag2==1))
{
if(CA0>=2)CA0=0;
switch (dataIR[2])
{
case KEY_0 :
IR_IP0[CA0]=0;
CA0++;
break;
case KEY_1 :
IR_IP0[CA0]=1;
CA0++;
break;
case KEY_2 :
IR_IP0[CA0]=2;
CA0++;
break;
case KEY_3 :
IR_IP0[CA0]=3;
CA0++;
break;
case KEY_4 :
IR_IP0[CA0]=4;
CA0++;
break;
case KEY_5 :
IR_IP0[CA0]=5;
CA0++;
break;
case KEY_6 :
IR_IP0[CA0]=6;
CA0++;
break;
case KEY_7 :
IR_IP0[CA0]=7;
CA0++;
break;
case KEY_8 :
IR_IP0[CA0]=8;
CA0++;
break;
case KEY_9 :
IR_IP0[CA0]=9;
CA0++;
break;
default:
// Key1 = KEY_EMPTY;
break;
}
//判断密码正确
if((IR_IP0[2]==IR_IP0[0])&&(IR_IP0[3]==IR_IP0[1]))
{
T10_K=1;
T10K=0; // 遥控接受秘码正确解除6秒延时
IR_flag1=1;
IR_flag2=0; //密码OK
CA0=5; //进入设定位
IR_SET=3; //设定IP
IR_IP0[0]=0;
IR_IP0[1]=0; //密码值复位
}
Key1 = KEY_EMPTY;
}
IR_TASK();
}
}
/***********************************************************************/
void IR_TASK(void )
{
if((Key1!=KEY_EMPTY)&&(IR_flag2==0))
{
flag = 0;
if ((IpDZ == dataIR[0]) && (dataIR[2] == (~dataIR[3])))
{
T11_K=1;
T11K=0;
switch (dataIR[2])
{
case KEY_0 :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
IR_IP0[CA0]=0;
IR_flag3=0;
IR_flag4=0;
}
else if(IR_SET==9)Y0=~Y0;
break;
case KEY_1 :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
IR_IP0[CA0]=1;
IR_flag3=0;
IR_flag4=0;
}
else if(IR_SET==9)Y1=~Y1;
break;
case KEY_2 :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
IR_IP0[CA0]=2;
IR_flag3=0;
IR_flag4=0;
}
else if(IR_SET==9)Y2=~Y2;
break;
case KEY_3 :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
IR_IP0[CA0]=3;
IR_flag3=0;
IR_flag4=0;
}
else if(IR_SET==9)Y3=~Y3;
break;
case KEY_4 :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
IR_IP0[CA0]=4;
IR_flag3=0;
IR_flag4=0;
}
else if(IR_SET==9)Y4=~Y4;
break;
case KEY_5 :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
IR_IP0[CA0]=5;
IR_flag3=0;
IR_flag4=0;
}
else if(IR_SET==9)Y5=~Y5;
break;
case KEY_6 :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
IR_IP0[CA0]=6;
IR_flag3=0;
IR_flag4=0;
}
else if(IR_SET==9)Y6=~Y6;
break;
case KEY_7 :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
IR_IP0[CA0]=7;
IR_flag3=0;
IR_flag4=0;
}
else if(IR_SET==9)Y7=~Y7;
break;
case KEY_8 :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
IR_IP0[CA0]=8;
IR_flag3=0;
IR_flag4=0;
}
break;
case KEY_9 :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
IR_IP0[CA0]=9;
IR_flag3=0;
IR_flag4=0;
}
break;
/**********設定1/设定2/运行**************************************/
/* case KEY_POWER :
if(TOP0==2){TOP0=0;TOP1=0;}
else TOP0++;
if(TOP0==1)TOP1=0;
else if(TOP0==2)TOP1=11;
else TOP1=0;
break;
*/
/**********设定计划数量-***************************************/
case KEY_CH_DEC :
if(IR_SET==3)IR_SET=9; //设定计划-
else if(IR_SET<3)IR_SET=3;
else IR_SET--;
CA0=5; //地址
break;
/**********设定计划数量+****************************************/
case KEY_CH_ADD :
if(IR_SET==9)IR_SET=3; //设定计划+
else IR_SET++;
CA0=5; //地址
break;
/***********设定IP**************************************/
case KEY_EQ :
if(IR_SET==2){IR_SET=9;CA0=0;}
else {IR_SET=2; CA0=2;} //IP //地址
break;
/************移位-*************************************/
case KEY_VOL_DEC :
if((IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
if(CA0==8)CA0=5;
else CA0++;
}
if(IR_SET==2)
{
if(CA0==3)CA0=2;
else CA0++;
}
break;
/***********移位+*************************************/
case KEY_VOL_ADD :
if((IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
if(CA0==4)CA0=8;
else CA0--;
}
if(IR_SET==2)
{
if(CA0==2)CA0=3;
else CA0--;
}
break;
/****》***设定位-****************************************/
case KEY_ZUO :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
if(IR_IP0[CA0]==0){IR_IP0[CA0]=9;}
else IR_IP0[CA0]--;
IR_flag3=0;
IR_flag4=0;
}
break;
/***《******设定位+**************************************/
case KEY_YOU :
if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
{
if(IR_IP0[CA0]==9){IR_IP0[CA0]=0;}
else IR_IP0[CA0]++;
IR_flag3=0;
IR_flag4=0;
}
break;
/*************************************************/
break;
default:
Key1 = KEY_EMPTY;
break;
}
Key1 = KEY_EMPTY;
if(IR_flag4==0)
{
IR_flag4 = 1;
switch (IR_SET)
{
case 2 :IR_IP=(IR_IP0[2]*10)+IR_IP0[3];break;
case 3 :ABA=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
case 4 :ABB=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
case 5 :ABC=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
case 6 :ABD=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
case 7 :ABE=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
case 8 :ABF=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
default:break;
}
}
}
dataIR[0] = 0X00;
dataIR[1] = 0X00;
dataIR[2] = 0X00;
dataIR[3] = 0X00;
dataIR[4] = 0X00;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -