⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir_decode.lst

📁 红外遥控遥控键值解码-1602LCD显示,for keil
💻 LST
字号:
C51 COMPILER V8.05a   IR_DECODE                                                            11/23/2006 10:19:32 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE IR_DECODE
OBJECT MODULE PLACED IN ir_decode.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ir_decode.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************/
   2          /*                                                                 */
   3          /* ME500单片机开发系统演示程序 - 红外遥控器键值显示                */
   4          /*                                                                 */
   5          /* LCD1602显示                                                     */
   6          /*                                                                 */
   7          /* 版本: V1.0 (2006/11/20)                                        */
   8          /* 作者: gguoqing (Email: gguoqing@willar.com)                    */
   9          /* 网站: www.willar.com(伟纳电子)   www.mcusj.com(伟纳单片机世界) */
  10          /* 时间: 2006/05/26                                               */
  11          /*                                                                 */                                     
             -                             
  12          /*【版权】Copyright(C)伟纳电子 www.willar.com  All Rights Reserved */
  13          /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       */
  14          /*                                                                 */
  15          /*******************************************************************/
  16          
  17          #include <reg51.h>
  18          #include <intrins.h>
  19          
  20          #define uchar unsigned char
  21          #define uint  unsigned int
  22          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  23          
  24          void delay(uchar x);  //x*0.14MS
  25          void delay1(int ms);
  26          void beep();
  27          
  28          sbit IRIN = P3^2;         //红外接收器数据线
  29          sbit BEEP = P3^7;         //蜂鸣器驱动线
  30          sbit RELAY= P3^6;         //继电器驱动线
  31          
  32          uchar IRCOM[7];
  33          
  34          sbit LCD_RS = P2^0;             
  35          sbit LCD_RW = P2^1;
  36          sbit LCD_EN = P2^2;
  37          
  38          uchar code  cdis1[ ] = {" REMOTE CONTROL "};
  39          uchar code  cdis2[ ] = {"  IR-CODE: --H  "};
  40          
  41          /*******************************************************************/
  42          /*                                                                 */
  43          /*检查LCD忙状态                                                    */
  44          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  45          /*                                                                 */
  46          /*******************************************************************/ 
  47          
  48          bit lcd_busy()
  49           {                          
  50   1          bit result;
  51   1          LCD_RS = 0;
  52   1          LCD_RW = 1;
  53   1          LCD_EN = 1;
  54   1          delayNOP();
C51 COMPILER V8.05a   IR_DECODE                                                            11/23/2006 10:19:32 PAGE 2   

  55   1          result = (bit)(P0&0x80);
  56   1          LCD_EN = 0;
  57   1          return(result); 
  58   1       }
  59          
  60          /*******************************************************************/
  61          /*                                                                 */
  62          /*写指令数据到LCD                                                  */
  63          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  64          /*                                                                 */
  65          /*******************************************************************/
  66          
  67          void lcd_wcmd(uchar cmd)
  68          
  69          {                          
  70   1         while(lcd_busy());
  71   1          LCD_RS = 0;
  72   1          LCD_RW = 0;
  73   1          LCD_EN = 0;
  74   1          _nop_();
  75   1          _nop_(); 
  76   1          P0 = cmd;
  77   1          delayNOP();
  78   1          LCD_EN = 1;
  79   1          delayNOP();
  80   1          LCD_EN = 0;  
  81   1      }
  82          
  83          /*******************************************************************/
  84          /*                                                                 */
  85          /*写显示数据到LCD                                                  */
  86          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  87          /*                                                                 */
  88          /*******************************************************************/
  89          
  90          void lcd_wdat(uchar dat)
  91          {                          
  92   1         while(lcd_busy());
  93   1          LCD_RS = 1;
  94   1          LCD_RW = 0;
  95   1          LCD_EN = 0;
  96   1          P0 = dat;
  97   1          delayNOP();
  98   1          LCD_EN = 1;
  99   1          delayNOP();
 100   1          LCD_EN = 0; 
 101   1      }
 102          
 103          /*******************************************************************/
 104          /*                                                                 */
 105          /*  LCD初始化设定                                                  */
 106          /*                                                                 */
 107          /*******************************************************************/
 108          
 109          void lcd_init()
 110          { 
 111   1          delay1(15);                   
 112   1          lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
 113   1          delay1(5);
 114   1          lcd_wcmd(0x38);         
 115   1          delay1(5);
 116   1          lcd_wcmd(0x38);         
C51 COMPILER V8.05a   IR_DECODE                                                            11/23/2006 10:19:32 PAGE 3   

 117   1          delay1(5);
 118   1      
 119   1          lcd_wcmd(0x0c);      //显示开,关光标
 120   1          delay1(5);
 121   1          lcd_wcmd(0x06);      //移动光标
 122   1          delay1(5);
 123   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 124   1          delay1(5);
 125   1      }
 126          
 127          /*******************************************************************/
 128          /*                                                                 */
 129          /*  设定显示位置                                                   */
 130          /*                                                                 */
 131          /*******************************************************************/
 132          
 133          void lcd_pos(uchar pos)
 134          {                          
 135   1        lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
 136   1      }
 137          
 138          /*******************************************************************/
 139          main()
 140          {
 141   1         uchar m;
 142   1        
 143   1          IE = 0x81;                 //允许总中断中断,使能 INT0 外部中断
 144   1          TCON = 0x01;               //触发方式为脉冲负边沿触发
 145   1          
 146   1          IRIN=1;                    //I/O口初始化
 147   1          BEEP=1;
 148   1          RELAY=1; 
 149   1              
 150   1          delay1(10);                 //延时
 151   1          lcd_init();                //初始化LCD             
 152   1              
 153   1          lcd_pos(0);                //设置显示位置为第一行的第1个字符
 154   1          for(m=0;m<16;m++)
 155   1          lcd_wdat(cdis1[m]);
 156   1      
 157   1          lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 158   1          for(m=0;m<16;m++)
 159   1          lcd_wdat(cdis2[m]);
 160   1      
 161   1         while(1)     
 162   1         {
 163   2            if(IRCOM[2]==0x1d)       //UP键
 164   2             RELAY=0;
 165   2            if(IRCOM[2]==0x12)       //DOWN键
 166   2             RELAY=1;
 167   2         }
 168   1      
 169   1      } //end main
 170          /**********************************************************/
 171          void IR_IN() interrupt 0 //using 0
 172          {
 173   1        unsigned char j,k,N=0;
 174   1           EX0 = 0;   
 175   1               delay(15);
 176   1               if (IRIN==1) 
 177   1           { EX0 =1;
 178   2                 return;
C51 COMPILER V8.05a   IR_DECODE                                                            11/23/2006 10:19:32 PAGE 4   

 179   2                } 
 180   1                                 //确认IR信号出现
 181   1        while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
 182   1          {delay(1);}
 183   1      
 184   1       for (j=0;j<4;j++)         //收集四组数据
 185   1       { 
 186   2        for (k=0;k<8;k++)        //每组数据有8位
 187   2        {
 188   3         while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
 189   3           {delay(1);}
 190   3          while (!IRIN)          //等 IR 变为高电平
 191   3           {delay(1);}
 192   3           while (IRIN)           //计算IR高电平时长
 193   3            {
 194   4          delay(1);
 195   4          N++;           
 196   4          if (N>=30)
 197   4               { EX0=1;
 198   5               return;}                  //0.14ms计数过长自动离开。
 199   4            }                        //高电平计数完毕                
 200   3           IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
 201   3           if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
 202   3           N=0;
 203   3        }//end for k
 204   2       }//end for j
 205   1         
 206   1         if (IRCOM[2]!=~IRCOM[3])
 207   1         { EX0=1;
 208   2           return; }
 209   1      
 210   1         IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
 211   1         IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
 212   1      
 213   1         if(IRCOM[5]>9)
 214   1          { IRCOM[5]=IRCOM[5]+0x37;}
 215   1         else
 216   1                IRCOM[5]=IRCOM[5]+0x30;
 217   1      
 218   1         if(IRCOM[6]>9)
 219   1          { IRCOM[6]=IRCOM[6]+0x37;}
 220   1         else
 221   1                IRCOM[6]=IRCOM[6]+0x30;
 222   1      
 223   1           lcd_pos(0x4b);             
 224   1           lcd_wdat(IRCOM[6]);        //第一位数显示 
 225   1           lcd_pos(0x4c);             
 226   1           lcd_wdat(IRCOM[5]);        //第二位数显示
 227   1      
 228   1           beep();
 229   1           EX0 = 1; 
 230   1      } 
 231          
 232          /**********************************************************/
 233          void beep()
 234          {
 235   1        unsigned char i;
 236   1        for (i=0;i<180;i++)
 237   1         {
 238   2           delay(5);
 239   2           BEEP=!BEEP;                 //BEEP取反
 240   2         } 
C51 COMPILER V8.05a   IR_DECODE                                                            11/23/2006 10:19:32 PAGE 5   

 241   1        BEEP=1;                      //关闭蜂鸣器
 242   1      }
 243          /**********************************************************/
 244          void delay(unsigned char x)    //x*0.14MS
 245          {
 246   1       unsigned char i;
 247   1        while(x--)
 248   1       {
 249   2        for (i = 0; i<13; i++) {}
 250   2       }
 251   1      }
 252          
 253          /**********************************************************/
 254          void delay1(int ms)
 255          {
 256   1       unsigned char y;
 257   1        while(ms--)
 258   1       {
 259   2        for(y = 0; y<250; y++)
 260   2        {
 261   3         _nop_();
 262   3         _nop_();
 263   3         _nop_();
 264   3         _nop_();
 265   3        }
 266   2       }
 267   1      }
 268          
 269          /*
 270          ;================================
 271          ;DT9122D 遥控器(伟纳电子)
 272          
 273          ;******  红外遥控器键值表  ******
 274          
 275          ;  10     03      01      06
 276          ;  09     1D      1F      0D
 277          ;  19     1B      11      15
 278          ;  17     12      16      4C
 279          ;  40     48      04      00
 280          ;  02     05      54      4D
 281          ;  0A     1E      0E      1A
 282          ;  1C     14      0F      0C
 283          ;================================
 284          */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    556    ----
   CONSTANT SIZE    =     34    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -