找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4375|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)紅外解碼并更新遙控碼至stc單片機(jī)的EPROM

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:137504 發(fā)表于 2016-9-11 22:16 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式

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

下面是部分程序代碼的預(yù)覽:
  1. #include "EEPROM.h"
  2. #include "ChannelShortcutDef.h"

  3. /*******************************************************
  4. 函數(shù):void EEPROM_Write(uint16_t Addr,uint8_t Data);
  5. 功能:向EEPROM對應(yīng)地址寫數(shù)據(jù),
  6.        寫數(shù)據(jù)前要先擦除所寫地址中的數(shù)據(jù);
  7. *******************************************************/
  8. void EEPROM_Write(uint16_t Addr,uint8_t Data)
  9. {
  10.         ISP_CONTR = 0x82;          //允許ISP,設(shè)置等待時(shí)間
  11.         ISP_CMD   = 0x02;          //字節(jié)編程命令
  12.         ISP_ADDRH = Addr>>8;
  13.         ISP_ADDRL = Addr;          //送地址
  14.         ISP_DATA  = Data;          //送數(shù)據(jù)

  15.         ISP_TRIG  = 0x46;
  16.         ISP_TRIG  = 0xB9;          //觸發(fā)命令
  17. }
  18. /*******************************************************
  19. 函數(shù):uint8_t EEPROM_Read(uint16_t Addr);
  20. 功能:讀EEPROM對應(yīng)地址中的數(shù)據(jù);
  21. *******************************************************/
  22. uint8_t EEPROM_Read(uint16_t Addr)
  23. {
  24.         ISP_CONTR = 0x82;          //允許ISP,設(shè)置等待時(shí)間
  25.         ISP_CMD   = 0x01;          //字節(jié)讀取命令
  26.         ISP_ADDRH = Addr>>8;
  27.         ISP_ADDRL = Addr;          //送地址

  28.         ISP_TRIG  = 0x46;
  29.         ISP_TRIG  = 0xB9;          //觸發(fā)命令

  30.         return ISP_DATA;
  31. }
  32. /*******************************************************
  33. 函數(shù):void EEPROM_Erase(uint16_t Addr);
  34. 功能:擦除EEPROM對應(yīng)地址的數(shù)據(jù);
  35. *******************************************************/
  36. void EEPROM_Erase(uint16_t Addr)
  37. {
  38.         ISP_CONTR = 0x82;          //允許ISP,設(shè)置等待時(shí)間
  39.         ISP_CMD   = 0x03;          //扇區(qū)擦除命令
  40.         ISP_ADDRH = Addr>>8;
  41.         ISP_ADDRL = Addr;          //送地址

  42.         ISP_TRIG  = 0x46;
  43.         ISP_TRIG  = 0xB9;          //觸發(fā)命令
  44. }
  45. /*******************************************************************************************
  46. 函數(shù):void WriteE2P_IRcode(void)
  47. 功能: 往EEPROM內(nèi)部寫入全部遙控碼
  48.                          第一扇區(qū)(0x2000)預(yù)置遙控通道和快捷鍵;
  49.                          第二扇區(qū)(0x2200)開始存儲RCA協(xié)議碼,系統(tǒng)碼、用戶碼各占一個字節(jié)
  50.                          第三扇區(qū)(0x2400)開始)存儲NEC8協(xié)議碼,系統(tǒng)碼、用戶碼各占一個字節(jié)
  51.                    第四扇區(qū)(0x2600)開始)存儲NEC16協(xié)議碼,系統(tǒng)掄繭兩個字節(jié),用戶碼占兩個個字節(jié)
  52. ******************************************************************************************/
  53. void WriteE2P_IRcode(void)
  54. {
  55.         uint8_t i=0,j=0;
  56.         uint8_t RCAcode_Offet   = 0;//RCA通道快捷鍵對應(yīng)的遙控碼EEPROM地址偏移量
  57.         uint8_t NEC8code_Offet  = 0;//NEC8通道快捷鍵對應(yīng)的遙控碼EEPROM地址偏移量
  58.         uint8_t NEC16code_Offet = 0;//NEC16通道快捷鍵對應(yīng)的遙控碼EEPROM地址偏移量

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

  66.         EEPROM_Erase(RCAcode_HeadAddr);  //擦除第二扇區(qū)
  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); //擦除第三扇區(qū)
  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);//擦除第四扇區(qū)
  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. 函數(shù)void ReadE2P_IRcode(uint8_t Channel,uint8_t ShortcutKey,uint8_t *pHex_IRcode)
  106. 功能: 從EEPROM內(nèi)部讀取對應(yīng)快捷鍵的遙控協(xié)議碼,外部傳入4字節(jié)數(shù)組以存儲遙控碼
  107.                          第二扇區(qū)(0x2200開始)存儲RCA協(xié)議碼,系統(tǒng)碼、用戶碼各占一個字節(jié)
  108.                          第三扇區(qū)(0x2400開始)存儲NEC8協(xié)議碼,系統(tǒng)碼、用戶碼各占一個字節(jié)
  109.                    第四扇區(qū)(0x2600開始)存儲NEC16協(xié)議碼,系統(tǒng)碼占兩個字節(jié),用戶碼占兩個字節(jié)
  110.                    注:第一扇區(qū)(0x2000)存儲的是設(shè)置好的遙控通道和快捷鍵;
  111. ******************************************************************************************/
  112. void ReadE2P_IRcode(uint8_t Channel,uint8_t ShortcutKey,uint8_t *pHex_IRcode)
  113. {        
  114.         uint8_t RCAcode_Offet   = 0;//RCA通道快捷鍵對應(yīng)的遙控碼EEPROM地址偏移量
  115.         uint8_t NEC8code_Offet  = 0;//NEC8通道快捷鍵對應(yīng)的遙控碼EEPROM地址偏移量
  116.         uint8_t NEC16code_Offet = 0;//NEC16通道快捷鍵對應(yīng)的遙控碼EEPROM地址偏移量
  117.         
  118.         switch(Channel)//先讀取系統(tǒng)碼,后讀取用戶碼
  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);         //系統(tǒng)碼高8位
  136.                         pHex_IRcode[1]=EEPROM_Read(NEC16code_HeadAddr+NEC16code_Offet+1);//系統(tǒng)碼低八位
  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. }
復(fù)制代碼
  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協(xié)議遙控碼,系統(tǒng)碼+用戶碼,對應(yīng)工廠遙控器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協(xié)議遙控碼,系統(tǒng)碼+用戶碼,對應(yīng)工廠遙控器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協(xié)議遙控碼,系統(tǒng)碼+用戶碼,對應(yīng)工廠遙控器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. };
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表