找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3664|回复: 0
收起左侧

单片机红外解码并更新遥控码至stc单片机的EPROM

[复制链接]
ID:137504 发表于 2016-9-11 22:16 | 显示全部楼层 |阅读模式

本例程的完整keil工程文件下载:
http://www.51hei.com/bbs/dpj-55490-1.html

下面是部分程序代码的预览:
  1. #include "EEPROM.h"
  2. #include "ChannelShortcutDef.h"

  3. /*******************************************************
  4. 函数:void EEPROM_Write(uint16_t Addr,uint8_t Data);
  5. 功能:向EEPROM对应地址写数据,
  6.        写数据前要先擦除所写地址中的数据;
  7. *******************************************************/
  8. void EEPROM_Write(uint16_t Addr,uint8_t Data)
  9. {
  10.         ISP_CONTR = 0x82;          //允许ISP,设置等待时间
  11.         ISP_CMD   = 0x02;          //字节编程命令
  12.         ISP_ADDRH = Addr>>8;
  13.         ISP_ADDRL = Addr;          //送地址
  14.         ISP_DATA  = Data;          //送数据

  15.         ISP_TRIG  = 0x46;
  16.         ISP_TRIG  = 0xB9;          //触发命令
  17. }
  18. /*******************************************************
  19. 函数:uint8_t EEPROM_Read(uint16_t Addr);
  20. 功能:读EEPROM对应地址中的数据;
  21. *******************************************************/
  22. uint8_t EEPROM_Read(uint16_t Addr)
  23. {
  24.         ISP_CONTR = 0x82;          //允许ISP,设置等待时间
  25.         ISP_CMD   = 0x01;          //字节读取命令
  26.         ISP_ADDRH = Addr>>8;
  27.         ISP_ADDRL = Addr;          //送地址

  28.         ISP_TRIG  = 0x46;
  29.         ISP_TRIG  = 0xB9;          //触发命令

  30.         return ISP_DATA;
  31. }
  32. /*******************************************************
  33. 函数:void EEPROM_Erase(uint16_t Addr);
  34. 功能:擦除EEPROM对应地址的数据;
  35. *******************************************************/
  36. void EEPROM_Erase(uint16_t Addr)
  37. {
  38.         ISP_CONTR = 0x82;          //允许ISP,设置等待时间
  39.         ISP_CMD   = 0x03;          //扇区擦除命令
  40.         ISP_ADDRH = Addr>>8;
  41.         ISP_ADDRL = Addr;          //送地址

  42.         ISP_TRIG  = 0x46;
  43.         ISP_TRIG  = 0xB9;          //触发命令
  44. }
  45. /*******************************************************************************************
  46. 函数:void WriteE2P_IRcode(void)
  47. 功能: 往EEPROM内部写入全部遥控码
  48.                          第一扇区(0x2000)预置遥控通道和快捷键;
  49.                          第二扇区(0x2200)开始存储RCA协议码,系统码、用户码各占一个字节
  50.                          第三扇区(0x2400)开始)存储NEC8协议码,系统码、用户码各占一个字节
  51.                    第四扇区(0x2600)开始)存储NEC16协议码,系统抡茧两个字节,用户码占两个个字节
  52. ******************************************************************************************/
  53. void WriteE2P_IRcode(void)
  54. {
  55.         uint8_t i=0,j=0;
  56.         uint8_t RCAcode_Offet   = 0;//RCA通道快捷键对应的遥控码EEPROM地址偏移量
  57.         uint8_t NEC8code_Offet  = 0;//NEC8通道快捷键对应的遥控码EEPROM地址偏移量
  58.         uint8_t NEC16code_Offet = 0;//NEC16通道快捷键对应的遥控码EEPROM地址偏移量

  59.         EEPROM_Erase(Channel_ShortcutKey);                //擦除第一扇区
  60.         EEPROM_Write(Channel_ShortcutKey+0,RCA);          //预置RCA通道
  61.         EEPROM_Write(Channel_ShortcutKey+1,AV1);          //预置AV1
  62.         EEPROM_Write(Channel_ShortcutKey+2,HDMI1);        //预置HDMI1
  63.         EEPROM_Write(Channel_ShortcutKey+3,TV5);                //预置TV5
  64.         EEPROM_Write(Channel_ShortcutKey+4,Wifi_ON);//预置Wifi_ON
  65.         EEPROM_Write(Channel_ShortcutKey+5,Exit);                //预置Exit

  66.         EEPROM_Erase(RCAcode_HeadAddr);  //擦除第二扇区
  67.         for(i=0;i<29;i++)
  68.         {
  69.                 RCAcode_Offet += i*2;                             //确定NEC8偏移量
  70.                 for(j=0;j<2;j++)
  71.                 {
  72.                         EEPROM_Write(RCAcode_HeadAddr+RCAcode_Offet,RCAcode_Table[i][j]);
  73.                         RCAcode_Offet++;
  74.                  }
  75.                 RCAcode_Offet=0;                                                         //偏移量归零                                                
  76.          }
  77.          
  78.         EEPROM_Erase(NEC8code_HeadAddr); //擦除第三扇区
  79.         for(i=0;i<29;i++)
  80.         {
  81.                 NEC8code_Offet += i*2;                           //确定NEC8偏移量
  82.                 for(j=0;j<2;j++)
  83.                 {
  84.                         EEPROM_Write(NEC8code_HeadAddr+NEC8code_Offet,NEC8code_Table[i][j]);
  85.                         NEC8code_Offet++;
  86.                  }
  87.                 NEC8code_Offet=0;                                                         //偏移量归零                                                
  88.          }
  89.          
  90.         EEPROM_Erase(NEC16code_HeadAddr);//擦除第四扇区
  91.         for(i=0;i<29;i++)
  92.         {
  93.                 NEC16code_Offet += i*4;                           //确定NEC16偏移量
  94.                 for(j=0;j<2;j++)
  95.                 {
  96.                         EEPROM_Write(NEC16code_HeadAddr+NEC16code_Offet,(NEC16code_Table[i][j])/256);
  97.                         NEC16code_Offet++;
  98.                         EEPROM_Write(NEC16code_HeadAddr+NEC16code_Offet,(NEC16code_Table[i][j])%256);
  99.                         NEC16code_Offet++;
  100.                  }
  101.                 NEC16code_Offet=0;                                                 //偏移量归零                                                
  102.          }
  103. }
  104. /*******************************************************************************************
  105. 函数void ReadE2P_IRcode(uint8_t Channel,uint8_t ShortcutKey,uint8_t *pHex_IRcode)
  106. 功能: 从EEPROM内部读取对应快捷键的遥控协议码,外部传入4字节数组以存储遥控码
  107.                          第二扇区(0x2200开始)存储RCA协议码,系统码、用户码各占一个字节
  108.                          第三扇区(0x2400开始)存储NEC8协议码,系统码、用户码各占一个字节
  109.                    第四扇区(0x2600开始)存储NEC16协议码,系统码占两个字节,用户码占两个字节
  110.                    注:第一扇区(0x2000)存储的是设置好的遥控通道和快捷键;
  111. ******************************************************************************************/
  112. void ReadE2P_IRcode(uint8_t Channel,uint8_t ShortcutKey,uint8_t *pHex_IRcode)
  113. {        
  114.         uint8_t RCAcode_Offet   = 0;//RCA通道快捷键对应的遥控码EEPROM地址偏移量
  115.         uint8_t NEC8code_Offet  = 0;//NEC8通道快捷键对应的遥控码EEPROM地址偏移量
  116.         uint8_t NEC16code_Offet = 0;//NEC16通道快捷键对应的遥控码EEPROM地址偏移量
  117.         
  118.         switch(Channel)//先读取系统码,后读取用户码
  119.         {
  120.                 case RCA:               
  121.                 {
  122.                         RCAcode_Offet=ShortcutKey*2;
  123.                         pHex_IRcode[0]=EEPROM_Read(RCAcode_HeadAddr+RCAcode_Offet);
  124.                         pHex_IRcode[1]=EEPROM_Read(RCAcode_HeadAddr+RCAcode_Offet+1);break;
  125.                  }
  126.                 case NEC8:               
  127.                 {
  128.                         NEC8code_Offet=ShortcutKey*2;
  129.                         pHex_IRcode[0]=EEPROM_Read(NEC8code_HeadAddr+NEC8code_Offet);
  130.                         pHex_IRcode[1]=EEPROM_Read(NEC8code_HeadAddr+NEC8code_Offet+1);break;
  131.                  }
  132.                 case NEC16:               
  133.                 {
  134.                         NEC16code_Offet=ShortcutKey*4;
  135.                         pHex_IRcode[0]=EEPROM_Read(NEC16code_HeadAddr+NEC16code_Offet);         //系统码高8位
  136.                         pHex_IRcode[1]=EEPROM_Read(NEC16code_HeadAddr+NEC16code_Offet+1);//系统码低八位
  137.                         pHex_IRcode[2]=EEPROM_Read(NEC16code_HeadAddr+NEC16code_Offet+2);//0x00
  138.                         pHex_IRcode[3]=EEPROM_Read(NEC16code_HeadAddr+NEC16code_Offet+3);break;//用户码
  139.                  }
  140.                 default:{break;}
  141.          }
  142. }
复制代码
  1. #include "ChannelShortcutDef.h"

  2. //遥控通道列表
  3. uint8_t code Channel_Table[3][7]=
  4. {
  5.         "RCA",
  6.         "NEC-8",
  7.         "NEC-16"
  8. };
  9. //遥控快捷键列表
  10. uint8_t code Shortcut_Table[22][9]=
  11. {
  12.         "AV1",                                                                                                        
  13.         "AV2",                                
  14.         "HDMI1",               
  15.         "HDMI2",
  16.         "HDMI3",
  17.         "HDMI4",
  18.         "TV5",
  19.         "TV6",
  20.         "TV8",
  21.         "TV10",
  22.         "TV62",
  23.         "TV",
  24.         "Cable",
  25.         "3D_ON",
  26.         "3D_OFF",
  27.         "Wifi_ON",
  28.         "MIC_ON",
  29.         "MIC_OFF",
  30.         "Show_SN",
  31.         "OOB_Shop",
  32.         "PW_OFF",
  33.         "Exit"
  34. };
  35. //RCA协议遥控码,系统码+用户码,对应工厂遥控器000通道
  36. uint8_t code RCAcode_Table[29][2]=
  37. {
  38.         {0x08,0x01},//AV1
  39.         {0x08,0x02},//AV2
  40.         {0x08,0x08},//HDMI1
  41.         {0x08,0x09},//HDMI2
  42.         {0x08,0x0A},//HDMI3
  43.         {0x08,0x0B},//HDMI4
  44.         {0x0B,0x0A},//TV5=TV+5+OK三个按键
  45.         {0x0B,0x0A},//TV6=TV+6+OK三个按键
  46.         {0x0B,0x0A},//TV8=TV+8+OK三个按键
  47.         {0x0B,0x0A},//TV10=TV+10+OK三个按键
  48.         {0x0B,0x0A},//TV62=TV+6+2+OK三个按键
  49.         {0x0B,0x0A},//TV
  50.         {0x0C,0x0D},//Cable
  51.         {0x08,0x3D},//3D_ON
  52.         {0x08,0x3E},//3D_OFF
  53.         {0x06,0x1D},//Wifi_ON
  54.         {0x08,0x18},//MIC_ON
  55.         {0x08,0x19},//MIC_OFF
  56.         {0x08,0x14},//Show_SN
  57.         {0x06,0x2E},//OOB_Shop
  58.         {0x06,0x15},//PW_OFF
  59.         {0x00,0xF9},//Exit
  60.         
  61.         {0x00,0xCF},//Num0
  62.         {0x00,0xCE},//Num1
  63.         {0x00,0xCD},//Num2
  64.         {0x00,0xCA},//Num5
  65.         {0x00,0xC9},//Num6
  66.         {0x00,0xC7},//Num8
  67.         {0x00,0x0B} //OK
  68. };
  69. //NEC8协议遥控码,系统码+用户码,对应工厂遥控器001通道
  70. uint8_t code NEC8code_Table[29][2]=
  71. {
  72.         {0x08,0x01},//AV1
  73.         {0x08,0x02},//AV2
  74.         {0x08,0x08},//HDMI1
  75.         {0x08,0x09},//HDMI2
  76.         {0x08,0x0A},//HDMI3
  77.         {0x08,0x0B},//HDMI4
  78.         {0x0B,0x0A},//TV5=TV+5+OK三个按键
  79.         {0x0B,0x0A},//TV6=TV+6+OK三个按键
  80.         {0x0B,0x0A},//TV8=TV+8+OK三个按键
  81.         {0x0B,0x0A},//TV10=TV+1+0+OK三个按键
  82.         {0x0B,0x0A},//TV62=TV+6+2+OK三个按键
  83.         {0x0B,0x0A},//TV
  84.         {0x0C,0x0D},//Cable
  85.         {0x08,0x3D},//3D_ON
  86.         {0x08,0x3E},//3D_OFF
  87.         {0x06,0x1D},//Wifi_ON
  88.         {0x08,0x18},//MIC_ON
  89.         {0x08,0x19},//MIC_OFF
  90.         {0x08,0x14},//Show_SN
  91.         {0x06,0x2E},//OOB_Shop
  92.         {0x06,0x15},//PW_OFF
  93.         {0x40,0x43},//Exit
  94.         
  95.         {0x40,0x00},//Num0
  96.         {0x40,0x01},//Num1
  97.         {0x40,0x02},//Num2
  98.         {0x40,0x05},//Num5
  99.         {0x40,0x06},//Num6
  100.         {0x40,0x08},//Num8
  101.         {0x40,0x21} //OK
  102. };
  103. //NEC16协议遥控码,系统码+用户码,对应工厂遥控器002通道
  104. uint16_t code NEC16code_Table[29][2]=
  105. {
  106.         {0x08,0x01},//AV1
  107.         {0x08,0x02},//AV2
  108.         {0x08,0x08},//HDMI1
  109.         {0x08,0x09},//HDMI2
  110.         {0x08,0x0A},//HDMI3
  111.         {0x08,0x0B},//HDMI4
  112.         {0x0B,0x0A},//TV5=TV+5+OK三个按键
  113.         {0x0B,0x0A},//TV6=TV+6+OK三个按键
  114.         {0x0B,0x0A},//TV8=TV+8+OK三个按键
  115.         {0x0B,0x0A},//TV10=TV+10+OK三个按键
  116.         {0x0B,0x0A},//TV62=TV+6+2+OK三个按键
  117.         {0x0B,0x0A},//TV
  118.         {0x0C,0x0D},//Cable
  119.         {0x08,0x3D},//3D_ON
  120.         {0x08,0x3E},//3D_OFF
  121.         {0x06,0x1D},//Wifi_ON
  122.         {0x08,0x18},//MIC_ON
  123.         {0x08,0x19},//MIC_OFF
  124.         {0x08,0x14},//Show_SN
  125.         {0x06,0x2E},//OOB_Shop
  126.         {0x06,0x15},//PW_OFF
  127.         {0x2012,0x42},//Exit
  128.         
  129.         {0x2012,0x10},//Num0
  130.         {0x2012,0x11},//Num1
  131.         {0x2012,0x12},//Num2
  132.         {0x2012,0x15},//Num5
  133.         {0x2012,0x16},//Num6
  134.         {0x2012,0x18},//Num8
  135.         {0x2012,0x40} //OK
  136. };
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表