找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3698|回復(fù): 1
收起左側(cè)

單片機(jī)紅外解碼1602顯示鍵碼16進(jìn)制值源碼分享

[復(fù)制鏈接]
ID:122843 發(fā)表于 2018-4-7 22:11 | 顯示全部樓層 |閱讀模式
很好的紅外解碼  可以解碼按鍵的16進(jìn)制

單片機(jī)源程序如下:
  1. /********************************************************************
  2. * 文件名  :  紅外解碼LCD.c
  3. * 描述    :  實現(xiàn)了紅外解碼遙控器上的按鍵的值并在1602上顯示出來。
  4.                          1602上顯示的是按鍵的十六進(jìn)制值。                         
  5. * 版本號  : 1.0
  6. ***********************************************************************/

  7. #include <reg51.h>
  8. #include <intrins.h>

  9. #define uchar unsigned char
  10. #define uint  unsigned int

  11. uchar LCD_ID_1[16] = {"Red Control"};
  12. uchar LCD_ID_2[16] = {"IR CODE:--H"};

  13. void delay(uchar x);  //x*0.14MS
  14. void delay1(int ms);
  15. void beep();

  16. sbit IRIN = P3^3;         //紅外接收器數(shù)據(jù)線

  17. uchar IRCOM[7];

  18. sbit E=P2^7;                //1602使能引腳
  19. sbit RW=P2^6;                //1602讀寫引腳       
  20. sbit RS=P2^5;                //1602數(shù)據(jù)/命令選擇引腳


  21. /********************************************************************
  22. * 名稱 : delay()
  23. * 功能 : 延時,延時時間大概為140US。
  24. * 輸入 : 無
  25. * 輸出 : 無
  26. ***********************************************************************/

  27. void Delay2()
  28. {
  29.         int i,j;
  30.         for(i=0; i<=10; i++)
  31.         for(j=0; j<=2; j++)
  32. ;
  33. }


  34. /********************************************************************
  35. * 名稱 : enable(uchar del)
  36. * 功能 : 1602命令函數(shù)
  37. * 輸入 : 輸入的命令值
  38. * 輸出 : 無
  39. ***********************************************************************/

  40. void enable(uchar del)
  41. {
  42.         P0 = del;
  43.         RS = 0;
  44.         RW = 0;
  45.         E = 0;
  46.         Delay2();
  47.         E = 1;
  48.         Delay2();
  49. }

  50. /********************************************************************
  51. * 名稱 : write(uchar del)
  52. * 功能 : 1602寫數(shù)據(jù)函數(shù)
  53. * 輸入 : 需要寫入1602的數(shù)據(jù)
  54. * 輸出 : 無
  55. ***********************************************************************/

  56. void write(uchar del)
  57. {
  58.         P0 = del;
  59.         RS = 1;
  60.         RW = 0;
  61.         E = 0;
  62.         Delay2();
  63.         E = 1;
  64.         Delay2();
  65. }

  66. /********************************************************************
  67. * 名稱 : L1602_init()
  68. * 功能 : 1602初始化,請參考1602的資料
  69. * 輸入 : 無
  70. * 輸出 : 無
  71. ***********************************************************************/
  72. void L1602_init(void)
  73. {
  74.         enable(0x01);
  75.         enable(0x38);
  76.         enable(0x0c);
  77.         enable(0x06);
  78.         enable(0xd0);
  79. }

  80. /********************************************************************
  81. * 名稱 : L1602_char(uchar hang,uchar lie,char sign)
  82. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調(diào)用該函數(shù)如下
  83.                  L1602_char(1,5,'b')
  84. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  85. * 輸出 : 無
  86. ***********************************************************************/
  87. void L1602_char(uchar hang,uchar lie,char sign)
  88. {
  89.         uchar a;
  90.         if(hang == 1) a = 0x80;
  91.         if(hang == 2) a = 0xc0;
  92.         a = a + lie - 1;
  93.         enable(a);
  94.         write(sign);
  95. }

  96. /********************************************************************
  97. * 名稱 : L1602_string(uchar hang,uchar lie,uchar *p)
  98. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  99.                   L1602_string(1,5,"ab cd ef;")
  100. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  101. * 輸出 : 無
  102. ***********************************************************************/
  103. void L1602_string(uchar hang,uchar lie,uchar *p)
  104. {
  105.         uchar a;
  106.         if(hang == 1) a = 0x80;
  107.         if(hang == 2) a = 0xc0;
  108.         a = a + lie - 1;
  109.         enable(a);
  110.         while(1)
  111.         {
  112.                 if(*p == '\0') break;
  113.                 write(*p);
  114.                 p++;
  115.         }
  116. }

  117. /*******************************************************************/
  118. main()
  119. {

  120.     IE = 0x84;                 //允許總中斷中斷,使能 INT1 外部中斷
  121.     TCON = 0x10;               //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
  122.    
  123.     IRIN=1;                    //I/O口初始化
  124.        
  125.     delay1(10);                 //延時
  126.     L1602_init();               //初始化LCD            
  127.         L1602_string(1, 1, LCD_ID_1);
  128.         L1602_string(2, 1, LCD_ID_2);
  129.    while(1)        ;

  130. } //end main
  131. /**********************************************************/
  132. void IR_IN() interrupt 2 using 0
  133. {
  134.   unsigned char j,k,N=0;
  135.      EX1 = 0;   
  136.          delay(15);
  137.          if (IRIN==1)
  138.      { EX1 =1;
  139.            return;
  140.           }
  141.                            //確認(rèn)IR信號出現(xiàn)
  142.   while (!IRIN)            //等IR變?yōu)楦唠娖剑^9ms的前導(dǎo)低電平信號。
  143.     {delay(1);}

  144. for (j=0;j<4;j++)         //收集四組數(shù)據(jù)
  145. {
  146.   for (k=0;k<8;k++)        //每組數(shù)據(jù)有8位
  147.   {
  148.    while (IRIN)            //等 IR 變?yōu)榈碗娖剑^4.5ms的前導(dǎo)高電平信號。
  149.      {delay(1);}
  150.     while (!IRIN)          //等 IR 變?yōu)楦唠娖?br />
  151.      {delay(1);}
  152.      while (IRIN)           //計算IR高電平時長
  153.       {
  154.     delay(1);
  155.     N++;           
  156.     if (N>=30)
  157.          { EX1=1;
  158.          return;}                  //0.14ms計數(shù)過長自動離開。
  159.       }                        //高電平計數(shù)完畢               
  160.      IRCOM[j]=IRCOM[j] >> 1;                  //數(shù)據(jù)最高位補“0”
  161.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數(shù)據(jù)最高位補“1”
  162.      N=0;
  163.   }//end for k
  164. }//end for j
  165.    
  166.    if (IRCOM[2]!=~IRCOM[3])
  167.    { EX1=1;
  168.      return; }

  169.    IRCOM[5]=IRCOM[2] & 0x0F;     //取鍵碼的低四位
  170.    IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位變?yōu)榈退奈?br />

  171.    if(IRCOM[5]>9)
  172.     { IRCOM[5]=IRCOM[5]+0x37;}
  173.    else
  174.           IRCOM[5]=IRCOM[5]+0x30;

  175.    if(IRCOM[6]>9)
  176.     { IRCOM[6]=IRCOM[6]+0x37;}
  177.    else
  178.           IRCOM[6]=IRCOM[6]+0x30;
  179. //////////////////////////
  180. L1602_char(2,10,IRCOM[5]);
  181. L1602_char(2,9,IRCOM[6]);
  182.      EX1 = 1;
  183. }


  184. /**********************************************************/
  185. void delay(unsigned char x)    //x*0.14MS
  186. {
  187. unsigned char i;
  188.   while(x--)
  189. {
  190.   for (i = 0; i<13; i++) {}
  191. }
  192. }

  193. /**********************************************************/
  194. void delay1(int ms)
  195. {
  196. unsigned char y;
  197.   while(ms--)
  198. {
  199.   for(y = 0; y<250; y++)
  200.   {
  201.    _nop_();
  202.    _nop_();
  203.    _nop_();
  204.    _nop_();
  205.   }
  206. }
  207. }
復(fù)制代碼

所有資料51hei提供下載:
【實驗87】紅外解碼1602顯示鍵碼16進(jìn)制值.zip (26.24 KB, 下載次數(shù): 33)


回復(fù)

使用道具 舉報

ID:303454 發(fā)表于 2018-4-8 09:32 | 顯示全部樓層
好好學(xué)習(xí),認(rèn)真學(xué)習(xí)一下
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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