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

📄 main.lst

📁 单片机开发板配套52个程序(c语言源代码)
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  06/02/2010 22:50:32 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*-----------------------------------------------
   2            名称:遥控器红外解码液晶显示
   3            日期:2009.5
   4            修改:无
   5            内容:
   6          ------------------------------------------------*/
   7          #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
   8          #include<stdio.h>
   9          #include<intrins.h>
  10          
  11          
  12          #define TURE 1
  13          #define FALSE 0
  14          
  15          
  16          sbit IR=P3^2;  //红外接口标志
  17          sbit RS = P2^4;//Pin4
  18          sbit RW = P2^5;//Pin5
  19          sbit E  = P2^6;//Pin6
  20          
  21          #define Data P0//数据端口
  22          
  23          unsigned int hour,minute,second,count;
  24          char code Tab[16]="0123456789ABCDEF";
  25          
  26          char data TimeNum[]="                ";
  27          char data Test1[]="                  ";
  28          
  29          /******************************************************************/
  30          /*                    变量声明                                    */
  31          /******************************************************************/
  32          
  33          unsigned char  irtime;//红外用全局变量
  34          
  35          bit irpro_ok,irok;
  36          unsigned char   IRcord[4];  //处理后的红外码,分别是 客户码,客户码,数据码,数据码反码
  37          unsigned char   irdata[33]; //33个高低电平的时间数据
  38          
  39          /******************************************************************/
  40          /*                    函数声明                                    */
  41          /******************************************************************/
  42          void Ir_work(void);
  43          void Ircordpro(void);
  44          void ShowString (unsigned char line,char *ptr);
  45          /******************************************************************/
  46          /*                    定时器0中断服务函数                         */
  47          /******************************************************************/
  48          
  49          void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
  50          {
  51   1        irtime++;                             //用于计数2个下降沿之间的时间
  52   1      }
  53          
  54          /******************************************************************/
  55          /*                    外部中断0函数                               */
C51 COMPILER V7.06   MAIN                                                                  06/02/2010 22:50:32 PAGE 2   

  56          /******************************************************************/
  57          void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
  58          {
  59   1        static unsigned char  i;             //接收红外信号处理
  60   1        static bit startflag;                //是否开始处理标志位
  61   1      
  62   1       if(startflag)                         
  63   1       {
  64   2         
  65   2          if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
  66   2                  i=0;
  67   2           
  68   2                      irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
  69   2                      irtime=0;
  70   2                      i++;
  71   2                               if(i==33)
  72   2                              {
  73   3                                       irok=1;
  74   3                                       i=0;
  75   3                                      }
  76   2                }
  77   1               
  78   1               else
  79   1                      {irtime=0;startflag=1;}
  80   1      
  81   1      }
  82          
  83          /******************************************************************/
  84          /*                   定时器0初始化                                */
  85          /******************************************************************/
  86          void TIM0init(void)//定时器0初始化
  87          {
  88   1      
  89   1        TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  90   1        TH0=0x00; //重载值
  91   1        TL0=0x00; //初始化值
  92   1        ET0=1;    //开中断
  93   1        TR0=1;    
  94   1      }
  95          /******************************************************************/
  96          /*                   外部中断初始化                               */
  97          /******************************************************************/
  98          void EX0init(void)
  99          {
 100   1       IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
 101   1       EX0 = 1;   //使能外部中断
 102   1       EA = 1;    //开总中断
 103   1      }
 104          /******************************************************************/
 105          /*                    红外键值处理                                */
 106          /******************************************************************/
 107          
 108            void Ir_work(void)        //红外键值散转程序
 109            {
 110   1             
 111   1             TimeNum[5] = Tab[IRcord[0]/16];   //处理客户码并显示
 112   1                 TimeNum[6] = Tab[IRcord[0]%16];
 113   1                 TimeNum[8] = Tab[IRcord[1]/16];   //处理客户码并显示
 114   1                 TimeNum[9] = Tab[IRcord[1]%16];
 115   1                 TimeNum[11] = Tab[IRcord[2]/16];  //处理数据码并显示
 116   1                 TimeNum[12] = Tab[IRcord[2]%16];
 117   1                 TimeNum[14] = Tab[IRcord[3]/16];  //处理数据反码并显示
C51 COMPILER V7.06   MAIN                                                                  06/02/2010 22:50:32 PAGE 3   

 118   1                 TimeNum[15] = Tab[IRcord[3]%16];
 119   1               
 120   1             ShowString(1,TimeNum);//显示处理过后的码值
 121   1                 irpro_ok=0;           //处理完成后清楚标志位
 122   1      
 123   1        }
 124          
 125          /******************************************************************/
 126          /*                    红外解码函数处理                            */
 127          /******************************************************************/
 128          void Ircordpro(void)//红外码值处理函数
 129          { 
 130   1        unsigned char i, j, k;
 131   1        unsigned char cord,value;
 132   1      
 133   1        k=1;
 134   1        for(i=0;i<4;i++)      //处理4个字节
 135   1           {
 136   2            for(j=1;j<=8;j++) //处理1个字节8位
 137   2               {
 138   3                cord=irdata[k];
 139   3                if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
 140   3                          {
 141   4                   value=value|0x80;
 142   4                              }
 143   3                else 
 144   3                          {
 145   4                   value=value;
 146   4                              }
 147   3                if(j<8)
 148   3                          {
 149   4                               value=value>>1;
 150   4                              }
 151   3                 k++;
 152   3               }
 153   2           IRcord[i]=value;
 154   2           value=0;     
 155   2           } irpro_ok=1;//处理完毕标志位置1
 156   1          
 157   1      }
 158          
 159          
 160          /******************************************************************/
 161          /*                    微秒延时函数                                */
 162          /******************************************************************/
 163          void DelayUs(unsigned char us)//delay us
 164          {
 165   1       unsigned char uscnt;
 166   1       uscnt=us>>1;/* Crystal frequency in 12MHz*/
 167   1       while(--uscnt);
 168   1      }
 169          /******************************************************************/
 170          /*                    毫秒函数声明                                */
 171          /******************************************************************/
 172          void DelayMs(unsigned char ms)//delay Ms
 173          {
 174   1       while(--ms)
 175   1         {
 176   2           DelayUs(250);
 177   2           DelayUs(250);
 178   2               DelayUs(250);
 179   2               DelayUs(250);
C51 COMPILER V7.06   MAIN                                                                  06/02/2010 22:50:32 PAGE 4   

 180   2         }
 181   1      }
 182          
 183          /******************************************************************/
 184          /*                   写入命令函数                                 */
 185          /******************************************************************/
 186          void WriteCommand(unsigned char c)
 187          {
 188   1       DelayMs(5);//操作前短暂延时,保证信号稳定
 189   1       E=0;
 190   1       RS=0;
 191   1       RW=0;
 192   1       _nop_();
 193   1       E=1;
 194   1       Data=c;
 195   1       E=0;
 196   1      }
 197          /******************************************************************/
 198          /*                   写入数据函数                                 */
 199          /******************************************************************/
 200          void WriteData(unsigned char c)
 201          {
 202   1       DelayMs(5);  //操作前短暂延时,保证信号稳定
 203   1       E=0;
 204   1       RS=1;
 205   1       RW=0;
 206   1       _nop_();
 207   1       E=1;
 208   1       Data=c;
 209   1       E=0;
 210   1       RS=0;
 211   1      }
 212          /******************************************************************/
 213          /*                   写入字节函数                                 */
 214          /******************************************************************/
 215          void ShowChar(unsigned char pos,unsigned char c)
 216          {
 217   1       unsigned char p;
 218   1       if (pos>=0x10)
 219   1          p=pos+0xb0; //是第二行则命令代码高4位为0xc
 220   1       else 
 221   1          p=pos+0x80; //是第二行则命令代码高4位为0x8
 222   1       WriteCommand (p);//写命令
 223   1       WriteData (c);   //写数据
 224   1      }
 225          /******************************************************************/
 226          /*                   写入字符串函数                               */
 227          /******************************************************************/
 228          void ShowString (unsigned char line,char *ptr)
 229          {
 230   1       unsigned char l,i;
 231   1       l=line<<4;
 232   1       for (i=0;i<16;i++)
 233   1        ShowChar (l++,*(ptr+i));//循环显示16个字符
 234   1      }
 235          /******************************************************************/
 236          /*                   初始化函数                                   */
 237          /******************************************************************/
 238          void InitLcd()
 239          {
 240   1       DelayMs(15);
 241   1       WriteCommand(0x38); //display mode
C51 COMPILER V7.06   MAIN                                                                  06/02/2010 22:50:32 PAGE 5   

 242   1       WriteCommand(0x38); //display mode
 243   1       WriteCommand(0x38); //display mode
 244   1       WriteCommand(0x06); //显示光标移动位置
 245   1       WriteCommand(0x0c); //显示开及光标设置
 246   1       WriteCommand(0x01); //显示清屏
 247   1      
 248   1      }
 249          
 250          
 251          /******************************************************************/
 252          /*                   主函数                                       */
 253          /******************************************************************/
 254          
 255          void main(void)
 256          {
 257   1       EX0init(); //初始化外部中断
 258   1       TIM0init();//初始化定时器
 259   1      
 260   1       InitLcd(); //初始化液晶
 261   1       DelayMs(15);
 262   1      
 263   1       sprintf(Test1,"  haixiang MCU   ");  //显示第一行固定信息
 264   1       ShowString(0,Test1);
 265   1      
 266   1       sprintf(TimeNum,"Code            ");//显示第二行固定信息
 267   1       ShowString(1,TimeNum);
 268   1      
 269   1      
 270   1       while(1)//主循环
 271   1         {
 272   2          if(irok)                        //如果接收好了进行红外处理
 273   2                {   
 274   3                 Ircordpro();
 275   3                 irok=0;
 276   3                }
 277   2      
 278   2          if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
 279   2                {
 280   3                 Ir_work();
 281   3                }
 282   2         }
 283   1      }
 284            


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    477    ----
   CONSTANT SIZE    =     51    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     83       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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