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

📄 led时钟.lst

📁 简单实现电磁炉定时,使上班族们拥有自己的时间
💻 LST
字号:
C51 COMPILER V7.06   LED蔩钟                                                               06/10/2008 10:57:17 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE LED蔩钟
OBJECT MODULE PLACED IN LED时钟.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE LED时钟.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <REG51.H>
   2          #include "ds1302.h"                     //包含DS1302头文件
   3          #include "ds18b20.h"
   4          #define leddata P0                      //定义LED数据口
   5          #define sec 0x80                        //1302秒寄存器地址
   6          #define min 0x82                        //1302分寄存器地址
   7          #define hou 0x84                        //1302时寄存器地址
   8          #define read 0x01                       //读操作,因为读的时候地址要加1,使最低位为1
   9          sbit MODE=P3^4;                         //按键定义,下同
  10          sbit SET=P3^5;
  11          sbit UP=P3^6;
  12          sbit DOWN=P3^7;
  13          sbit led0=P2^0;                         //LED位选,因为布线不是按顺序布的,程序定义一下就可以了,下同
  14          sbit led1=P2^3;
  15          sbit led2=P2^7;
  16          sbit led3=P2^4;
  17          sbit led4=P2^6;
  18          sbit led5=P2^5;
  19          //**************函数声明*****************
  20          void delays(unsigned char);
  21          void display(void);
  22          void Scan_Key(void);
  23          void id_case1_key();
  24          void Set_id(unsigned char ,unsigned char);
  25          //*************变量定义******************
  26          unsigned char id=0,timecount,re_disp=0;         //定义用到的变量,id为调整模式用,不为0时表示调整模式,调整哪个量
             -由id值确定
  27                                                                                                  //timecount用于500ms定时记数,时间到取反flag标志位,re_disp记数200次共10s,调整状态下按键无操作
             -10s自动返回正常显示状态
  28          bit hour,minute,second,flag;                            //定义位变量,hour,minute,second分别为调整时闪烁标志位,flag 500ms取反一次
             -,调整位闪烁及冒号闪烁用
  29          unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60};      //LED码表,根据硬件修改
  30          unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x11,0x06,0x04};                                         //初始化1302时用到的初始化数据
  31                                                      //                          秒  分钟 小时  日   月   年  星期
  32          void t0(void) interrupt 1 using 0                       //中断处理程序,主要用于取反标志位,返回正常显示状态
  33          {
  34   1              TH0=(65535-50000)/256; //50ms定时
  35   1              TL0=(65535-50000)%256;  
  36   1              timecount++;re_disp++;
  37   1              if(timecount>9)
  38   1                      {
  39   2                              timecount=0;
  40   2                      flag=~flag;
  41   2                      }
  42   1              if(re_disp>200){re_disp=0;if(id)id=0;}
  43   1      }
  44          void delays(unsigned char k)                            //延时函数
  45          {
  46   1              unsigned char i,j;
  47   1              for(i=0;i<k;i++)
  48   1                      for(j=0;j<50;j++);
  49   1      }
  50          void display(void)                                                      //显示函数
  51          {
  52   1              if(flag&hour)                                                   //如hour为1表示调整时,flag为1时不显示
C51 COMPILER V7.06   LED蔩钟                                                               06/10/2008 10:57:17 PAGE 2   

  53   1                      {
  54   2                              led0=0;leddata=0xff;delays(10);led0=1;
  55   2                              led1=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led1=1;       //&~((unsigned char)~flag<<6)该句根据
             -flag的值决定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
  56   2                      }
  57   1              else                                                                    //flag为0时显示,产生闪烁效果,下同
  58   1                      {
  59   2                              leddata=tab[Read1302(hou|read)/16];led0=0;delays(10);led0=1;
  60   2                              leddata=tab[Read1302(hou|read)%16]&~((unsigned char)~flag<<6);led1=0;delays(10);led1=1;
  61   2                      }
  62   1              if(flag&minute)
  63   1                      {
  64   2                              led2=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led2=1;
  65   2                              led3=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led3=1;
  66   2                      }
  67   1              else
  68   1                      {
  69   2                              leddata=tab[Read1302(min|read)/16]&~((unsigned char)~flag<<6);led2=0;delays(10);led2=1;
  70   2                              leddata=tab[Read1302(min|read)%16]&~((unsigned char)~flag<<6);led3=0;delays(10);led3=1;
  71   2                      }
  72   1              if(flag&second)
  73   1                      {
  74   2                              led4=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led4=1;
  75   2                              led5=0;leddata=0xff;delays(10);led5=1;
  76   2                      }
  77   1              else
  78   1                      {
  79   2                              leddata=tab[Read1302(sec|read)/16]&~((unsigned char)~flag<<6);led4=0;delays(10);led4=1;
  80   2                              leddata=tab[Read1302(sec|read)%16];led5=0;delays(10);led5=1;
  81   2                      }
  82   1      }
  83          void Scan_Key(void)                             //键盘检测函数
  84          {
  85   1              display();                                      //程序开头调用显示函数
  86   1              if(!SET)                                        
  87   1                      {
  88   2                              while(!SET)display();   //等待按键释放,如一直按下一直调用显示函数,防止显示中断
  89   2                              re_disp=0;                              //清除记数,重新开始10s定时
  90   2                              id++;if(id>3)id=0;              //id加1,后面根据id值对应调整项目
  91   2                      }
  92   1              if(id==0){hour=0;minute=0;second=0;}    //根据id值跳到相应处理函数
  93   1              if(id==1){hour=1;id_case1_key();}               //id为1,选择调整小时位,闪烁标志位置1,然后跳到键盘处理函数,下同
  94   1              if(id==2){hour=0;minute=1;id_case1_key();}
  95   1              if(id==3){minute=0;second=1;id_case1_key();}
  96   1      }
  97          void id_case1_key(void)                                         //键盘处理函数,只有按下set键时才会进入,
  98          {
  99   1              display();                                                              
 100   1              if (!DOWN) //减少
 101   1              {
 102   2                      while(!DOWN)display();                  //等待按键释放,如一直按下一直调用显示函数,防止显示中断
 103   2                              re_disp=0;                                              //清除记数,重新开始10s定时
 104   2                              Set_id(id,0);                                   //跳到加减判断函数,下同,
 105   2              }
 106   1              if (!UP)  //增加
 107   1              {
 108   2                      while(!UP)display();
 109   2                              re_disp=0;
 110   2                              Set_id(id,1);    
 111   2              }
 112   1      }
 113          
C51 COMPILER V7.06   LED蔩钟                                                               06/10/2008 10:57:17 PAGE 3   

 114          //根据选择调整相应项目并写入DS1302
 115          void Set_id(unsigned char sel,unsigned char sel_1)              //执行调整项目的函数
 116          {
 117   1              signed char max,mini,address,item;                                      
 118   1              if(sel==1)  {address=hou; max=23;mini=0;}    //小时     //根据id值确定要调整的项,并确定调整上下限,下同
 119   1              if(sel==2)  {address=min; max=59;mini=0;}    //分钟
 120   1              if(sel==3)  {address=sec; max=0; mini=0;}    //秒
 121   1              item=Read1302(address|read)/16*10+Read1302(address|read)%16;    //从相应的地址读取当前数据并转换为十进制
 122   1              if (sel_1==0) item--;  else item++;                                                             //确定是对项目加还是减,并对越限处理
 123   1              if(item>max) item=mini;   
 124   1              if(item<mini) item=max;
 125   1              Write1302(0x8e,0x00);//允许写操作       
 126   1              Write1302(address,item/10*16+item%10);                                                  //将调整结果转换成压缩BCD码重新写入1302
 127   1              Write1302(0x8e,0x80);//写保护,禁止写操作  
 128   1      }
 129          void main()                                                     //主函数
 130                  {  
 131   1                      TMOD=0x01;                                      //初始化定时器
 132   1                      TH0=(65535-50000)/256;
 133   1                      TL0=(65535-50000)%256;
 134   1                      EA=1;
 135   1                      ET0=1;
 136   1                      TR0=1; 
 137   1                      Write1302(0x90,0xa0);//关闭充电二级管,不能对后备电池进行充电,防止发胀,原来的程序是打开的请关闭 
 138   1                      Write1302(0x8e,0x80);//写保护,禁止写操作 
 139   1                      if(!UP&!DOWN)Set1302(inittime);                 //如果同时按下UP和DOWN键则初始化1302,该语句在while(1)前,只执行一次,
             -需要复位,防止误操作
 140   1                      while(1)
 141   1                              {  
 142   2                                      Scan_Key();                                             //主程序一直调用键盘检测函数即可
 143   2                              }
 144   1      }


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


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

⌨️ 快捷键说明

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