1602jm.lst

来自「本程序主要是遥控器解码和1602驱动程序」· LST 代码 · 共 358 行

LST
358
字号
C51 COMPILER V8.02   1602JM                                                                10/12/2007 11:12:46 PAGE 1   


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

line level    source

   1          //   本程序主要是遥控器解码和1602驱动程序
   2          //-------------------------------------------------------
   3          //   LCD1602   IR-DECODE
   4          //   writed by nxp---2006.12.29
   5          //-------------------------------------------------------
   6          //   连线表:  CPU=89S52
   7          //   SysClock=12MHz
   8          //   LCD:  1602
   9          //   功能:解码红外遥控器
  10          //   遥控器芯片:tc9012-011
  11              
  12          
  13          #include <at89x52.h>
  14          
  15          #define uchar unsigned char
  16          #define uint  unsigned int 
  17          
  18          /*----------------------------控制I/O口设置,根据实际而定---------------*/
  19          #define  RS    P3_0        //RS数据命令选择端,高电平数据,低电平命令
  20          #define  RW    P3_1        //RW读写选择端,高电平读操作,低电平写操作
  21          #define   E    P2_2        //E使能控制端,E高电平跳变为低电平时LCD执行命令
  22          
  23          #define   DATA P0          //数据端口定义
  24          #define   D0   P0_0
  25          #define   D1   P0_1
  26          #define   D2   P0_2
  27          #define   D3   P0_3
  28          #define   D4   P0_4
  29          #define   D5   P0_5
  30          #define   D6   P0_6
  31          #define   D7   P0_7
  32          #define   KEY1 P1_0
  33          #define   KEY2 P1_1
  34          #define   IR_RE P3_2
  35          /*------------------------------------------------------------------------------*/
  36            bit   k=0;                                      //红外解码判断标志位,为0则为有效信号,为1则为无效
  37            uchar n=0;                                      //用来控制外部中断
  38            uchar code str0[16]=" REMOTE CONTROL";          //开机画面显示
  39            uchar code str1[16]="  IR-CODE: ";
  40            uchar code str2[16]="ERROR";
  41            
  42            uchar *p0=str0;
  43            uchar *p1=str1;
  44            uchar *p2=str2;
  45            delay1ms(uint k);
  46            
  47            void disp(void);                            //红外键值显示程序
  48            uchar  data date[4];                        //date数组为存放地址原码,反码,数据原码,反码 
  49            
  50          /*------------------------LCD忙判断子程序--------------------------------------*/
  51          
  52          void busy()
  53          {
  54   1        RS=0;RW=1;
  55   1        E=0;E=1;DATA=0xff;
C51 COMPILER V8.02   1602JM                                                                10/12/2007 11:12:46 PAGE 2   

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

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

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

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

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