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

📄 ir_decode.lst

📁 单片机开发系统演示程序 - 红外遥控器键值显示 ,包含C和ASM源程序.1602液晶显示.
💻 LST
字号:
C51 COMPILER V8.02   IR_DECODE                                                             05/26/2006 22:12:13 PAGE 1   


C51 COMPILER V8.02, 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          /* ME300B单片机开发系统演示程序 - 红外遥控器键值显示               */
   4          /*                                                                 */
   5          /* LCD1602显示                                                     */
   6          /*                                                                 */
   7          /* 邮箱:  gguoqing@willar.com                                      */
   8          /* 网站: http://www.willar.com                                    */
   9          /* 作者: gguoqing                                                 */
  10          /* 时间: 2006/05/25                                               */
  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= P1^3;         //继电器驱动线
  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.02   IR_DECODE                                                             05/26/2006 22:12:13 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.02   IR_DECODE                                                             05/26/2006 22:12:13 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           m = 0;
 155   1          while(cdis1[m] != '\0')
 156   1           {                         //显示字符
 157   2             lcd_wdat(cdis1[m]);
 158   2             m++;
 159   2           }
 160   1      
 161   1          lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 162   1           m = 0;
 163   1          while(cdis2[m] != '\0')
 164   1           {
 165   2             lcd_wdat(cdis2[m]);      //显示字符
 166   2             m++;
 167   2           }
 168   1      
 169   1         while(1)     ;
 170   1      
 171   1      } //end main
 172          /**********************************************************/
 173          void IR_IN() interrupt 0 using 0
 174          {
 175   1        unsigned char j,k,N=0;
 176   1           EX0 = 0;   
 177   1               delay(15);
 178   1               if (IRIN==1) 
C51 COMPILER V8.02   IR_DECODE                                                             05/26/2006 22:12:13 PAGE 4   

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    513    ----
   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 + -