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

📄 display.lst

📁 基于51单片机的源码,内有液晶显示(IIC)接口,还实现串口和定时操作等功能.
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.08   DISPLAY                                                               06/07/2008 20:06:02 PAGE 1   


C51 COMPILER V7.08, COMPILATION OF MODULE DISPLAY
OBJECT MODULE PLACED IN display.OBJ
COMPILER INVOKED BY: D:\PTOOL\Keil\C51\BIN\C51.EXE display.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          #include <intrins.h>
   3          
   4          unsigned char data STATUS;
   5          #define Idle                    0 
   6          #define Receiving               1       
   7          #define Sending                 2
   8          #define Data                    3
   9          
  10          unsigned char data Rx_Count;    
  11          unsigned char data Tx_Count; 
  12          unsigned char data Tx_Length;
  13          unsigned char data Timeout;
  14          unsigned int Count_1ms;
  15          
  16          
  17          code char string[15] ="Welcome you!\r\n";
  18          code char Time[16] = "Time set OK!\r\n";
  19          code char Date[16] = "Date set OK!\r\n";
  20          code char Eorr[16] = "Input data OK!\r\n";
  21          code char Init_Date[7] = "0080320";
  22          code char Init_Time[7] = "1161215"; 
  23          //0 1 2 3 4 5 6 7 8 9
  24          code char LED_NUM[11] = {0x11,0xd7,0x32,0x92,0xd4,0x98,0x18,0xd3,0x10,0x90,0x00};
  25                  
  26          unsigned char data Rx_Buffer[16];
  27          unsigned char data Tx_Buffer[16];
  28          unsigned char data LED_Date[7];
  29          unsigned char data LED_Time[7];
  30          unsigned char data LED_Disp[7];
  31          
  32          sbit Buzzer = P1^0;     //0:响 1:不响
  33          
  34          sbit IIC_CLK = P0^0;
  35          sbit IIC_DI = P0^1;
  36          sbit LED = P0^2;                //0:亮
  37          bit      Flag;
  38          bdata   Key;      
  39          
  40          #define OSC_CLK         (11059200UL)
  41          #define OSC_INST    (12)        //每条指令的时钟周期
  42          #define Time_1ms        (65536-(unsigned int)(OSC_CLK/(OSC_INST * 1085)))
  43          #define TH_1ms          (Time_1ms / 256)
  44          #define TL_1ms          (Time_1ms % 256)
  45          
  46          /****************************************************/
  47          /*硬件初始化*/
  48          /****************************************************/
  49          void Init()  
  50          {
  51   1              TMOD=0x11;    //t0为16位定时器,t1为16位定时器,模式1  GATE C/T M1 M0   
  52   1              SCON=0x50;    //串行口工作在模式1,波特率可变  SM0 SM1 SM2 REN TB8 RB8  TI RI
  53   1              PCON=0;       //SMOD=0  定时器溢出率/32
  54   1      
  55   1              TH0=0xfc;
C51 COMPILER V7.08   DISPLAY                                                               06/07/2008 20:06:02 PAGE 2   

  56   1              TL0=0x17;
  57   1              TR0=1;
  58   1              
  59   1              TH1=TH_1ms;
  60   1              TL1=TL_1ms;
  61   1              TR1=1;
  62   1      
  63   1              TI=0;
  64   1              RI=0;
  65   1      
  66   1              //TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL
  67   1              TR2=0;
  68   1              RCAP2H=0xff;       //T2做波特率发生器
  69   1              RCAP2L=0xdc;
  70   1              RCLK=1;            //接收时钟标志,1->为定时/计算器2为串口接收时钟
  71   1              TCLK=1;                    //发送时钟标志
  72   1              TR2=1;
  73   1      
  74   1              /*开中断*/
  75   1              IP=0x00;    //PS=T0=T1
  76   1              ET0=1;
  77   1              ET1=1;     //1ms定时
  78   1              //ET2=1;
  79   1              ES=1;
  80   1              EA=1;
  81   1      }
  82          /****************************************************/
  83          /*定时器0中断*/
  84          /****************************************************/
  85          void T0_int(void) interrupt 1 using 2
  86          {
  87   1          TL0=0;
  88   1          TH0=0;
  89   1              switch(STATUS)
  90   1              {
  91   2                      case Receiving:       //正在接收数据,进行数据包接收完成超时判定
  92   2                      {
  93   3                              if(Timeout<10)   
  94   3                                      Timeout++;
  95   3                              else
  96   3                              {
  97   4                                      Timeout=0;
  98   4                                      STATUS=Data;    //数据包接收完成,等待处理数据
  99   4                              }
 100   3                              break;
 101   3                      }
 102   2      
 103   2                      case Sending:       //正在发送数据,超时判断,如果超发送不成功释放RS232
 104   2                      {
 105   3                              if(Timeout<100)   
 106   3                                      Timeout++;
 107   3                              else
 108   3                              {
 109   4                                      Timeout=0;
 110   4                                      STATUS=Idle;    //超时释放RS232
 111   4                              }
 112   3                              break;
 113   3                      }
 114   2                      case Idle:
 115   2                      {
 116   3                              Timeout=0;
 117   3                      }
C51 COMPILER V7.08   DISPLAY                                                               06/07/2008 20:06:02 PAGE 3   

 118   2      
 119   2                      default: break;
 120   2              }
 121   1      }
 122          /****************************************************/
 123          /*中断服务程序*/
 124          /****************************************************/
 125          void RS_int(void) interrupt 4 using 3
 126          {
 127   1              if(RI==1)
 128   1              {
 129   2                      RI=0;
 130   2                      switch(STATUS)
 131   2                      {
 132   3                              case Idle:
 133   3                              {
 134   4                                      Timeout=0;      
 135   4                                      Rx_Count=0;
 136   4                                      STATUS=Receiving;     
 137   4                                      break;
 138   4                              }
 139   3                              case Receiving:
 140   3                              {
 141   4                                      Timeout=0;      
 142   4                                      break;
 143   4                              }
 144   3                      }
 145   2                      Rx_Buffer[Rx_Count]=SBUF;
 146   2                      Rx_Count++;
 147   2                      Rx_Count %=16;
 148   2              }
 149   1              if(TI==1)
 150   1              {
 151   2                      TI=0;
 152   2                      if((Tx_Count+1)>=Tx_Length)     /*数据发送完毕*/
 153   2                      {
 154   3                         Tx_Count=0;
 155   3                         //Tx_Length=0;
 156   3                         STATUS=Idle;     
 157   3                         return;
 158   3                      }
 159   2                      else
 160   2                      {       Timeout=0;     //清除定时器
 161   3                              Tx_Count++;
 162   3                              SBUF=Tx_Buffer[Tx_Count];
 163   3                      }
 164   2              
 165   2              }
 166   1      }
 167          /****************************************************/
 168          /*T1 1ms子程序*/
 169          /****************************************************/
 170          void T1_int(void) interrupt 3 using 1
 171          {
 172   1              TR1 = 0;
 173   1          TL1=TL_1ms;   
 174   1          TH1=TH_1ms;  
 175   1              TR1 = 1;
 176   1              Count_1ms ++;
 177   1      
 178   1      }
 179          /****************************************************/
C51 COMPILER V7.08   DISPLAY                                                               06/07/2008 20:06:02 PAGE 4   

 180          /*软件延时子程序*/
 181          /****************************************************/
 182          void deplay()
 183          {
 184   1              unsigned int i;
 185   1              for(i=0;i<=3000;i++)
 186   1              {
 187   2                      _nop_();
 188   2              }
 189   1      }
 190          /****************************************************/
 191          /*LED显示处理子程序*/
 192          /****************************************************/
 193          void LED_Display_Init(void)
 194          {
 195   1              unsigned char i;
 196   1              for(i=0;i<7;i++)
 197   1              {
 198   2                      LED_Date[i]=Init_Date[i];
 199   2                      LED_Time[i]=Init_Time[i];
 200   2              }       
 201   1      }
 202          void LED_display_Date(void)
 203          {
 204   1              unsigned char i;
 205   1              LED_Disp[0] = 0xfc;
 206   1      
 207   1              for(i=1;i<7;i++)
 208   1              {
 209   2                       LED_Disp[i] = LED_NUM[(LED_Date[i])-0x30];
 210   2              }
 211   1      }
 212          void LED_display_Time(void)
 213          {
 214   1              unsigned char i;
 215   1              LED_Disp[0] = 0xfc;
 216   1      
 217   1              for(i=1;i<7;i++)
 218   1              {
 219   2                       LED_Disp[i] = LED_NUM[(LED_Time[i])-0x30];
 220   2              }
 221   1              //LED_Disp[2] = LED_Disp[2] - 0x10;
 222   1              //LED_Disp[4]   = LED_Disp[4] - 0x10;
 223   1      }
 224          /****************************************************/
 225          /*IIC子程序 大约10微秒,最少为5.425微秒*/
 226          /****************************************************/
 227          void delay_IIC(void)
 228          {
 229   1         int x;
 230   1         x++;
 231   1         x++;
 232   1      } 
 233          void writebyte(unsigned char Ndata)
 234          {
 235   1         unsigned char data i;
 236   1         for (i=0;i<8;i++)
 237   1         {
 238   2                      IIC_CLK = 0;
 239   2                      IIC_DI = (bit)(Ndata & 0x01); 
 240   2                      delay_IIC(); 
 241   2                      IIC_CLK = 1; 
C51 COMPILER V7.08   DISPLAY                                                               06/07/2008 20:06:02 PAGE 5   

 242   2                      delay_IIC();
 243   2                      IIC_CLK = 0;
 244   2                      Ndata >>= 1;
 245   2         }
 246   1      }
 247          void write_LED(unsigned char LED_Data0,unsigned char LED_Data1,
 248                                          unsigned char LED_Data2,unsigned char LED_Data3,
 249                                          unsigned char LED_Data4,unsigned char LED_Data5,
 250                                          unsigned char LED_Data6)
 251          {
 252   1              EA=0;
 253   1              writebyte(LED_Data0);
 254   1              writebyte(LED_Data1);
 255   1              writebyte(LED_Data2);
 256   1              writebyte(LED_Data3);
 257   1              writebyte(LED_Data4);
 258   1              writebyte(LED_Data5);
 259   1              writebyte(LED_Data6); 
 260   1              EA=1;
 261   1      }
 262          /****************************************************/
 263          /*RS接收数据处理*/
 264          /****************************************************/
 265          void RS_Data(void)
 266          {
 267   1              unsigned char i;
 268   1              if(Rx_Buffer[0]=='0')
 269   1              {
 270   2                      for(i=1;i<7;i++)
 271   2                      {
 272   3                              if(Rx_Buffer[i]<='9'&&Rx_Buffer[i]>='0')
 273   3                              {
 274   4                                      LED_Date[i] = Rx_Buffer[i];
 275   4                              }
 276   3                              else  LED_Date[i] = '1';
 277   3                      }
 278   2                      for(i=0;i<16;i++)
 279   2                      {
 280   3                              Tx_Buffer[i] = Date[i];
 281   3                      }
 282   2              }
 283   1              else if(Rx_Buffer[0]=='1')
 284   1              {
 285   2                      for(i=1;i<7;i++)
 286   2                      {
 287   3                              if(Rx_Buffer[i]<='9'&&Rx_Buffer[i]>='0')
 288   3                              {
 289   4                                      LED_Time[i] = Rx_Buffer[i];
 290   4                              }
 291   3                              else  LED_Time[i] = '1';
 292   3                      }
 293   2                      for(i=0;i<16;i++)
 294   2                      {
 295   3                              Tx_Buffer[i] = Time[i];
 296   3                      }
 297   2              }
 298   1              else 
 299   1              {
 300   2                      for(i=0;i<16;i++)
 301   2                      {
 302   3                              Tx_Buffer[i] = Eorr[i];
 303   3                      }
C51 COMPILER V7.08   DISPLAY                                                               06/07/2008 20:06:02 PAGE 6   

 304   2              }
 305   1              Tx_Length       = 16;
 306   1      }
 307          /****************************************************/
 308          /*RS接收数据处理*/
 309          /****************************************************/

⌨️ 快捷键说明

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