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

📄 ir.c

📁 M3355的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
 *----------------------------------------------------------------------*/
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 + -