找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3291|回复: 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 单片机教程网

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