久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3761|回復: 1
收起左側

單片機紅外解碼1602顯示鍵碼16進制值源碼分享

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

單片機源程序如下:
  1. /********************************************************************
  2. * 文件名  :  紅外解碼LCD.c
  3. * 描述    :  實現了紅外解碼遙控器上的按鍵的值并在1602上顯示出來。
  4.                          1602上顯示的是按鍵的十六進制值。                         
  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;         //紅外接收器數據線

  17. uchar IRCOM[7];

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


  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命令函數
  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寫數據函數
  53. * 輸入 : 需要寫入1602的數據
  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" ,調用該函數如下
  83.                  L1602_char(1,5,'b')
  84. * 輸入 : 行,列,需要輸入1602的數據
  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" ,調用該函數如下
  99.                   L1602_string(1,5,"ab cd ef;")
  100. * 輸入 : 行,列,需要輸入1602的數據
  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;               //觸發方式為脈沖負邊沿觸發
  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.                            //確認IR信號出現
  142.   while (!IRIN)            //等IR變為高電平,跳過9ms的前導低電平信號。
  143.     {delay(1);}

  144. for (j=0;j<4;j++)         //收集四組數據
  145. {
  146.   for (k=0;k<8;k++)        //每組數據有8位
  147.   {
  148.    while (IRIN)            //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
  149.      {delay(1);}
  150.     while (!IRIN)          //等 IR 變為高電平
  151.      {delay(1);}
  152.      while (IRIN)           //計算IR高電平時長
  153.       {
  154.     delay(1);
  155.     N++;           
  156.     if (N>=30)
  157.          { EX1=1;
  158.          return;}                  //0.14ms計數過長自動離開。
  159.       }                        //高電平計數完畢               
  160.      IRCOM[j]=IRCOM[j] >> 1;                  //數據最高位補“0”
  161.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數據最高位補“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次,高四位變為低四位

  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. }
復制代碼

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


回復

使用道具 舉報

ID:303454 發表于 2018-4-8 09:32 | 顯示全部樓層
好好學習,認真學習一下
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区在线视频 | 正在播放亚洲 | 呦呦在线视频 | 亚洲一区二区视频在线播放 | 亚洲精品在线免费 | a级大片免费观看 | 性欧美xxxx| 亚洲最色视频 | 亚欧精品 | 欧美a级成人淫片免费看 | 久久久久国 | 亚洲午夜精品视频 | 涩涩视频在线观看免费 | 激情五月综合 | 男人天堂网av | 亚洲男人网 | 精品国产久 | 在线观看黄视频 | 91精品久久久久久久久 | 日日骚av | 久草视频在线播放 | 亚洲精品一区二区另类图片 | 成人久草| 成人深夜福利在线观看 | 国产三区在线观看视频 | 在线观看av不卡 | 精品久久久久久久人人人人传媒 | 日韩欧美操| 91精品国产91久久久久久三级 | 97免费视频在线观看 | 日韩在线欧美 | 四虎最新视频 | 91影院| 亚洲一区成人 | 99精品国产一区二区青青牛奶 | 成年人视频在线免费观看 | 国产一区91精品张津瑜 | 91视频在线看 | 成人国产网站 | 久久久免费少妇高潮毛片 | 久久久久久免费精品一区二区三区 |