标题:
单片机红外解码并更新遥控码至stc单片机的EPROM
[打印本页]
作者:
51黑z
时间:
2016-9-11 22:16
标题:
单片机红外解码并更新遥控码至stc单片机的EPROM
本例程的完整keil工程文件下载:
http://www.51hei.com/bbs/dpj-55490-1.html
下面是部分程序代码的预览:
#include "EEPROM.h"
#include "ChannelShortcutDef.h"
/*******************************************************
函数:void EEPROM_Write(uint16_t Addr,uint8_t Data);
功能:向EEPROM对应地址写数据,
写数据前要先擦除所写地址中的数据;
*******************************************************/
void EEPROM_Write(uint16_t Addr,uint8_t Data)
{
ISP_CONTR = 0x82; //允许ISP,设置等待时间
ISP_CMD = 0x02; //字节编程命令
ISP_ADDRH = Addr>>8;
ISP_ADDRL = Addr; //送地址
ISP_DATA = Data; //送数据
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9; //触发命令
}
/*******************************************************
函数:uint8_t EEPROM_Read(uint16_t Addr);
功能:读EEPROM对应地址中的数据;
*******************************************************/
uint8_t EEPROM_Read(uint16_t Addr)
{
ISP_CONTR = 0x82; //允许ISP,设置等待时间
ISP_CMD = 0x01; //字节读取命令
ISP_ADDRH = Addr>>8;
ISP_ADDRL = Addr; //送地址
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9; //触发命令
return ISP_DATA;
}
/*******************************************************
函数:void EEPROM_Erase(uint16_t Addr);
功能:擦除EEPROM对应地址的数据;
*******************************************************/
void EEPROM_Erase(uint16_t Addr)
{
ISP_CONTR = 0x82; //允许ISP,设置等待时间
ISP_CMD = 0x03; //扇区擦除命令
ISP_ADDRH = Addr>>8;
ISP_ADDRL = Addr; //送地址
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9; //触发命令
}
/*******************************************************************************************
函数:void WriteE2P_IRcode(void)
功能: 往EEPROM内部写入全部遥控码
第一扇区(0x2000)预置遥控通道和快捷键;
第二扇区(0x2200)开始存储RCA协议码,系统码、用户码各占一个字节
第三扇区(0x2400)开始)存储NEC8协议码,系统码、用户码各占一个字节
第四扇区(0x2600)开始)存储NEC16协议码,系统抡茧两个字节,用户码占两个个字节
******************************************************************************************/
void WriteE2P_IRcode(void)
{
uint8_t i=0,j=0;
uint8_t RCAcode_Offet = 0;//RCA通道快捷键对应的遥控码EEPROM地址偏移量
uint8_t NEC8code_Offet = 0;//NEC8通道快捷键对应的遥控码EEPROM地址偏移量
uint8_t NEC16code_Offet = 0;//NEC16通道快捷键对应的遥控码EEPROM地址偏移量
EEPROM_Erase(Channel_ShortcutKey); //擦除第一扇区
EEPROM_Write(Channel_ShortcutKey+0,RCA); //预置RCA通道
EEPROM_Write(Channel_ShortcutKey+1,AV1); //预置AV1
EEPROM_Write(Channel_ShortcutKey+2,HDMI1); //预置HDMI1
EEPROM_Write(Channel_ShortcutKey+3,TV5); //预置TV5
EEPROM_Write(Channel_ShortcutKey+4,Wifi_ON);//预置Wifi_ON
EEPROM_Write(Channel_ShortcutKey+5,Exit); //预置Exit
EEPROM_Erase(RCAcode_HeadAddr); //擦除第二扇区
for(i=0;i<29;i++)
{
RCAcode_Offet += i*2; //确定NEC8偏移量
for(j=0;j<2;j++)
{
EEPROM_Write(RCAcode_HeadAddr+RCAcode_Offet,RCAcode_Table[i][j]);
RCAcode_Offet++;
}
RCAcode_Offet=0; //偏移量归零
}
EEPROM_Erase(NEC8code_HeadAddr); //擦除第三扇区
for(i=0;i<29;i++)
{
NEC8code_Offet += i*2; //确定NEC8偏移量
for(j=0;j<2;j++)
{
EEPROM_Write(NEC8code_HeadAddr+NEC8code_Offet,NEC8code_Table[i][j]);
NEC8code_Offet++;
}
NEC8code_Offet=0; //偏移量归零
}
EEPROM_Erase(NEC16code_HeadAddr);//擦除第四扇区
for(i=0;i<29;i++)
{
NEC16code_Offet += i*4; //确定NEC16偏移量
for(j=0;j<2;j++)
{
EEPROM_Write(NEC16code_HeadAddr+NEC16code_Offet,(NEC16code_Table[i][j])/256);
NEC16code_Offet++;
EEPROM_Write(NEC16code_HeadAddr+NEC16code_Offet,(NEC16code_Table[i][j])%256);
NEC16code_Offet++;
}
NEC16code_Offet=0; //偏移量归零
}
}
/*******************************************************************************************
函数void ReadE2P_IRcode(uint8_t Channel,uint8_t ShortcutKey,uint8_t *pHex_IRcode)
功能: 从EEPROM内部读取对应快捷键的遥控协议码,外部传入4字节数组以存储遥控码
第二扇区(0x2200开始)存储RCA协议码,系统码、用户码各占一个字节
第三扇区(0x2400开始)存储NEC8协议码,系统码、用户码各占一个字节
第四扇区(0x2600开始)存储NEC16协议码,系统码占两个字节,用户码占两个字节
注:第一扇区(0x2000)存储的是设置好的遥控通道和快捷键;
******************************************************************************************/
void ReadE2P_IRcode(uint8_t Channel,uint8_t ShortcutKey,uint8_t *pHex_IRcode)
{
uint8_t RCAcode_Offet = 0;//RCA通道快捷键对应的遥控码EEPROM地址偏移量
uint8_t NEC8code_Offet = 0;//NEC8通道快捷键对应的遥控码EEPROM地址偏移量
uint8_t NEC16code_Offet = 0;//NEC16通道快捷键对应的遥控码EEPROM地址偏移量
switch(Channel)//先读取系统码,后读取用户码
{
case RCA:
{
RCAcode_Offet=ShortcutKey*2;
pHex_IRcode[0]=EEPROM_Read(RCAcode_HeadAddr+RCAcode_Offet);
pHex_IRcode[1]=EEPROM_Read(RCAcode_HeadAddr+RCAcode_Offet+1);break;
}
case NEC8:
{
NEC8code_Offet=ShortcutKey*2;
pHex_IRcode[0]=EEPROM_Read(NEC8code_HeadAddr+NEC8code_Offet);
pHex_IRcode[1]=EEPROM_Read(NEC8code_HeadAddr+NEC8code_Offet+1);break;
}
case NEC16:
{
NEC16code_Offet=ShortcutKey*4;
pHex_IRcode[0]=EEPROM_Read(NEC16code_HeadAddr+NEC16code_Offet); //系统码高8位
pHex_IRcode[1]=EEPROM_Read(NEC16code_HeadAddr+NEC16code_Offet+1);//系统码低八位
pHex_IRcode[2]=EEPROM_Read(NEC16code_HeadAddr+NEC16code_Offet+2);//0x00
pHex_IRcode[3]=EEPROM_Read(NEC16code_HeadAddr+NEC16code_Offet+3);break;//用户码
}
default:{break;}
}
}
复制代码
#include "ChannelShortcutDef.h"
//遥控通道列表
uint8_t code Channel_Table[3][7]=
{
"RCA",
"NEC-8",
"NEC-16"
};
//遥控快捷键列表
uint8_t code Shortcut_Table[22][9]=
{
"AV1",
"AV2",
"HDMI1",
"HDMI2",
"HDMI3",
"HDMI4",
"TV5",
"TV6",
"TV8",
"TV10",
"TV62",
"TV",
"Cable",
"3D_ON",
"3D_OFF",
"Wifi_ON",
"MIC_ON",
"MIC_OFF",
"Show_SN",
"OOB_Shop",
"PW_OFF",
"Exit"
};
//RCA协议遥控码,系统码+用户码,对应工厂遥控器000通道
uint8_t code RCAcode_Table[29][2]=
{
{0x08,0x01},//AV1
{0x08,0x02},//AV2
{0x08,0x08},//HDMI1
{0x08,0x09},//HDMI2
{0x08,0x0A},//HDMI3
{0x08,0x0B},//HDMI4
{0x0B,0x0A},//TV5=TV+5+OK三个按键
{0x0B,0x0A},//TV6=TV+6+OK三个按键
{0x0B,0x0A},//TV8=TV+8+OK三个按键
{0x0B,0x0A},//TV10=TV+10+OK三个按键
{0x0B,0x0A},//TV62=TV+6+2+OK三个按键
{0x0B,0x0A},//TV
{0x0C,0x0D},//Cable
{0x08,0x3D},//3D_ON
{0x08,0x3E},//3D_OFF
{0x06,0x1D},//Wifi_ON
{0x08,0x18},//MIC_ON
{0x08,0x19},//MIC_OFF
{0x08,0x14},//Show_SN
{0x06,0x2E},//OOB_Shop
{0x06,0x15},//PW_OFF
{0x00,0xF9},//Exit
{0x00,0xCF},//Num0
{0x00,0xCE},//Num1
{0x00,0xCD},//Num2
{0x00,0xCA},//Num5
{0x00,0xC9},//Num6
{0x00,0xC7},//Num8
{0x00,0x0B} //OK
};
//NEC8协议遥控码,系统码+用户码,对应工厂遥控器001通道
uint8_t code NEC8code_Table[29][2]=
{
{0x08,0x01},//AV1
{0x08,0x02},//AV2
{0x08,0x08},//HDMI1
{0x08,0x09},//HDMI2
{0x08,0x0A},//HDMI3
{0x08,0x0B},//HDMI4
{0x0B,0x0A},//TV5=TV+5+OK三个按键
{0x0B,0x0A},//TV6=TV+6+OK三个按键
{0x0B,0x0A},//TV8=TV+8+OK三个按键
{0x0B,0x0A},//TV10=TV+1+0+OK三个按键
{0x0B,0x0A},//TV62=TV+6+2+OK三个按键
{0x0B,0x0A},//TV
{0x0C,0x0D},//Cable
{0x08,0x3D},//3D_ON
{0x08,0x3E},//3D_OFF
{0x06,0x1D},//Wifi_ON
{0x08,0x18},//MIC_ON
{0x08,0x19},//MIC_OFF
{0x08,0x14},//Show_SN
{0x06,0x2E},//OOB_Shop
{0x06,0x15},//PW_OFF
{0x40,0x43},//Exit
{0x40,0x00},//Num0
{0x40,0x01},//Num1
{0x40,0x02},//Num2
{0x40,0x05},//Num5
{0x40,0x06},//Num6
{0x40,0x08},//Num8
{0x40,0x21} //OK
};
//NEC16协议遥控码,系统码+用户码,对应工厂遥控器002通道
uint16_t code NEC16code_Table[29][2]=
{
{0x08,0x01},//AV1
{0x08,0x02},//AV2
{0x08,0x08},//HDMI1
{0x08,0x09},//HDMI2
{0x08,0x0A},//HDMI3
{0x08,0x0B},//HDMI4
{0x0B,0x0A},//TV5=TV+5+OK三个按键
{0x0B,0x0A},//TV6=TV+6+OK三个按键
{0x0B,0x0A},//TV8=TV+8+OK三个按键
{0x0B,0x0A},//TV10=TV+10+OK三个按键
{0x0B,0x0A},//TV62=TV+6+2+OK三个按键
{0x0B,0x0A},//TV
{0x0C,0x0D},//Cable
{0x08,0x3D},//3D_ON
{0x08,0x3E},//3D_OFF
{0x06,0x1D},//Wifi_ON
{0x08,0x18},//MIC_ON
{0x08,0x19},//MIC_OFF
{0x08,0x14},//Show_SN
{0x06,0x2E},//OOB_Shop
{0x06,0x15},//PW_OFF
{0x2012,0x42},//Exit
{0x2012,0x10},//Num0
{0x2012,0x11},//Num1
{0x2012,0x12},//Num2
{0x2012,0x15},//Num5
{0x2012,0x16},//Num6
{0x2012,0x18},//Num8
{0x2012,0x40} //OK
};
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1