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

📄 1602jm.lst

📁 1602遥控解码
💻 LST
字号:
C51 COMPILER V7.06   1602JM                                                                04/27/2009 13:20:53 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 1602JM
OBJECT MODULE PLACED IN 1602jm.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 1602jm.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /***********************************************************
   2          实验名称:遥控解码1602显示
   3          程序说明:用配送的杜邦线把P1.7和P3.2短接,正确插上LCD1602,用1602来显示解码结果。
   4          作者:RF-X1开发板团队
   5          日期:2008-08-01
   6          ***********************************************************/
   7              
   8          
   9          #include <at89x52.h>
  10          
  11          #define uchar unsigned char
  12          #define uint  unsigned int 
  13          
  14          /*----------------------------控制I/O口设置,根据实际而定---------------*/
  15          #define  RS    P2_0        //RS数据命令选择端,高电平数据,低电平命令
  16          #define  RW    P2_1        //RW读写选择端,高电平读操作,低电平写操作
  17          #define   E    P2_2        //E使能控制端,E高电平跳变为低电平时LCD执行命令
  18          
  19          #define   DATA P1          //数据端口定义
  20          #define   D0   P1_0
  21          #define   D1   P1_1
  22          #define   D2   P1_2
  23          #define   D3   P1_3
  24          #define   D4   P1_4
  25          #define   D5   P1_5
  26          #define   D6   P1_6
  27          #define   D7   P1_7
  28          #define   KEY1 P3_0
  29          #define   KEY2 P3_1
  30          #define   IR_RE P3_2    //外部中断0接口
  31          
  32          /*------------------------------------------------------------------------------*/
  33            bit   k=0;                                      //红外解码判断标志位,为0则为有效信号,为1则为无效
  34            uchar n=0;                                      //用来控制外部中断
  35            uchar code str0[16]=" REMOTE CONTROL";          //开机画面显示
  36            uchar code str1[16]="  IR-CODE: ";
  37            uchar code str2[16]="ERROR";
  38            
  39            uchar *p0=str0;
  40            uchar *p1=str1;
  41            uchar *p2=str2;
  42            delay1ms(uint k);
  43            
  44            void disp(void);                            //红外键值显示程序
  45            uchar  data date[4];                        //date数组为存放地址原码,反码,数据原码,反码 
  46            
  47          /*------------------------LCD忙判断子程序--------------------------------------*/
  48          
  49          void busy()
  50          {
  51   1        RS=0;RW=1;
  52   1        E=0;E=1;DATA=0xff;
  53   1        while(D7);
  54   1      }
  55          
C51 COMPILER V7.06   1602JM                                                                04/27/2009 13:20:53 PAGE 2   

  56          /*----------------------- 写命令子程序-----------------------------------------*/
  57          
  58          void wcom(uchar com)
  59          {
  60   1        busy();
  61   1        RS=0;RW=0;
  62   1        E=1;
  63   1        DATA=com;
  64   1        E=0;
  65   1      }
  66          
  67          /*-------------------------写数据子程序--------------------------------------*/
  68          
  69          void wdata(uchar dat)
  70          {
  71   1        busy();
  72   1        RS=1;RW=0;
  73   1        E=1;
  74   1        DATA=dat;
  75   1        E=0;
  76   1      }
  77          
  78          /*--------------------------读命令子程序-----------------------------------*/
  79           
  80          uchar rcom(void)
  81          {
  82   1        uchar com;
  83   1        busy();
  84   1        RS=0;RW=1;
  85   1        DATA=0xff;
  86   1        E=1;
  87   1        com=DATA;
  88   1        E=0;
  89   1        return(com);
  90   1      
  91   1      }
  92          
  93          /*----------------------------读数据子程序-----------------------------*/
  94          
  95          uchar rdat(void)
  96          {
  97   1        uchar dat;
  98   1        busy();
  99   1        RS=1;RW=1;
 100   1        DATA=0xff;
 101   1        E=1;
 102   1        dat=DATA;
 103   1        E=0;
 104   1        return(dat);
 105   1      }
 106          
 107          /*--------------------------延时1ms程子程序-----------------------*/
 108          delay1000()             
 109          {
 110   1         uint i,j;
 111   1         for(i=0;i<1;i++)
 112   1           for(j=0;j<124;j++)
 113   1           ;
 114   1      }
 115          
 116          /*---------------------------延时882us子程序-----------------------*/
 117          
C51 COMPILER V7.06   1602JM                                                                04/27/2009 13:20:53 PAGE 3   

 118          delay882()
 119          {
 120   1         uint i,j;
 121   1         for(i=0;i<1;i++)                  
 122   1           for(j=0;j<109;j++)
 123   1           ;
 124   1      }
 125          
 126          /*--------------------------延时2400ms程子程序-----------------------*/
 127          
 128          delay2400()                                          
 129          {
 130   1         uint i,j;
 131   1         for(i=0;i<3;i++)          
 132   1           for(j=0;j<99;j++)
 133   1            ;
 134   1      }
 135          
 136          
 137          /*--------------------------以下为初始化程序,由上面子程序组成,根据个人爱好-----------*/
 138          
 139          
 140          /******************************清屏程序***********************************/
 141           void clear()
 142           { wcom (0x01);}
 143          
 144          /******************************归位程序********************************/
 145           void rehome()
 146           { wcom(0x02); }
 147          /*******************8*****888**88888显示模式设定8888888888888888888888*/
 148          
 149          void  mode(bit x)
 150           {
 151   1          if(x==1)wcom(0x38);          //两行5*8 mode 
 152   1              else wcom(0x34);            //一行5*10 mode
 153   1       }
 154          /*------------------------显示开关控制命令----------------------------*/
 155          
 156          void on_off(bit x)
 157          {
 158   1        if(x==1)wcom(0x0f);           //显示开,光标开,光标闪烁
 159   1        else wcom(0x0c);             //显示开,光标关
 160   1      }
 161          
 162          
 163          /*------------------------init初始化组合-------------------------*/
 164          
 165          void init()
 166          {
 167   1        clear();          //清屏
 168   1        mode(1);          //模式设置
 169   1        on_off(1);         //显示设置
 170   1        wcom(0x06);        //移动方式
 171   1      }
 172          
 173          /*---------------------------对字符串的处理------------------------*/
 174          
 175          void strchar(uchar *p)
 176          {
 177   1        while(*p!='\0')
 178   1        {
 179   2          wdata(*p);
C51 COMPILER V7.06   1602JM                                                                04/27/2009 13:20:53 PAGE 4   

 180   2              p++;
 181   2        }
 182   1      }
 183          
 184          /*----------------------------------------------------------*/
 185          /*-----------------------红外解码程序(核心)-----------------*/
 186          /*----------------------------------------------------------*/
 187          
 188          void IR_decode()
 189          {
 190   1        uchar  i,j;
 191   1        while(IR_RE==0);
 192   1        delay2400();
 193   1        if(IR_RE==1)                               //延时2.4ms后如果是高电平则是新码
 194   1        {
 195   2           delay2400();                            //延时4.8ms避开4.5ms的高电平
 196   2               for(i=0;i<4;i++)
 197   2               {
 198   3                 for(j=0;j<8;j++)
 199   3                 {
 200   4                 while(IR_RE==0);                       //等待地址码第1位高电平到来
 201   4                 delay882();                         //延时882ms判断此时引脚电平
 202   4                         ///CY=IR_RE;
 203   4                 if(IR_RE==0)
 204   4                 {       
 205   5                                date[i]>>=1;
 206   5                                date[i]=date[i]&0x7f;                   
 207   5                 }
 208   4                 else if(IR_RE==1)
 209   4                         {
 210   5                                delay1000();
 211   5                                date[i]>>=1;
 212   5                                date[i]=date[i]|0x80;
 213   5                         }
 214   4                      }                                    //1位数据接收结束
 215   3           }                                       //32位二进制码接收结束
 216   2         } 
 217   1      }
 218          
 219          
 220          
 221          /*------------------二进制码转换为压缩型BCD码,并显示---------------*/
 222          
 223          void two_2_bcd(uchar date)
 224          {
 225   1      
 226   1         uchar temp;
 227   1         temp=date;
 228   1         date&=0xf0;
 229   1         date>>=4;                    //右移四位得到高四位码
 230   1         date&=0x0f;                  //与0x0f想与确保高四位为0
 231   1         if(date<=0x09)
 232   1         {
 233   2          // wcom(0xcb);                  
 234   2           wdata(0x30+date);            //lcd显示键值高四位
 235   2         }
 236   1         else
 237   1         {
 238   2           date=date-0x09;
 239   2               //wcom(0xcb);
 240   2               wdata(0x40+date);
 241   2         }
C51 COMPILER V7.06   1602JM                                                                04/27/2009 13:20:53 PAGE 5   

 242   1         date=temp;
 243   1         date&=0x0f;
 244   1         if(date<=0x09)
 245   1         {
 246   2           wdata(0x30+date);            //lcd显示低四位值
 247   2         }
 248   1         else
 249   1         {
 250   2           date=date-0x09;
 251   2               wdata(0x40+date);
 252   2         }
 253   1         wdata(0x48);                 //显示字符'H'
 254   1      } 
 255          
 256          
 257          //////////////////////////////转换程序结束///////////////////////////
 258          
 259          
 260          /*----------------------解码成功后,1602显示键值子程序---------------*/
 261          
 262          void disp()
 263          {
 264   1         uchar date1;
 265   1         date1=date[3]^0xff;               //如果得到的数据原码和数据反码相反
 266   1         if(date[2]==date1)                 //显示键值
 267   1         {  
 268   2         wcom(0xc0);
 269   2            two_2_bcd(date[0]);
 270   2                wdata(0x20);
 271   2                two_2_bcd(date[1]);
 272   2                        wdata(0x20);
 273   2                two_2_bcd(date[2]);
 274   2                        wdata(0x20);
 275   2                two_2_bcd(date[3]);
 276   2         }
 277   1      }
 278          
 279          
 280          /*------------------------外部中断0程序-------------------------*/
 281          /*------------------主要用于处理红外遥控键值--------------------*/
 282          
 283          void int0() interrupt 0
 284          { 
 285   1         uint i;
 286   1         for(i=0;i<4;i++)
 287   1         { 
 288   2           delay1000();
 289   2               if(IR_RE==1){k=~k;}                   //刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序
 290   2         }
 291   1      
 292   1         if(k==0)
 293   1         { 
 294   2         EX0=0;                                //检测到有效信号关中断,防止干扰
 295   2         IR_decode();                          //如果接收到的是有效信号,则调用解码程序
 296   2         disp();                               //解码成功,调用显示程序,显示该键值
 297   2         }
 298   1        EX0=1;                                 //开外部中断,允许新的遥控按键
 299   1      }
 300          
 301          
 302          
 303          /*---------------------------------------------------------------*/
C51 COMPILER V7.06   1602JM                                                                04/27/2009 13:20:53 PAGE 6   

 304          /*           以下为主程序,主要对LCD初始化,开始界面设置         */
 305          /*---------------------------------------------------------------*/
 306          void main(void)
 307          {
 308   1        SP=0x60;                                //堆栈指针
 309   1        TMOD=0x11;                              //定时器模式设置所选为 模式1
 310   1        TH0=0xd8;                               //定时器初值理论为 10ms;
 311   1        TL0=0xf7;                               //实际取d8f7
 312   1        ET0=1;                                  //允许定时器0中断
 313   1        EX0=1;                                  //允许外部中断0,用于检测红外遥控器按键
 314   1        EA=1;                                   //总中断开
 315   1        init();                                 //初始化LCD
 316   1        wcom(0x80);                             //写入字符的地址为第1行第1列
 317   1        strchar(p0);                            //调用显示字符串函数
 318   1        wcom(0xc0);
 319   1        //strchar(p1);
 320   1        while(1);
 321   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    557    ----
   CONSTANT SIZE    =     48    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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