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

📄 clksmg.lst

📁 学习单片机的程序集
💻 LST
字号:
C51 COMPILER V6.12  CLKSMG                                                                 06/03/2005 13:13:18 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE CLKSMG
OBJECT MODULE PLACED IN .\CLKSMG.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\CLKSMG.C DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          
   3          
   4          /*P1.4小时调整   P1.5分种调整*/
   5          
   6          
   7          
   8          #include <reg51.h>
   9          #include <intrins.h>
  10          
  11          unsigned char data dis_digit;
  12          unsigned char key_s, key_v;
  13          
  14          unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,	// 0, 1, 2, 3
  15          				0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off 
  16          unsigned char data dis_buf[8];
  17          unsigned char data dis_index;
  18          unsigned char hour,min,sec;
  19          unsigned char sec100; 
  20          
  21          sbit	K1 = P1^4;
  22          sbit	K2 = P1^5;
  23          
  24          bit scan_key();
  25          void proc_key();
  26          void inc_sec();
  27          void inc_min();
  28          void inc_hour();
  29          void display();
  30          void delayms(unsigned char ms);
  31          
  32          void main(void)
  33          {
  34   1      	P0 = 0xff;
  35   1      	P2 = 0xff;
  36   1      	TMOD = 0x11;		// 定时器0, 1工作模式1, 16位定时方式
  37   1      	TH1 = 0xdc;
  38   1      	TL1 = 0;
  39   1      
  40   1      	TH0 = 0xFC;
  41   1      	TL0 = 0x17;
  42   1      	
  43   1      	hour = 12;
  44   1      	min = 00;
  45   1      	sec = 00;
  46   1      
  47   1      	sec100 = 0;
  48   1      	
  49   1      	dis_buf[0] = dis_code[hour / 10];		// 时十位
  50   1      	dis_buf[1] = dis_code[hour % 10];		// 时个位
  51   1      	dis_buf[3] = dis_code[min / 10];		// 分十位
  52   1      	dis_buf[4] = dis_code[min % 10];		// 分个位
  53   1      	dis_buf[6] = dis_code[sec / 10];		// 秒十位
  54   1      	dis_buf[7] = dis_code[sec % 10];		// 秒个位
  55   1      	dis_buf[2] = 0xbf;						// 显示"-"
C51 COMPILER V6.12  CLKSMG                                                                 06/03/2005 13:13:18 PAGE 2   

  56   1      	dis_buf[5] = 0xbf;						// 显示"-"
  57   1      			
  58   1      	dis_digit = 0xfe;
  59   1      	dis_index = 0;
  60   1      	
  61   1      	TCON = 0x01;
  62   1      	IE = 0x8a;				// 使能timer0,1 中断
  63   1      	
  64   1      	TR0 = 1;
  65   1      	TR1 = 1;
  66   1      
  67   1      	key_v = 0x03;
  68   1      
  69   1      	while(1)
  70   1      	{
  71   2      		if(scan_key())
  72   2      		{
  73   3      			delayms(10);
  74   3      			if(scan_key())
  75   3      			{
  76   4      				key_v = key_s;
  77   4      				proc_key();
  78   4      			}
  79   3      		}
  80   2      		
  81   2      	}
  82   1      }
  83          
  84          bit scan_key()
  85          {
  86   1      	key_s = 0x00;
  87   1      	key_s |= K2;
  88   1      	key_s <<= 1;
  89   1      	key_s |= K1;
  90   1      	return(key_s ^ key_v);	
  91   1      }
  92          
  93          void proc_key()
  94          {
  95   1      	EA = 0;
  96   1      	if((key_v & 0x01) == 0)		// K1
  97   1      	{
  98   2      		inc_hour();
  99   2      	}
 100   1      	else if((key_v & 0x02) == 0)	// K2
 101   1      	{
 102   2      		min++;
 103   2      		if(min > 59)
 104   2      		{
 105   3      			min = 0;
 106   3      		}
 107   2      		dis_buf[3] = dis_code[min / 10];		// 分十位
 108   2      		dis_buf[4] = dis_code[min % 10];		// 分个位
 109   2      	}
 110   1      
 111   1      	EA = 1;
 112   1      }
 113          
 114          void timer0() interrupt 1
 115          // 定时器0中断服务程序, 用于数码管的动态扫描
 116          // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
 117          // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
C51 COMPILER V6.12  CLKSMG                                                                 06/03/2005 13:13:18 PAGE 3   

 118          //				选通P2.0口数码管
 119          // dis_buf   --- 显于缓冲区基地址	
 120          {
 121   1      	TH0 = 0xFC;
 122   1      	TL0 = 0x17;
 123   1      	
 124   1      	P2 = 0xff;							// 先关闭所有数码管
 125   1      	P0 = dis_buf[dis_index];			// 显示代码传送到P0口
 126   1      	P2 = dis_digit;						// 
 127   1      
 128   1      	dis_digit = _crol_(dis_digit,1);	// 位选通值左移, 下次中断时选通下一位数码管
 129   1      	dis_index++;						// 
 130   1      					
 131   1      	dis_index &= 0x07;			// 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
 132   1      } 
 133          
 134          void timer1() interrupt 3
 135          {
 136   1      	TH1 = 0xdc;
 137   1      	
 138   1      	sec100++;
 139   1      	
 140   1      	if(sec100 >= 100)
 141   1      	{
 142   2      		sec100 = 0;
 143   2      		inc_sec();
 144   2      	}
 145   1      }
 146          
 147          void inc_sec()
 148          {
 149   1      	sec++;
 150   1      	if(sec > 59)
 151   1      	{
 152   2      		sec = 0;
 153   2      		inc_min();
 154   2      	}
 155   1      	dis_buf[6] = dis_code[sec / 10];		// 秒十位
 156   1      	dis_buf[7] = dis_code[sec % 10];		// 秒个位	
 157   1      }
 158          
 159          void inc_min()
 160          {
 161   1      	min++;
 162   1      	if(min > 59)
 163   1      	{
 164   2      		min = 0;
 165   2      		inc_hour();
 166   2      	}
 167   1      	dis_buf[3] = dis_code[min / 10];		// 分十位
 168   1      	dis_buf[4] = dis_code[min % 10];		// 分个位
 169   1      }
 170          
 171          void inc_hour()
 172          {
 173   1      	hour++;
 174   1      	if(hour > 23)
 175   1      	{
 176   2      		hour = 0;
 177   2      	}
 178   1      	if(hour > 9)
 179   1      		dis_buf[0] = dis_code[hour / 10];		// 时十位
C51 COMPILER V6.12  CLKSMG                                                                 06/03/2005 13:13:18 PAGE 4   

 180   1      	else
 181   1      		dis_buf[0] = 0xff;					// 当小时的十位为0时不显示
 182   1      	dis_buf[1] = dis_code[hour % 10];		// 时个位
 183   1      
 184   1      }
 185          
 186          
 187          void delayms(unsigned char ms)	
 188          // 延时子程序
 189          {						
 190   1      	unsigned char i;
 191   1      	while(ms--)
 192   1      	{
 193   2      		for(i = 0; i < 120; i++);
 194   2      	}
 195   1      }
 196          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    502    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16    ----
   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 + -