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

📄 remote.c.bak

📁 REMOTE HKHKHK HKJHJGHGFH JKHKJHJHJHG GHGJHGJHGJ
💻 BAK
字号:
=================================================================
=================================================================
//remote.c
//********************************************
//遥控器解码(NEC码)
//解码成功则返回Flag_Remote = 1
//数据存放在Value
//连续操作次数存放到Repeat

//P1口作按键扫描 
//检测到按键则返回Flag_Key = 1
//键值存放到Value
//连续操作次数存放到Repeat

//使用资源:P1口、定时器Timer0、 外部中断INIT0、定时器Timer0中断ET0
//晶振频率:12.0000MHz

//********************************************
#include <REG51.H>
//********************************************

#define CUSTOM_CODE 0xFF    // Remote Custom Code   8bit
#define COUNT_RESET 0xFF    // When No Remote or Key Pushed, Count Reset
#define COUNT_DONE  0x40    //
#define KEY_PORT    P1      // Key Scan Port (4*4) 16 Buttons

bit Flag_Menu;
bit Flag_Key;               // When Some Key Pushed, Flag_Key = 1
bit Flag_Remote;            // When Remoted, Flag_Remote = 1
unsigned char Value;        // Value of Remote or Key
unsigned char Repeat;       // 

unsigned char Count;
unsigned char Count_Timer0; // Timer0 Interrupt Counters

//********************************************
void Init_Key_Remote();
void Timer0();
void EXINT0();
//********************************************

void Init_Key_Remote()
{
    ET0 = 1;          // 开启定时器Timer0中断ET0
    TR0 = 1;         // 定时器Timer0开始计数
    EX0 = 1;        // 开启外部中断INT0
    IT0 = 1;          // 下跳沿触发外部中断INT0
    EA  = 1;           // 开启总中断
    Flag_Key = 0;
    Flag_Remote = 0;
}

void EXINT0() interrupt 0 //using 1
{//INT0中断,遥控器解码(12M)
    static unsigned char Buffer[4];    // Buffer of Remote
    static bit Flag_Repeat=0;
    unsigned int t;    

    TR0 = 0;
    t = (TH0 << 8) + TL0;
    TMOD = TMOD & 0xF0;
    TMOD = TMOD | 0x01;
    TH0 = TL0 = TF0 = 0; 
    TR0 = 1;
    if (Count_Timer0 >= 2)
    {
        t = 0;  //第一次遥控脉冲
        Count = COUNT_RESET;
        Flag_Remote = 0;
        Repeat = 0;
    }
    Count_Timer0 = 0;
    Flag_Remote = 0;

    if(t > 13000 && t < 14000)
        Count=0;//leader code 13.5ms
    else if(t > 40000 && t < 41000)
        Flag_Repeat=1;//40.5ms
    else if(t > 30500 && t < 32500)
        Flag_Repeat=1;// 108ms-11.25ms-65536us
    else if(t > 11000 && t< 11500 && Count == COUNT_DONE && Flag_Repeat == 1)
    {//11.25ms
        Flag_Remote = 1;
        if(Repeat < 20)
            Repeat++;
    }
    else if((t > 1000 && t < 1250) || (t > 2000 && t < 2500) && Count < 32)//4,8
    {//       bit_0=1.125ms         bit_1=2.25ms 
        Buffer[Count/8] >>= 1;
        if(t > 1000 && t < 1250)
            Buffer[Count/8] |= 0x00;
        if(t > 2000 && t < 2500)
            Buffer[Count/8] |= 0x80;
        Count++;
        if(Count == 32)
        if(Buffer[0] == ~Buffer[1] && Buffer[2] == ~Buffer[3] && Buffer[0] == CUSTOM_CODE)
        {
            Flag_Remote = 1;
            Repeat = 1;
            Count = COUNT_DONE;
        }
    }
    else
    {//为干扰信号,将相应状态复位
        Count = COUNT_RESET;
        Flag_Remote = 0;
        Flag_Repeat = 0;
        Repeat = 0;
    }
}

void Timer0() interrupt 1 //using 1
{ 
    static unsigned char Buffer;        // Buffer of Key 上一次键盘扫描结果
    unsigned char Temp;                 // 本次键盘扫描结果;          

    if (Count_Timer0 > 250)
    {
        Count_Timer0 = 2;
        Flag_Menu = 1;                  // 5s 内没操作则清除屏幕菜单
    }
    else                                
        Count_Timer0++;
    if(Count_Timer0 < 2) 
        return;
    // 发生两次TIMEO计数溢出,超过遥控发射码的周期108MS,改变TIMER0工作方式,进行键盘扫描。
    // 每21.6MS扫描一次,若两次值不同,则认为是第一次按键,两次值相同,则按键有效。
    // 键盘扫描采用反转法读取键值,则可很方便地判断出多个键同时按下(即组合键)的情况
    TR0 = 0;
    EA = 1; ET1 = 1; IT1 = 1;
    TMOD = TMOD & 0xF0;
    TMOD = TMOD | 0x02;
    TH0 = 0xAB;//21.6ms
    TL0 = 0xA0;
    TR0 = 1;
    Flag_Remote = 0;
    Repeat = 0;

    KEY_PORT = 0x0F; Temp  = KEY_PORT;
    KEY_PORT = 0xF0; Temp |= KEY_PORT;

    if (Temp != Buffer)// && Temp == 0xFF)
    {
        Count = COUNT_RESET;
        Flag_Key = 0;
        Repeat = 0;
    }
    else if (Count == COUNT_RESET)
    {
        Count = 0;
        Flag_Key = 1;
        Value = Temp;
        Repeat = 1;
    }
    else if (Count == 5)
    {
        Count = 0;
        Flag_Key = 1;      
        if (Repeat < 20)
            Repeat++;
    }
    else if (Count < 5)
        Count++;

    Buffer = Temp;
}

=================================================================
=================================================================

//remote.h

#ifndef __REMOTE_H__
#define __REMOTE_H__

    extern bit Flag_Menu;
    extern bit Flag_Key;
    extern bit Flag_Remote;
    extern unsigned char Value;
    extern unsigned char Repeat;
    
    extern void Init_Key_Remote();

#endif

=================================================================
=================================================================

//main.c

#include <REG51.H>
#include <REMOTE.H>

main()
{
    Init_Key_Remote();
    while(1)
    {
        if (Flag_Menu)
        {
            Flag_Menu = 0;
        }
        if(Flag_Remote)
        {
            Flag_Remote = 0;
            Process_Remote(value,repeat);
        }
        if(Flag_Key)
        {
            Flag_Key = 0;
            Process_Remote(value,repeat);
        }
    }
}

=================================================================
=================================================================

void Process_Remote(unsigned char value, unsigned char repeat)
{
    if (repeat == 1)
    {//响应一次
        switch (value)
        {
            case _REMOTE_RESET:         Key_Reset(); break;
            case _REMOTE_MUTE:          Key_Mute(); break;
            case _REMOTE_INPUTSELECT:   Key_InputSelect(); break;
            case _REMOTE_MENU:          Key_3D_Enable(); break;
            case _REMOTE_SRS3D:         Key_EQ(); break;
            case _REMOTE_VOLUMEPLUS:    Key_Volume('+'); break;
            case _REMOTE_VOLUMEMINUS:   Key_Volume('-'); break;
        }
    }
    else if (repeat > 5)
    {//连续响应
        switch (value)
        {
            case _REMOTE_VOLUMEPLUS:    Key_Volume('+'); break;
            case _REMOTE_VOLUMEMINUS:   Key_Volume('-'); break;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -