📄 ir.c
字号:
*----------------------------------------------------------------------*/
void IR_IRQ(void)
{
volatile unsigned int intstatus;
unsigned int dwtemp;
#undef PRINTF
//PRINTF("IR_IRQ\n");
#define PRINTF(...)
interruptcount++;
Getirscancode();
}
void putdata(Uint data)
{
unsigned char data1;
int i;
for(i = 0; i < 4; i++)
{
data1 = data >> (i*8);
if(!((data1==0x80)||(data1==0)))
rlc_buffer[bufferin++] = data1;
if (bufferin >= DATABUFSIZE)
bufferin = 0;
}
}
unsigned char getdata(void)
{
unsigned char temp;
temp = rlc_buffer[bufferout++];
if(bufferout >= DATABUFSIZE)
bufferout = 0;
return temp;
}
int getcount(void)
{
int temp;
temp = bufferin - bufferout;
if(temp < 0)
temp += DATABUFSIZE;
return temp;
}
/* Get Irc count code from Irc register */
BOOL Getirscancode(void)
{
Uint temp, flag;
unsigned char point,num,loop;
int countbuf;
flag = *((volatile Uint *) IRCR);
num=((flag>>16)&0x0F)/4;
for(point=0;point<num;point++)
{
temp=inw(IRDR);
if(!((temp==0x80000000)||(temp==0)))
putdata(temp);
}
return 1;
}
BOOL Transirscancode(void)
{
HeadType=FindHead();
if(HeadType==1)
{
gHead=1;
gCount=0;
bRepeatCount=0;
InitKeyCode();
if(GetKeyCode()==1)
GetChar();
}
else if(HeadType==2)
{
gHead=1;
FindLow();
if(LAST_IR_CODE == C_KEY_STEP)
{
if (bRepeatCount <= 20) /* wait about 1 second */
bRepeatCount++; /* 1(sec)/0.108(ms) = 9 */
else
{
GET_IR_CODE = LAST_IR_CODE;
bRepeatCount=0;
}
}
}
return 1;
}
BOOL FindHead(void)
{
if(FindLow()==1)
{ //gLCoordinateF is falling edge,
low=1; //gLCoordinateB is before rising edge.
if(JudgeLow(HEAD_LOW)==1)
{
if(FindHigh()==1)
{ //gHCoordinateF is risign edge,
if(JudgeHigh(HEAD_HIGH)==1)
{ //gHCoordinateB is before risign edge.
findh = 1;
low=0;
bufferout=gHCoordinateB;
return 1;
}
else if(JudgeHigh(HEAD_REPEAT_HIGH)==1)
{
findh = 1;
low=0;
bufferout=gHCoordinateB;
return 2;
}
else
{
findh = 1;
low=2;
bufferout=gHCoordinateB;
return 0;
}
}
else
return 0;
}
else
{
low=0;
bufferout=gLCoordinateB;
return 0;
}
}
else
return 0;
}
BOOL FindLow(void)
{
unsigned char xdata,ydata;
int size,loop,flow;
size = getcount()-1;
if(stateL==0)
{
for(loop=0;loop<size;loop++)
{
xdata=getdata();
ydata=getdata();
if((xdata>=0x80)&&(ydata<0x80) )
{ //find falling edge
flow=bufferout-1;
if(flow<0)
flow+=DATABUFSIZE; //get the bufferout which is
gLCoordinateF=flow; //falling edge
stateL=1;
break;
}
else
bufferout--; //getdata will increase bufferout
//so, we have to reduce it now.
}
}
if(stateL==1)
{
bufferout = gLCoordinateF;
size = getcount()-1;
for(loop=0;loop<size;loop++)
{
xdata=getdata();
ydata=getdata();
if((xdata<0x80)&&(ydata>=0x80))
{ //find rising edge
flow=bufferout-2;
if(flow<0)
flow+=DATABUFSIZE;
gLCoordinateB=flow;
stateL=0;
return 1;
}
else
bufferout--;
}
return 0;
}
return 0;
}
BOOL JudgeLow(unsigned short a)
{
unsigned short addResult=0;
unsigned short addata;
int distance,distance1,distance2,loop;
bufferout = gLCoordinateF;
distance1 = gLCoordinateF;
distance2 = (gLCoordinateB+1);
distance = (distance2-distance1);
if(distance<0)
distance+=DATABUFSIZE;
for(loop=0;loop<distance;loop++)
{
addata=(unsigned short)getdata();
addResult+=addata;
}
if((((a>>2)*2)<addResult)&&(addResult<((a>>2)*6)))
return 1;
else
return 0;
}
BOOL FindHigh(void)
{
unsigned char xdata,ydata;
int size,loop;
int fhigh;
bufferout = gLCoordinateB;
size = getcount() - 1;
if(stateH==0)
{
for(loop=0;loop<size;loop++)
{
xdata=getdata();
ydata=getdata();
if((xdata<0x80)&&(ydata>=0x80))
{
fhigh=bufferout-1;
if(fhigh<0)
fhigh+=DATABUFSIZE;
gHCoordinateF=fhigh;
stateH=1;
break;
}
else
bufferout--;
}
}
if(stateH==1)
{
bufferout = gHCoordinateF;
size = getcount()-1;
for(loop=0;loop<size;loop++)
{
xdata=getdata();
ydata=getdata();
if((xdata>=0x80)&&(ydata<0x80))
{
fhigh=bufferout-2;
if(fhigh<0)
fhigh+=DATABUFSIZE;
gHCoordinateB=fhigh;
stateH=0;
return 1;
}
else
bufferout--;
}
return 0;
}
return 0;
}
BOOL JudgeHigh(unsigned short a)
{
unsigned short addResult=0;
unsigned short addata;
int distance,distance1,distance2,loop;
bufferout = gHCoordinateF;
distance1 = gHCoordinateF;
distance2 = (gHCoordinateB+1);
distance = (distance2-distance1);
if(distance<0)
distance+=DATABUFSIZE;
for(loop=0;loop<distance;loop++)
{
addata=(unsigned short)getdata();
addResult+=(addata-0x80);
}
if((((a>>2)*2)<addResult)&&(addResult<((a>>2)*6)))
return 1;
else
return 0;
}
void timeout(void)
{
int i,j=0,k=0;
PRINTF("It is timeout now!!\n");
k=bufferin - bufferout;
if (k<0)
k+=DATABUFSIZE;
for(i=0; i<k; i++)
{
PRINTF("%x",rlc_buffer[bufferout++]);
if(bufferout>=DATABUFSIZE)
{
bufferout=0;
}
j++;
if(j==4)
{
j=0;
PRINTF("\n");
}
}
}
void InitKeyCode(void)
{
unsigned char unit;
for(unit=0;unit<32;unit++)
{
gKeyCode[unit]=0;
}
}
BOOL GetKeyCode(void)
{
#undef PRINTF
PRINTF("GETKEYCODE\n");
#define PRINTF(...)
do
{
if(low==0)
{
if(FindLow()==1)
{
low=1;
if(JudgeLow(BIT_LOW)==1)
{
if((FindHigh()==1))
{
if(JudgeHigh(BIT0_HIGH)==1)
{
low=0;
bufferout=gHCoordinateB;
gKeyCode[gCount]=0;
count1++;
gCount++;
}
else
{
if(JudgeHigh(BIT1_HIGH)==1)
{
low=0;
bufferout=gHCoordinateB;
gKeyCode[gCount]=1;
gCount++;
count1++;
}
else
{
low=0;
gHead=0;
bufferout=gHCoordinateB;
return 0;
}
}
}
else
return 0;
}
else
{
gHead=0;
low=0;
bufferout=gLCoordinateB;
return 0;
}
}
else
return 0;
}
else
{
if((FindHigh()==1))
{
if(JudgeHigh(BIT0_HIGH)==1)
{
low=0;
bufferout=gHCoordinateB;
gKeyCode[gCount]=0;
gCount++;
count1++;
}
else
{
if(JudgeHigh(BIT1_HIGH)==1)
{
low=0;
bufferout=gHCoordinateB;
gKeyCode[gCount]=1;
gCount++;
count1++;
}
else
{
low=0;
gHead=0;
bufferout=gHCoordinateB;
return 0;
}
}
}
else
return 0;
}
}
while(gCount<32);
bufferin = 1;
bufferout = 0;
infra_buffer[0] = 0xff;
low=0;
gHead=0;
return 1;
}
void GetChar(void)
{
int i,j;
if(Get_Repeat_Code==0)
cuscode1 = cuscode2 = datacode1 = datacode2 = 0;
for(i=0; i<32; i++)
{
j=i%8;
if(i<=7 && i>=0)
cuscode1 |= gKeyCode[i]<<j;
if(i<=15 && i>=8)
cuscode2 |= gKeyCode[i]<<j;
if(i<=23 && i>=16)
datacode1 |= gKeyCode[i]<<j;
if(i<=31 && i>=24)
datacode2 |= gKeyCode[i]<<j;
}
GETIRCODE = 1;
matchirkeycode();
}
unsigned char matchirkeycode(void)
{
//unsigned int dWtemp;
if(GETIRCODE == 1)
{
//dWtemp = (gKeyChar & 0x00ff0000) >> 16;
//GET_IR_CODE = KeyTable[dWtemp];
GET_IR_CODE = KeyTable[datacode2];
#undef PRINTF
PRINTF("GET_IR_CODE = %d \n",GET_IR_CODE);
#define PRINTF(...)
LAST_IR_CODE = GET_IR_CODE;
GETIRCODE = 0;
// PRINTF("GET_IR_CODE is %d \n ",GET_IR_CODE);
//FpReceiveIR();
}
return 1;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -