IRLCD.LST
上传用户:taysgs
上传日期:2021-07-28
资源大小:53k
文件大小:12k
源码类别:

单片机开发

开发平台:

HTML/CSS

  1. C51 COMPILER V7.02b   IRLCD                                                                12/27/2009 13:36:54 PAGE 1   
  2. C51 COMPILER V7.02b, COMPILATION OF MODULE IRLCD
  3. OBJECT MODULE PLACED IN IRLCD.OBJ
  4. COMPILER INVOKED BY: D:ProgromKeilC51BINC51.EXE IRLCD.C BROWSE DEBUG OBJECTEXTEND
  5. stmt level    source
  6.    1          
  7.    2          /********************************************************************************
  8.    3          *  描述:                                                                       *
  9.    4          *          lcd1602显示 遥控键值读取器                                          *
  10.    5          *         lcd1602显示 遥控器接p3.2                                             *
  11.    6          *          喇叭接p1.5  继电器接p1.4                                            *
  12.    7          *         17(40h)键按下,继电器吸合。19(04h)键按下,继电器关闭。               *
  13.    8          *       连接方法:使用红外功能时 J1跳线短接                                                               
  14.              -           *
  15.    9          ********************************************************************************/
  16.   10          
  17.   11          #include <reg51.h>
  18.   12          #include <intrins.h>
  19.   13          
  20.   14          #define uchar unsigned char
  21.   15          #define uint  unsigned int
  22.   16          
  23.   17          uchar LCD_ID_1[16] = {"Red Control"};
  24.   18          uchar LCD_ID_2[16] = {"IR CODE:--H"};
  25.   19          
  26.   20          void delay(uchar x);  //x*0.14MS
  27.   21          void delay1(int ms);
  28.   22          void beep();
  29.   23          
  30.   24          sbit IRIN = P3^3;         //红外接收器数据线
  31.   25          sbit BEEP = P1^5;         //蜂鸣器驱动线
  32.   26          sbit RELAY= P1^4;         //继电器驱动线
  33.   27          
  34.   28          uchar IRCOM[7];
  35.   29          
  36.   30          sbit E=P2^7;            //1602使能引脚
  37.   31          sbit RW=P2^6;           //1602读写引脚  
  38.   32          sbit RS=P2^5;           //1602数据/命令选择引脚
  39.   33          
  40.   34          
  41.   35          /********************************************************************
  42.   36          * 名称 : delay()
  43.   37          * 功能 : 延时,延时时间大概为140US。
  44.   38          * 输入 : 无
  45.   39          * 输出 : 无
  46.   40          ***********************************************************************/
  47.   41          
  48.   42          void Delay2()
  49.   43          {
  50.   44   1              int i,j;
  51.   45   1              for(i=0; i<=10; i++)
  52.   46   1              for(j=0; j<=2; j++)
  53.   47   1      ;
  54.   48   1      }
  55.   49          
  56.   50          /********************************************************************
  57.   51          * 名称 : Convert(uchar In_Date)
  58.   52          * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
  59.   53          * 输入 : 1602资料上的值
  60.   54          * 输出 : 送到1602的值
  61. C51 COMPILER V7.02b   IRLCD                                                                12/27/2009 13:36:54 PAGE 2   
  62.   55          ***********************************************************************/
  63.   56          uchar Convert(uchar In_Date)
  64.   57          {
  65.   58   1          uchar i, Out_Date = 0, temp = 0;
  66.   59   1          for(i=0; i<8; i++)
  67.   60   1          {
  68.   61   2              temp = (In_Date >> i) & 0x01;
  69.   62   2              Out_Date |= (temp << (7 - i));
  70.   63   2          }
  71.   64   1          return Out_Date;
  72.   65   1      }
  73.   66          
  74.   67          /********************************************************************
  75.   68          * 名称 : enable(uchar del)
  76.   69          * 功能 : 1602命令函数
  77.   70          * 输入 : 输入的命令值
  78.   71          * 输出 : 无
  79.   72          ***********************************************************************/
  80.   73          
  81.   74          void enable(uchar del)
  82.   75          {
  83.   76   1              P0 = Convert(del);
  84.   77   1              RS = 0;
  85.   78   1              RW = 0;
  86.   79   1              E = 0;
  87.   80   1              Delay2();
  88.   81   1              E = 1;
  89.   82   1              Delay2();
  90.   83   1      }
  91.   84          
  92.   85          /********************************************************************
  93.   86          * 名称 : write(uchar del)
  94.   87          * 功能 : 1602写数据函数
  95.   88          * 输入 : 需要写入1602的数据
  96.   89          * 输出 : 无
  97.   90          ***********************************************************************/
  98.   91          
  99.   92          void write(uchar del)
  100.   93          {
  101.   94   1              P0 = Convert(del);
  102.   95   1              RS = 1;
  103.   96   1              RW = 0;
  104.   97   1              E = 0;
  105.   98   1              Delay2();
  106.   99   1              E = 1;
  107.  100   1              Delay2();
  108.  101   1      }
  109.  102          
  110.  103          /********************************************************************
  111.  104          * 名称 : L1602_init()
  112.  105          * 功能 : 1602初始化,请参考1602的资料
  113.  106          * 输入 : 无
  114.  107          * 输出 : 无
  115.  108          ***********************************************************************/
  116.  109          void L1602_init(void)
  117.  110          {
  118.  111   1              enable(0x01);
  119.  112   1              enable(0x38);
  120.  113   1              enable(0x0c);
  121.  114   1              enable(0x06);
  122.  115   1              enable(0xd0);
  123.  116   1      }
  124. C51 COMPILER V7.02b   IRLCD                                                                12/27/2009 13:36:54 PAGE 3   
  125.  117          
  126.  118          /********************************************************************
  127.  119          * 名称 : L1602_char(uchar hang,uchar lie,char sign)
  128.  120          * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
  129.  121                           L1602_char(1,5,'b')
  130.  122          * 输入 : 行,列,需要输入1602的数据
  131.  123          * 输出 : 无
  132.  124          ***********************************************************************/
  133.  125          void L1602_char(uchar hang,uchar lie,char sign)
  134.  126          {
  135.  127   1              uchar a;
  136.  128   1              if(hang == 1) a = 0x80;
  137.  129   1              if(hang == 2) a = 0xc0;
  138.  130   1              a = a + lie - 1;
  139.  131   1              enable(a);
  140.  132   1              write(sign);
  141.  133   1      }
  142.  134          
  143.  135          /********************************************************************
  144.  136          * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
  145.  137          * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  146.  138                           L1602_string(1,5,"ab cd ef;")
  147.  139          * 输入 : 行,列,需要输入1602的数据
  148.  140          * 输出 : 无
  149.  141          ***********************************************************************/
  150.  142          void L1602_string(uchar hang,uchar lie,uchar *p)
  151.  143          {
  152.  144   1              uchar a;
  153.  145   1              if(hang == 1) a = 0x80;
  154.  146   1              if(hang == 2) a = 0xc0;
  155.  147   1              a = a + lie - 1;
  156.  148   1              enable(a);
  157.  149   1              while(1)
  158.  150   1              {
  159.  151   2                      if(*p == '') break;
  160.  152   2                      write(*p);
  161.  153   2                      p++;
  162.  154   2              }
  163.  155   1      }
  164.  156          
  165.  157          /*******************************************************************/
  166.  158          main()
  167.  159          {
  168.  160   1       
  169.  161   1          IE = 0x84;                 //允许总中断中断,使能 INT1 外部中断
  170.  162   1          TCON = 0x10;               //触发方式为脉冲负边沿触发
  171.  163   1          
  172.  164   1          IRIN=1;                    //I/O口初始化
  173.  165   1          BEEP=1;
  174.  166   1          RELAY=1; 
  175.  167   1              
  176.  168   1          delay1(10);                 //延时
  177.  169   1          L1602_init();               //初始化LCD             
  178.  170   1              L1602_string(1, 1, LCD_ID_1);
  179.  171   1              L1602_string(2, 1, LCD_ID_2);
  180.  172   1         while(1)     ;
  181.  173   1      
  182.  174   1      } //end main
  183.  175          /**********************************************************/
  184.  176          void IR_IN() interrupt 2 using 0
  185.  177          {
  186.  178   1        unsigned char j,k,N=0;
  187. C51 COMPILER V7.02b   IRLCD                                                                12/27/2009 13:36:54 PAGE 4   
  188.  179   1           EX1 = 0;   
  189.  180   1               delay(15);
  190.  181   1               if (IRIN==1) 
  191.  182   1           { EX1 =1;
  192.  183   2                 return;
  193.  184   2                } 
  194.  185   1                                 //确认IR信号出现
  195.  186   1        while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
  196.  187   1          {delay(1);}
  197.  188   1      
  198.  189   1       for (j=0;j<4;j++)         //收集四组数据
  199.  190   1       { 
  200.  191   2        for (k=0;k<8;k++)        //每组数据有8位
  201.  192   2        {
  202.  193   3         while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  203.  194   3           {delay(1);}
  204.  195   3          while (!IRIN)          //等 IR 变为高电平
  205.  196   3           {delay(1);}
  206.  197   3           while (IRIN)           //计算IR高电平时长
  207.  198   3            {
  208.  199   4          delay(1);
  209.  200   4          N++;           
  210.  201   4          if (N>=30)
  211.  202   4               { EX1=1;
  212.  203   5               return;}                  //0.14ms计数过长自动离开。
  213.  204   4            }                        //高电平计数完毕                
  214.  205   3           IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
  215.  206   3           if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
  216.  207   3           N=0;
  217.  208   3        }//end for k
  218.  209   2       }//end for j
  219.  210   1         
  220.  211   1         if (IRCOM[2]!=~IRCOM[3])
  221.  212   1         { EX1=1;
  222.  213   2           return; }
  223.  214   1      
  224.  215   1         IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
  225.  216   1         IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
  226.  217   1      
  227.  218   1         if(IRCOM[5]>9)
  228.  219   1          { IRCOM[5]=IRCOM[5]+0x37;}
  229.  220   1         else
  230.  221   1                IRCOM[5]=IRCOM[5]+0x30;
  231.  222   1      
  232.  223   1         if(IRCOM[6]>9)
  233.  224   1          { IRCOM[6]=IRCOM[6]+0x37;}
  234.  225   1         else
  235.  226   1                IRCOM[6]=IRCOM[6]+0x30;
  236.  227   1      //////////////////////////
  237.  228   1      L1602_char(2,10,IRCOM[5]);
  238.  229   1      L1602_char(2,9,IRCOM[6]);
  239.  230   1           //beep();
  240.  231   1           EX1 = 1; 
  241.  232   1      } 
  242.  233          
  243.  234          /**********************************************************/
  244.  235          void beep()
  245.  236          {
  246.  237   1        unsigned char i;
  247.  238   1        for (i=0;i<100;i++)
  248.  239   1         {
  249.  240   2         delay(4);
  250. C51 COMPILER V7.02b   IRLCD                                                                12/27/2009 13:36:54 PAGE 5   
  251.  241   2         BEEP=!BEEP;                 //BEEP取反
  252.  242   2         } 
  253.  243   1        BEEP=1;                      //关闭蜂鸣器
  254.  244   1      }
  255.  245          /**********************************************************/
  256.  246          void delay(unsigned char x)    //x*0.14MS
  257.  247          {
  258.  248   1       unsigned char i;
  259.  249   1        while(x--)
  260.  250   1       {
  261.  251   2        for (i = 0; i<13; i++) {}
  262.  252   2       }
  263.  253   1      }
  264.  254          
  265.  255          /**********************************************************/
  266.  256          void delay1(int ms)
  267.  257          {
  268.  258   1       unsigned char y;
  269.  259   1        while(ms--)
  270.  260   1       {
  271.  261   2        for(y = 0; y<250; y++)
  272.  262   2        {
  273.  263   3         _nop_();
  274.  264   3         _nop_();
  275.  265   3         _nop_();
  276.  266   3         _nop_();
  277.  267   3        }
  278.  268   2       }
  279.  269   1      }
  280.  270          
  281.  271          
  282. MODULE INFORMATION:   STATIC OVERLAYABLE
  283.    CODE SIZE        =    562    ----
  284.    CONSTANT SIZE    =   ----    ----
  285.    XDATA SIZE       =   ----    ----
  286.    PDATA SIZE       =   ----    ----
  287.    DATA SIZE        =     39       8
  288.    IDATA SIZE       =   ----    ----
  289.    BIT SIZE         =   ----    ----
  290. END OF MODULE INFORMATION.
  291. C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)