ht1380_time3.lst

来自「自己的平时一些制作 现在整理一下 与大家一起分享」· LST 代码 · 共 347 行

LST
347
字号
C51 COMPILER V7.01  HT1380_TIME3                                                           07/13/2007 19:36:37 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE HT1380_TIME3
OBJECT MODULE PLACED IN ht1380_time3.OBJ
COMPILER INVOKED BY: D:\SOFTWARE\kkk\C51\BIN\C51.EXE ht1380_time3.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg51.h>
   2          
   3          /*****定义ht1380芯片接口********/
   4          // ht1380 ht1380_sclk --->P1.0
   5          // ht1380 I/O  --->P1.1
   6          // ht1380 ht1380_rest --->P1.2
   7          sbit ht1380_sclk=P1^0;
   8          sbit ht1380_data=P1^1;
   9          sbit ht1380_rest=P1^2;
  10          sbit beep=P1^7;
  11          bit flag=0;
  12          
  13          /**********定义两个全局变量*********/
  14          //定义数组变量用于存放四个数码管的显示数据
  15          //定义number存放动态显示是第几个数码管
  16          unsigned char d[4],number;
  17          
  18          /*********定义时间变量年月日时分秒***********/
  19          unsigned char year,month,day,hour,minute,second,callhour,callminute,callsecond,rehour,reminute,resecond;
  20          /**********定义冒号变量 distime=1 是数码管冒号显示出来************/
  21          bit distime;
  22          
  23          /*******与数码管相关的两个表*********/
  24          //一个显示译码表 //注:这里表比前一个多了一个值,最后一个数代表空显示
  25          //一个使能译码表
  26          unsigned char code tab[11]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0};
  27          unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
  28          
  29          /******延时程序***********/
  30          void delay(unsigned char dy)
  31          {
  32   1         while(--dy);
  33   1      }
  34          
  35          /******按键接口描述********/
  36          //左第一 二 三 四 个按键分别对应于 P2.7 P2.6 P2.5 P2.4 
  37          //左第一个按键键值为1 
  38          //左第二个按键键值为2 
  39          //左第三个按键键值为3 
  40          //左第四个按键键值为4
  41           
  42          /******读取按键子程序 getkey()*************/
  43          unsigned char getkey (void)
  44          {    unsigned char k,m,tem,keytem;
  45   1           unsigned int j=0;
  46   1           keytem=0;
  47   1              
  48   1           tem=P2 & 0xf0;                      //第一次读取按键值
  49   1           if(tem!=0xf0)                      //判断有无按键按下
  50   1           {   
  51   2               for(k=0;k<20;k++)
  52   2               delay(250);             //延时一段时间
  53   2               tem=P2 & 0xf0;         //再次读取按键值
  54   2               if(tem!=0xf0)
  55   2               {    if(tem==0x70) keytem=1;          //表示左第一个按键按下
C51 COMPILER V7.01  HT1380_TIME3                                                           07/13/2007 19:36:37 PAGE 2   

  56   3                    else if(tem==0xb0) keytem=2;         //表示左第二个按键按下
  57   3                    else if(tem==0xd0) keytem=3;         //表示左第三个按键按下
  58   3                    else if(tem==0xe0) keytem=4;         //表示左第四个按键按下
  59   3               }
  60   2            }
  61   1            
  62   1            while(tem!=0xf0) 
  63   1                {
  64   2                        for(m=0;m<250;m++)
  65   2               delay(250),j++;
  66   2               tem=P2 & 0xf0;  //等待按键释放
  67   2                  if (tem==0x70&&j>500) 
  68   2                  {flag=1;
  69   3                  
  70   3                   }
  71   2                }
  72   1            return(keytem);                              //返回按键值
  73   1      }
  74          
  75          /*******  ht1380 子程序*****************/
  76          //------------- sent_char to ht1380----------
  77          //上升沿写入
  78          void sent_char(unsigned char sentchar)
  79          {
  80   1       unsigned char ii;  
  81   1      
  82   1       for(ii=0;ii<8;ii++)
  83   1          {
  84   2            ht1380_sclk=0;
  85   2            if ((sentchar & 1)!=0) ht1380_data=1;
  86   2            else ht1380_data=0;
  87   2            ht1380_sclk=1;
  88   2            sentchar=sentchar>>1;
  89   2          }
  90   1      }
  91          //------------- get_char from ht1380---------
  92          unsigned char get_char()
  93          {
  94   1       unsigned char getchar,ii,temp;
  95   1          getchar=0;temp=1;
  96   1          for(ii=0;ii<8;ii++)
  97   1            {
  98   2             ht1380_sclk=0;
  99   2             ht1380_data=1;
 100   2             if(ht1380_data==1) getchar=getchar |temp;
 101   2             ht1380_sclk=1;
 102   2             temp=temp<<1;
 103   2            }
 104   1          return(getchar);
 105   1      }
 106           
 107          //-------------set_wp_off------------------
 108          void set_wp_off()
 109          {
 110   1          ht1380_rest=1;
 111   1          sent_char(0x8e);     //10001110b
 112   1          sent_char(0);        //00000000b
 113   1          ht1380_sclk=0;
 114   1          ht1380_rest=0;
 115   1      }
 116          //-----------set_wp_on--------------------
 117          void set_wp_on()
C51 COMPILER V7.01  HT1380_TIME3                                                           07/13/2007 19:36:37 PAGE 3   

 118          {
 119   1        ht1380_rest=1;
 120   1        sent_char(0x8e);       //10001110b
 121   1        sent_char(0x80);       //10000000b
 122   1        ht1380_sclk=0;
 123   1        ht1380_rest=0;
 124   1      }
 125          //----------read_time --------------------
 126          void read_time()
 127           {
 128   1        unsigned char temp;
 129   1          ht1380_rest=1;
 130   1          sent_char(0xbf);      //10111111b
 131   1          second=get_char();
 132   1          minute=get_char();
 133   1          hour=  get_char();
 134   1          day=   get_char();
 135   1          month= get_char();
 136   1          temp=  get_char();   /* week day */
 137   1          year=  get_char();
 138   1          temp=  get_char();            
 139   1          ht1380_sclk=0;
 140   1          ht1380_rest=0;
 141   1         
 142   1       }
 143          //--------------set time-----------------
 144          void set_time()
 145           {
 146   1         set_wp_off();
 147   1         ht1380_rest=1;
 148   1         sent_char(0xbe);      //10111110b
 149   1         sent_char(second);
 150   1         sent_char(minute);
 151   1         sent_char(hour);
 152   1         sent_char(day);
 153   1         sent_char(month);
 154   1         sent_char(1);         /* week  day */
 155   1         sent_char(year);
 156   1         sent_char(0);
 157   1         ht1380_sclk=0;
 158   1         ht1380_rest=0;
 159   1         set_wp_on();
 160   1       }
 161          
 162          /*****定时器初始化程序*******/
 163          void Init_Timer (void)
 164          {
 165   1          TMOD=0x21;
 166   1              TH0=(65536-1000)/256;
 167   1          TL0=(65536-1000)%256;
 168   1          TR0=1;
 169   1          ET0=1;
 170   1          EA=1;
 171   1      } 
 172          
 173          /*****定时器0中断服务程序******/
 174          //显示处理,具体可以参考前面的实验
 175          void timer0() interrupt 1 using 1
 176          {
 177   1          TH0=(65536-1000)/256;
 178   1          TL0=(65536-1000)%256;
 179   1          number=number++;
C51 COMPILER V7.01  HT1380_TIME3                                                           07/13/2007 19:36:37 PAGE 4   

 180   1          if(number>3) number=0;
 181   1          P2=digit[number];
 182   1          P0=tab[d[number]]; 
 183   1              //在第二个数码管显示时,将最高位的小数点显示出来,这里为冒号
 184   1          if(distime==1 && number==1)  
 185   1             P0=tab[d[number]]+0x80;  
 186   1       }
 187          /*******主函数***********/
 188          //效果:
 189          //显示时分
 190          //可用按键调整时间-时分
 191          //在较时状态时,相应的数字闪烁
 192          //第一个按键用于调整到较时状态并且可以切换要修改的位,第二个按键用于加1..
 193          //..第三个按键用于减,第四个按键用于确认回到正常显示状态。
 194          //这里就不调整年月日了.大家可以考虑一下如何调整
 195          
 196          void main (void)
 197          {
 198   1       unsigned char keyboard,keyboard1;         //键值变量
 199   1       unsigned char state=0;          //状态指示 =1较时状态  =0正常显示状态
 200   1       unsigned char i,distem,w=3;                //变量
 201   1       year=07;month=03;day=0x05;hour=0x07;minute=0x16;second=13; //软件预设时间参数
 202   1        callhour=27,callminute=0,callsecond=0;
 203   1       beep=1;
 204   1       ht1380_rest=0;ht1380_sclk=0;   //选中时钟芯片
 205   1       read_time();                    //设置时间
 206   1       Init_Timer();                  //初始化定时器及全局变量
 207   1       number=0;                      
 208   1       distime=1;                    //冒号显示                  
 209   1       while(1)
 210   1           {  
 211   2                      distime=~distime;  // 闪动冒号    
 212   2                      read_time();      //读时间
 213   2                      if(state==0)      //state=0 正常显示状态
 214   2              {
 215   3                 read_time();
 216   3                 d[0]=hour/16;
 217   3                 d[1]=hour %16;
 218   3                 d[2]=minute/16;
 219   3                 d[3]=minute %16;
 220   3              }
 221   2              else               //较时状态。让需要较时的位闪动
 222   2              {  set_time();
 223   3                 distem=d[w];
 224   3                 d[w]=10;
 225   3                 for(i=0;i<250;i++)
 226   3                     delay(250);
 227   3                 d[w]=distem;
 228   3                 for(i=0;i<250;i++)
 229   3                     delay(250);
 230   3              }
 231   2                      keyboard=getkey(); //读按键;
 232   2                       
 233   2             while(flag==1)
 234   2            
 235   2                       {  
 236   3                      
 237   3                               distime=1;
 238   3                   state=1;
 239   3                       /* set_time();*/
 240   3                 distem=d[w];
 241   3                 d[w]=10;
C51 COMPILER V7.01  HT1380_TIME3                                                           07/13/2007 19:36:37 PAGE 5   

 242   3                 for(i=0;i<250;i++)
 243   3                     delay(250);
 244   3                 d[w]=distem;
 245   3                 for(i=0;i<250;i++)
 246   3                     delay(250);
 247   3                         
 248   3                  keyboard1=getkey();
 249   3                
 250   3              
 251   3                  if(keyboard1==1) 
 252   3                    {   state=1;       // ..按键后会同时向后退到下一位
 253   4                         w++;
 254   4                         if(w>3) w=0; 
 255   4                     } 
 256   3                  else if(keyboard1==2)
 257   3                     {   d[w]++;
 258   4                         if(d[0]>2) d[0]=0;
 259   4                                     if(d[0]==2&&d[1]>3) d[1]=0;
 260   4                                      if(d[2]>5) d[2]=0;
 261   4                         else if(w>=1&&d[w]>9) d[w]=0;
 262   4                      }
 263   3                  else if(keyboard1==3)
 264   3                     {   if(d[w]>0) d[w]--; }
 265   3                  else     if(keyboard1==4)
 266   3                     {   callhour=d[0]*16+d[1];
 267   4                         callminute=d[2]*16+d[3];
 268   4                         callsecond=0;
 269   4                            read_time();
 270   4                      d[0]=hour/16;
 271   4                      d[1]=hour %16;
 272   4                      d[2]=minute/16;
 273   4                      d[3]=minute %16;
 274   4                                   
 275   4      
 276   4                           state=0;
 277   4                           flag=0;
 278   4                          
 279   4                      }
 280   3                               
 281   3              
 282   3                 } 
 283   2            
 284   2       
 285   2             if(keyboard==1)    // keyboard=1时,切换转态到较时并且多次..
 286   2              {   state=1;       // ..按键后会同时向后退到下一位
 287   3                  w++;
 288   3                  if(w>3) w=0; 
 289   3              }
 290   2              else if(keyboard==2)
 291   2              {   d[w]++;
 292   3                  if(d[0]>2) d[0]=0;
 293   3                              if(d[0]==2&&d[1]>3) d[1]=0;
 294   3                              if(d[2]>5) d[2]=0;
 295   3                  else if(w>=1&&d[w]>9) d[w]=0;
 296   3              }
 297   2              else if(keyboard==3)
 298   2              {   if(d[w]>0) d[w]--; }
 299   2              else if(keyboard==4)
 300   2              {    hour=d[0]*16+d[1];
 301   3                   minute=d[2]*16+d[3];
 302   3                   second=0;
 303   3                           set_time();
C51 COMPILER V7.01  HT1380_TIME3                                                           07/13/2007 19:36:37 PAGE 6   

 304   3                   state=0;
 305   3              }
 306   2                      if(hour==callhour&&minute==callminute&&(second>=0&&second<=9))
 307   2                      beep=0;
 308   2                      else beep=1;
 309   2                
 310   2           }
 311   1      
 312   1      }
 313          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    946    ----
   CONSTANT SIZE    =     15    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     17       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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