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

📄 main.lst

📁 51实例大全
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  06/16/2010 00:46:43 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\obj\main.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND PRINT(.\obj\main.lst) OBJECT(.\obj\main.ob
                    -j)

stmt level    source

   1          /*-----------------------------------------------
   2            名称:DS1302时钟数码管显示
   3            论坛:www.doflye.net
   4            编写:shifang
   5            日期:2009.5
   6            修改:无
   7            内容:DS1302实时时钟数码管显示,只显示时间。并通过4个按键加减小时、分钟,其他参数调节自行添加
   8                  
   9          ------------------------------------------------*/
  10          #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  11          #include "ds1302.h"
  12          
  13          #define KeyPort P3 //定义按键端口
  14          
  15          #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
  16          
  17          sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
  18          sbit LATCH2=P2^3;//                 位锁存
  19          
  20          bit ReadTimeFlag;//定义读时间标志
  21          
  22          unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  23          unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位
             -码
  24          unsigned char TempData[8]; //存储显示值的全局变量
  25          
  26          void DelayUs2x(unsigned char t);//us级延时函数声明 
  27          void DelayMs(unsigned char t); //ms级延时
  28          void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
  29          unsigned char KeyScan(void);//键盘扫描
  30          void Init_Timer0(void);//定时器初始化
  31          /*------------------------------------------------
  32                              主函数
  33          ------------------------------------------------*/
  34          void main (void)
  35          {
  36   1      unsigned char num;                  
  37   1      
  38   1      Init_Timer0();
  39   1      Ds1302_Init();
  40   1      while (1)         //主循环
  41   1        {
  42   2      
  43   2      
  44   2       num=KeyScan();
  45   2       switch(num)
  46   2             {
  47   3                  case 1:time_buf1[4]++;if(time_buf1[4]==24)time_buf1[4]=0;     //正常时间 小时 加1
  48   3                    Ds1302_Write_Time();break;
  49   3                      case 2:time_buf1[4]--;if(time_buf1[4]==255)time_buf1[4]=23;   //正常时间 小时减1
  50   3                        Ds1302_Write_Time();break;
  51   3                      case 3:time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5]=0;     //分加1
  52   3                        Ds1302_Write_Time();break;
  53   3                      case 4:time_buf1[5]--;if(time_buf1[5]==255)time_buf1[5]=59;  //分减1
C51 COMPILER V7.06   MAIN                                                                  06/16/2010 00:46:43 PAGE 2   

  54   3                        Ds1302_Write_Time();break;
  55   3                      default:break;
  56   3                 }
  57   2      if(ReadTimeFlag==1)
  58   2      {
  59   3        ReadTimeFlag=0;
  60   3        Ds1302_Read_Time();
  61   3       //
  62   3       TempData[0]=dofly_DuanMa[time_buf1[4]/10];     //时            //数据的转换,因我们采用数码管0~9的显示,将数据分开
  63   3       TempData[1]=dofly_DuanMa[time_buf1[4]%10];
  64   3       TempData[2]=0x40;                                                      //加入"-"
  65   3       TempData[3]=dofly_DuanMa[time_buf1[5]/10]; //分
  66   3       TempData[4]=dofly_DuanMa[time_buf1[5]%10];
  67   3       TempData[5]=0x40;
  68   3       TempData[6]=dofly_DuanMa[time_buf1[6]/10]; //秒
  69   3       TempData[7]=dofly_DuanMa[time_buf1[6]%10];     
  70   3      
  71   3       }      
  72   2        }
  73   1      }
  74          /*------------------------------------------------
  75           uS延时函数,含有输入参数 unsigned char t,无返回值
  76           unsigned char 是定义无符号字符变量,其值的范围是
  77           0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  78           长度如下 T=tx2+5 uS 
  79          ------------------------------------------------*/
  80          void DelayUs2x(unsigned char t)
  81          {   
  82   1       while(--t);
  83   1      }
  84          /*------------------------------------------------
  85           mS延时函数,含有输入参数 unsigned char t,无返回值
  86           unsigned char 是定义无符号字符变量,其值的范围是
  87           0~255 这里使用晶振12M,精确延时请使用汇编
  88          ------------------------------------------------*/
  89          void DelayMs(unsigned char t)
  90          {
  91   1           
  92   1       while(t--)
  93   1       {
  94   2           //大致延时1mS
  95   2           DelayUs2x(245);
  96   2               DelayUs2x(245);
  97   2       }
  98   1      }
  99          /*------------------------------------------------
 100           显示函数,用于动态扫描数码管
 101           输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
 102           如输入0表示从第一个显示。
 103           Num表示需要显示的位数,如需要显示99两位数值则该值输入2
 104          ------------------------------------------------*/
 105          void Display(unsigned char FirstBit,unsigned char Num)
 106          {
 107   1            static unsigned char i=0;
 108   1                
 109   1      
 110   1                 DataPort=0;   //清空数据,防止有交替重影
 111   1             LATCH1=1;     //段锁存
 112   1             LATCH1=0;
 113   1      
 114   1             DataPort=dofly_WeiMa[i+FirstBit]; //取位码 
 115   1             LATCH2=1;     //位锁存
C51 COMPILER V7.06   MAIN                                                                  06/16/2010 00:46:43 PAGE 3   

 116   1             LATCH2=0;
 117   1      
 118   1             DataPort=TempData[i]; //取显示数据,段码
 119   1             LATCH1=1;     //段锁存
 120   1             LATCH1=0;
 121   1             
 122   1                 i++;
 123   1             if(i==Num)
 124   1                    i=0;
 125   1      
 126   1      
 127   1      }
 128          /*------------------------------------------------
 129                              定时器初始化子程序
 130          ------------------------------------------------*/
 131          void Init_Timer0(void)
 132          {
 133   1       TMOD |= 0x01;    //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                 
 134   1       //TH0=0x00;          //给定初值
 135   1       //TL0=0x00;
 136   1       EA=1;            //总中断打开
 137   1       ET0=1;           //定时器中断打开
 138   1       TR0=1;           //定时器开关打开
 139   1      }
 140          /*------------------------------------------------
 141                           定时器中断子程序
 142          ------------------------------------------------*/
 143          void Timer0_isr(void) interrupt 1 
 144          {
 145   1       static unsigned int num;
 146   1       TH0=(65536-2000)/256;            //重新赋值 2ms
 147   1       TL0=(65536-2000)%256;
 148   1       
 149   1       Display(0,8);       // 调用数码管扫描
 150   1       num++;
 151   1       if(num==50)        //大致100ms
 152   1         {
 153   2          num=0;
 154   2          ReadTimeFlag=1; //读标志位置1
 155   2              }
 156   1      }
 157          
 158          /*------------------------------------------------
 159          按键扫描函数,返回扫描键值
 160          ------------------------------------------------*/
 161          unsigned char KeyScan(void)
 162          {
 163   1       unsigned char keyvalue;
 164   1       if(KeyPort!=0xff)
 165   1         {
 166   2          DelayMs(10);
 167   2          if(KeyPort!=0xff)
 168   2                 {
 169   3                  keyvalue=KeyPort;
 170   3                  while(KeyPort!=0xff);
 171   3                      switch(keyvalue)
 172   3                      {
 173   4                       case 0xfe:return 1;break;
 174   4                       case 0xfd:return 2;break;
 175   4                       case 0xfb:return 3;break;
 176   4                       case 0xf7:return 4;break;
 177   4                       case 0xef:return 5;break;
C51 COMPILER V7.06   MAIN                                                                  06/16/2010 00:46:43 PAGE 4   

 178   4                       case 0xdf:return 6;break;
 179   4                       case 0xbf:return 7;break;
 180   4                       case 0x7f:return 8;break;
 181   4                       default:return 0;break;
 182   4                      }
 183   3                }
 184   2         }
 185   1         return 0;
 186   1      }
 187          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    379    ----
   CONSTANT SIZE    =     18    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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