📄 remote.c.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 + -