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

📄 clock.lst

📁 单片机开发资料光盘-双龙-686M.zip
💻 LST
字号:
C51 COMPILER V6.14  CLOCK                                                                  07/01/2001 11:17:50 PAGE 1   


C51 COMPILER V6.14, COMPILATION OF MODULE CLOCK
OBJECT MODULE PLACED IN .\clock.OBJ
COMPILER INVOKED BY: E:\KEIL\C51\BIN\C51.EXE .\clock.c DEBUG OBJECTEXTEND

stmt level    source

   1          /************************************************************/
   2          /*               广州天河双龙电子有限公司                   */
   3          /*               http://www.sl.com.cn                       */
   4          /*               电脑时钟演示程序(KEIL 51版本)            */
   5          /*                程序作者:詹卫前                          */
   6          /*      接线方式:CS=P2.4 CLK=P2.3 DATA=P2.2 KEY=P2.1       */
   7          /*        处理器:AT89C51       晶振频率:8MHZ              */
   8          /*                    SL279 晶振频率:12MHZ                  */
   9          /************************************************************/
  10          #include<at89x51.h>
  11          sbit  cs=P2^4;		
  12          sbit  clk=P2^3;	
  13          sbit  dat=P2^2;	
  14          sbit  key=P2^1;
  15          sbit  bp=P2^0;
  16          unsigned char flag=0;//时间刷新标志
  17          unsigned char dflag=0;//计数方向标志
  18          unsigned char count=20;
  19          /*      定义结构体time        */
  20          struct time               
  21          {
  22           signed char second;
  23           signed char minute;
  24           signed char hour;
  25          } time;
  26          /*     90us延时程序       */
  27          void delay_90us(void)
  28             {
  29   1      	unsigned char i;
  30   1      	for (i=0;i<18;i++)
  31   1      	    ;
  32   1         }
  33          /*    10us延时程序       */
  34          void delay_10us(void)
  35             {
  36   1      	unsigned char i;
  37   1      	for (i=0;i<1;i++)
  38   1      	    ;
  39   1          }
  40          /*     ms级延时程序      */
  41          void delay_ms(unsigned int number)
  42             {
  43   1           unsigned char i;
  44   1           do
  45   1      	   {
  46   2      	    for(i=0;i<11;i++)
  47   2      		     delay_90us();
  48   2      		}
  49   1      	 while(--number!=0);     
  50   1          }
  51          /*         字节发送函数            */
  52          void send_byte(	unsigned char para)
  53          {
  54   1      	unsigned char i;
  55   1      	cs=0;
C51 COMPILER V6.14  CLOCK                                                                  07/01/2001 11:17:50 PAGE 2   

  56   1      	delay_90us();
  57   1      	for (i=0;i<8;i++)
  58   1      	{
  59   2      		if (para&0x80)
  60   2      		   {	
  61   3      			dat=1;
  62   3      		   }
  63   2      		else
  64   2      		   {
  65   3      			dat=0;
  66   3      	  	   }
  67   2      		clk=1;
  68   2      		delay_10us();
  69   2      		clk=0;
  70   2      		delay_10us();
  71   2      		para=para<<1;
  72   2      	}
  73   1      	dat=0;
  74   1      	clk=0;
  75   1      }
  76          /*         字节接收函数          */ 
  77          unsigned char receive_byte(void)
  78          {
  79   1      	unsigned char i, temp;
  80   1      	dat=1;			
  81   1      	delay_90us();
  82   1      	for (i=0;i<8;i++)
  83   1      	{
  84   2      		clk=1;
  85   2      		delay_10us();
  86   2      		temp=temp<<1;
  87   2      		if (dat)
  88   2      		  {
  89   3      		   temp=temp|0x01;
  90   3      		  }
  91   2      		clk=0;
  92   2      		delay_10us();
  93   2      	}
  94   1      	dat=0;
  95   1      	return (temp);
  96   1      }
  97          /*               写sl279双字节命令                 */          
  98          void write279(unsigned char cmd1, unsigned char cmd2)
  99          {
 100   1      	send_byte (cmd1);
 101   1      	send_byte (cmd2);                              
 102   1      	cs=1;
 103   1      }
 104          /*在启动时设置时间,按shift键后进入计时状态*/
 105          void initdis()                  
 106          {
 107   1       unsigned char i=7;
 108   1       unsigned char keyval=0;
 109   1       write279(0xc8,0);
 110   1       write279(0xc9,0);
 111   1       write279(0x92,1);
 112   1       write279(0xcb,0);
 113   1       write279(0xcc,0);
 114   1       write279(0x95,1);
 115   1       write279(0xce,0);
 116   1       write279(0xcf,0);
 117   1       write279(0x88,0x7f);
C51 COMPILER V6.14  CLOCK                                                                  07/01/2001 11:17:50 PAGE 3   

 118   1       do
 119   1         {    
 120   2      	while(key!=0)
 121   2      	       ;
 122   2          send_byte(0x15);
 123   2      	keyval=receive_byte();
 124   2      	cs=1;
 125   2      	switch (i)
 126   2      	 {
 127   3      	  case 7:{
 128   4      	          if(keyval<3)
 129   4      			    {
 130   5      				 write279(0xc8+i,keyval);
 131   5      				 i--;
 132   5      				 write279(0x88,0xbf);
 133   5      				 time.hour=time.hour%10+keyval*10;
 134   5      				}			  
 135   4      			  break;
 136   4      	         }
 137   3      	  case 6:{
 138   4      	          if(keyval<10)
 139   4      			    {
 140   5      				 if((time.hour<20)|(keyval<4))
 141   5      				   {
 142   6      				    write279(0xc8+i,keyval);
 143   6      				    i--;
 144   6      				    i--;
 145   6      				    write279(0x88,0xef);
 146   6      					time.hour=(time.hour/10)*10+keyval;
 147   6      					}	
 148   5      				}			  
 149   4      			  break;
 150   4      	         }
 151   3            case 4:{
 152   4      	          if(keyval<6)
 153   4      			    {
 154   5      				 write279(0xc8+i,keyval);
 155   5      				 i--;
 156   5      			     write279(0x88,0xf7);
 157   5      				 time.minute=time.minute%10+keyval*10;
 158   5      				 }			  
 159   4      			  break;	        	          
 160   4      	          }
 161   3      	  case 3:{
 162   4      	          if(keyval<10)
 163   4      			     {
 164   5      				  write279(0xc8+i,keyval);
 165   5      				  i--;
 166   5      			      i--;
 167   5      				  write279(0x88,0xfd);
 168   5      				  time.minute=(time.minute/10)*10+keyval;
 169   5      				  }			  
 170   4      			  break;	        	          
 171   4      	         }		
 172   3            case 1:{
 173   4      	          if(keyval<6)
 174   4      			      {
 175   5      				  write279(0xc8+i,keyval);
 176   5      				  i--;
 177   5      			      write279(0x88,0xfe);
 178   5      				  time.second=time.second%10+keyval*10;
 179   5      				  }			  
C51 COMPILER V6.14  CLOCK                                                                  07/01/2001 11:17:50 PAGE 4   

 180   4      			  break;	        	          
 181   4      	          }
 182   3      	  case 0:{
 183   4      	          if(keyval<10)
 184   4      			      {
 185   5      				   write279(0xc8+i,keyval);
 186   5      				   i=7;
 187   5      				   write279(0x88,0x7f);
 188   5      				   time.second=(time.second/10)*10+keyval;
 189   5      				  }			  
 190   4      			  break;	        	          
 191   4      	         }		
 192   3      	   }
 193   2          while(key==0)//按键释放检查
 194   2                ;		 
 195   2         }    
 196   1       while(keyval!=0x17);
 197   1       write279(0x88,0xff);
 198   1      }
 199          /*       设置定时器1及中断系统     */
 200          void opentime()
 201          {
 202   1       TMOD=0x11;
 203   1       TL1=101;
 204   1       TH1=253;
 205   1       TL0=202;
 206   1       TH0=125;
 207   1       TR0=1;
 208   1       TR1=1;
 209   1       IE=0x82;
 210   1       IP=0x02;
 211   1      }
 212          /*        显示刷新          */
 213          void display(void)
 214             {
 215   1          write279(0xc8,time.second%10);
 216   1          write279(0xc9,time.second/10);
 217   1          write279(0x92,1);
 218   1          write279(0xcb,time.minute%10);
 219   1          write279(0xcc,time.minute/10);
 220   1          write279(0x95,1);
 221   1          write279(0xce,time.hour%10);
 222   1          write279(0xcf,time.hour/10);
 223   1         }
 224          /*        正计时            */   
 225          void inctime(void)
 226             {
 227   1          if(time.second<59)
 228   1      	   time.second++;
 229   1      	else
 230   1      	  {
 231   2      	   time.second=0;
 232   2      	   if(time.minute<59)
 233   2      	     time.minute++;
 234   2      	   else
 235   2      	     {
 236   3      		  time.minute=0;
 237   3      		  if(time.hour<23)
 238   3      		    time.hour++;
 239   3      		  else
 240   3      		    time.hour=0;	
 241   3      		 }	 
C51 COMPILER V6.14  CLOCK                                                                  07/01/2001 11:17:50 PAGE 5   

 242   2      	  }   
 243   1         }
 244          /*          倒计时           */   
 245          void dectime(void)
 246             {
 247   1          if(time.second>0)
 248   1      	   time.second--;
 249   1      	else
 250   1      	  {
 251   2      	   time.second=59;
 252   2      	   if(time.minute>0)
 253   2        	      time.minute--;
 254   2      	   else
 255   2      	     {
 256   3      		  time.minute=59;
 257   3      		  if(time.hour>0)
 258   3      		    time.hour--;
 259   3      		  else
 260   3      		    time.hour=23;	
 261   3      		 }	 
 262   2      	  }
 263   1         }                        
 264          /*启动时为正计时,按shift键进行正计时和倒计时切换    */
 265          /*启动时允许整点报时,按0~F中任意键一次关闭,二次打开*/
 266          void main(void)
 267          {
 268   1       unsigned char temp,bpflag=0;
 269   1       delay_ms(30);
 270   1       send_byte(0xa4);
 271   1       cs=1;
 272   1       initdis();
 273   1       opentime();
 274   1       while(1)
 275   1         {
 276   2      	if(flag==0x01)
 277   2            {
 278   3      	   if(dflag==0)
 279   3      	     inctime();  
 280   3      	   else
 281   3      	     dectime();
 282   3      	   display();
 283   3      	   flag=0;
 284   3      	  }
 285   2      	if(key==0)//检查shift按键
 286   2      	   {
 287   3      	    send_byte(0x15);
 288   3      	    temp=receive_byte();
 289   3      		cs=1;
 290   3      		if(temp==0x17)
 291   3      		  {
 292   4      		   if (dflag==0)
 293   4      		       dflag=1;
 294   4      	       else
 295   4      		       dflag=0;		 
 296   4      		  } 
 297   3      		else   
 298   3      		   bpflag^=0x01;  
 299   3              while(key==0)
 300   3                   ;
 301   3      	   }   
 302   2      	if ((time.minute==0)&(bpflag==0))
 303   2      	     ET1=1;          //整点报时
C51 COMPILER V6.14  CLOCK                                                                  07/01/2001 11:17:50 PAGE 6   

 304   2      	else
 305   2      		 ET1=0;
 306   2         }
 307   1      }
 308          void timer1_ovf() interrupt 1             //溢出中断子程序
 309          {
 310   1       if(--count==0)
 311   1          {
 312   2      	 flag=0x01;
 313   2      	 count=20;
 314   2      	 }
 315   1       TL0=202;
 316   1       TH0=125;
 317   1      }
 318          void timer0_ovf() interrupt 3
 319           {
 320   1        static unsigned int i;
 321   1        i++;
 322   1        if(i<400)
 323   1           {
 324   2      	  bp^=1;
 325   2      	 }
 326   1        if(i>800)
 327   1            i=0;	
 328   1        TL1=101;
 329   1        TH1=253;
 330   1       }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    926    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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