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

📄 2.lst

📁 遥控器使用红外线遥控编码芯片为LC7461 单片机为89S52 12MHZ晶振 1602显示遥控器的每个键值
💻 LST
字号:
C51 COMPILER V7.50   2                                                                     08/19/2008 13:15:50 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 2
OBJECT MODULE PLACED IN 2.OBJ
COMPILER INVOKED BY: d:\Keil7.5\C51\BIN\C51.EXE 2.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          //若遥控接收不到,修改脉宽值即可
   3          //遥控器使用红外线遥控编码芯片为LC7461   12MHZ晶振
   4          //-----------------------------------------------
   5          #include <regx52.h>
   6          #include<intrins.h>
   7          
   8          sbit RS = P2^0;
   9          sbit RW = P2^1;
  10          sbit Elcm =P2^2;
  11          #define DATAPORT P0 // 数据端口
  12          #define busy 0x80 //用于检查写忙信号
  13          
  14          sbit p32=P3^2;
  15          sbit p37=P3^7;
  16          unsigned char flag;  //引导码标志位
  17          unsigned char REM_l;
  18          unsigned char REM_h;
  19          unsigned char a,b;
  20                          
  21          
  22          void delay400ms(void);
  23          void delay5ms(void);
  24          void lcdreset( void ); //LCD RESET
  25          void WaitForEnable( void ); //忙信号检测
  26          void lcdwrite_c( unsigned char CMD,unsigned char AttribC );//
  27          void DispOneChar(unsigned char x,unsigned char y,unsigned char Wdata);//显示一个字符
  28          void LocateXY( unsigned char posx,unsigned char posy);
  29          void LcdWrite_D( unsigned char dataW ) ; //写一个数据
  30          void disp(unsigned char x,unsigned char y,char *ptr);
  31          
  32          /**************精确延时程序***************/
  33          void delay_880us(void) //延时880us
  34          {
  35   1              unsigned int i;
  36   1              for(i=0;i<109;i++);
  37   1      }
  38           
  39          void delay_4720us(void) //延时4.7ms
  40          {
  41   1              unsigned int k;
  42   1              for(k=0;k<892;k++);
  43   1      }
  44           
  45          void delay_1ms(void) //延时1ms
  46          {
  47   1              unsigned int m;
  48   1              for(m=0;m<124;m++);
  49   1      }                   
  50          
  51          
  52          // 短延时
  53          void delay5ms(void)
  54          {
  55   1      unsigned int i = 5552;
C51 COMPILER V7.50   2                                                                     08/19/2008 13:15:50 PAGE 2   

  56   1      while(i--);
  57   1      }
  58          //长延时
  59          void delay400ms(void)
  60          {
  61   1      unsigned char i = 5;
  62   1      unsigned int j;
  63   1      while(i--)
  64   1      {
  65   2      j=7269;
  66   2      while(j--);
  67   2      };
  68   1      }
  69          
  70          
  71          /*=======================================================
  72          显示字符串
  73          =======================================================*/
  74          void disp(unsigned char x,unsigned char y,char *ptr) {
  75   1      unsigned char i,l=0;
  76   1      while (ptr[l] >31){l++;};
  77   1      for (i=0;i<l;i++) {
  78   2      DispOneChar(x++,y,ptr[i]);
  79   2      if ( x == 16 ){
  80   3      x = 0; y ^= 1;
  81   3      }
  82   2      }
  83   1      }
  84          /*=======================================================
  85          按指定位置显示数出一个字符
  86          =======================================================*/
  87          void DispOneChar(unsigned char x,unsigned char y,unsigned char Wdata) {
  88   1      LocateXY( x, y ); // 定位显示地址
  89   1      LcdWrite_D( Wdata ); // 写字符
  90   1      }
  91          /*=======================================================
  92          显示光标定位
  93          =======================================================*/
  94          void LocateXY( unsigned char posx,unsigned char posy) {
  95   1      unsigned char temp;
  96   1      temp = posx & 0xf;
  97   1      posy &= 0x1;
  98   1      if ( posy )temp |= 0x40;
  99   1      temp |= 0x80;
 100   1      lcdwrite_c(temp,0);
 101   1      }
 102          //初始化
 103          void lcdreset(void){
 104   1      lcdwrite_c(0x38, 0); //显示模式设置(不测试忙信号)共三次
 105   1      delay5ms();
 106   1      lcdwrite_c(0x38, 0);
 107   1      delay5ms();
 108   1      lcdwrite_c(0x38, 0);
 109   1      delay5ms();
 110   1      lcdwrite_c( 0x38, 1);
 111   1      lcdwrite_c( 0x08, 1);
 112   1      lcdwrite_c( 0x01, 1);
 113   1      lcdwrite_c( 0x06, 1);
 114   1      lcdwrite_c( 0x0c, 1);
 115   1      }
 116          
 117          /*=======================================================
C51 COMPILER V7.50   2                                                                     08/19/2008 13:15:50 PAGE 3   

 118          写控制字符子程序: E=1 RS=0 RW=0
 119          =======================================================*/
 120          void lcdwrite_c( unsigned char CMD,unsigned char AttribC ) {
 121   1      if (AttribC) WaitForEnable(); // 检测忙信号?
 122   1      RS = 0; RW = 0; _nop_();
 123   1      DATAPORT =CMD; _nop_(); // 送控制字子程序
 124   1      Elcm = 1;_nop_();_nop_();Elcm = 0; // 操作允许脉冲信号 
 125   1      }
 126          /*=======================================================*/
 127          /*=======================================================
 128          当前位置写字符子程序: E =1 RS=1 RW=0
 129          =======================================================*/
 130          void LcdWrite_D( unsigned char dataW ) {
 131   1      WaitForEnable(); // 检测忙信号
 132   1      RS = 1; RW = 0; _nop_();
 133   1      DATAPORT = dataW; _nop_();
 134   1      Elcm = 1; _nop_(); _nop_(); Elcm = 0; // 操作允许脉冲信号 
 135   1      }
 136          /*=======================================================
 137          正常读写操作之前必须检测LCD控制器状态: CS=1 RS=0 RW=1
 138          DB7: 0 LCD控制器空闲; 1 LCD控制器忙
 139          ========================================================*/
 140          void WaitForEnable( void ) {
 141   1      DATAPORT = 0xff;
 142   1      RS =0; RW = 1; _nop_(); Elcm = 1; _nop_(); _nop_();
 143   1      while( DATAPORT & busy );
 144   1      Elcm = 0;
 145   1      } 
 146                             
 147          
 148          /*************中断服务程序***********/
 149          void intt0(void) interrupt 0 using 0
 150          {
 151   1              unsigned char i,k,n,temp;
 152   1              EA=0;
 153   1              /****以下跳过系统引导码****/
 154   1              for(i=0;i<10;i++)
 155   1              {
 156   2                      delay_880us();//延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
 157   2                      if(p32==1)
 158   2                      {
 159   3                              flag=1;
 160   3                              break;
 161   3                      }// 重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
 162   2                      else
 163   2                              flag=0;
 164   2              }
 165   1              
 166   1              if(flag==0)
 167   1              { //
 168   2                      while(p32==0);//等待高电平避开9毫秒低电平引导脉冲               
 169   2                      delay_4720us();//延时4.74毫秒避开4.5毫秒的结果码
 170   2                      
 171   2                      /****忽略26位识别码****/
 172   2                      for(i=0;i<26;i++)
 173   2                      {
 174   3                              while(p32==0);
 175   3                              delay_880us();//高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
 176   3                              if(p32==0)
 177   3                              continue;
 178   3                              else
 179   3                              delay_1ms();
C51 COMPILER V7.50   2                                                                     08/19/2008 13:15:50 PAGE 4   

 180   3                      }
 181   2                      /*处理用户操作码及反码*/
 182   2                      for(n=0;n<2;n++)
 183   2                      {
 184   3                              k=0X01;
 185   3                              for(i=0;i<8;i++)
 186   3                              {
 187   4                                      while(p32==0);//等待高电平
 188   4                                              delay_880us();
 189   4                                      if(p32==0)       //检测该位为0或1 并存储到temp
 190   4                                              temp=temp&(~k);
 191   4                                      else
 192   4                                      {
 193   5                                              delay_1ms();
 194   5                                              temp=temp|k;
 195   5                                      }
 196   4                                      k=k<<1;
 197   4                              }
 198   3                              if(n==0) REM_h=temp;  //n==0时temp为操作码存到REM_h,n==1时为操作反码存到REM_l
 199   3                              else REM_l=temp;
 200   3                      }
 201   2                      if((~REM_h)==REM_l)
 202   2                      {
 203   3      //                      P1=REM_h;
 204   3                              p37=~p37;
 205   3                              if(REM_h/16<10) a=REM_h/16+'0';
 206   3                                      else a=REM_h/16+'A'-10;
 207   3                              if(REM_h%16<10) b =REM_h%16+'0';
 208   3                                      else b=REM_h%16+'A'-10;
 209   3                              DispOneChar(9,1,a);
 210   3                              DispOneChar(10,1,b);
 211   3                              DispOneChar(11,1,'H');
 212   3                      }
 213   2              }
 214   1              EA=1;
 215   1      }
 216          
 217          void main()
 218          {   
 219   1              lcdreset(); //初始化
 220   1          delay400ms();
 221   1              EA=1;
 222   1              IT0=1;
 223   1              EX0=1;
 224   1              disp(0,2,"  IR Decoder    ");//第一行
 225   1              disp(0,1,"KEYCODE:");           //第二行
 226   1              while(1);
 227   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    573    ----
   CONSTANT SIZE    =     26    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5      11
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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