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

📄 sss.lst

📁 KT800综合系统板实验源程序库
💻 LST
字号:
C51 COMPILER V6.12  SSS                                                                    05/28/2005 23:44:44 PAGE 1   


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

stmt level    source

   1          /*                                                                             *
   2          *                 数码管显示秒表, 分辨率0.01s                                     *
   3          *                 K1=P1.4---控制按钮                                           *
   4          *                       第一次按下时, 启动开始计时                             *
   5          *                       第二次按下时, 停止                                     *
   6          *                       第三次按下时, 归零                                     *
   7          *                                                                              *
   8          *    秒单位,寄存器与数码管对应关系:                                            *
   9          *                                                                              *
  10          * --- 秒单位 ---------- 数码管端口 ---- 缓冲区 --------- 计时BCD码值寄存器     *
  11          *     十万位               P20        dis_buf[7]          sec_bcd[7]           *
  12          *     万位                 P21        dis_buf[6]          sec_bcd[6]           *
  13          *     千位                 P22        dis_buf[5]          sec_bcd[5]           *
  14          *     百位                 P23        dis_buf[4]          sec_bcd[4]           *
  15          *     十位                 P24        dis_buf[3]          sec_bcd[3]           *
  16          *     个位(1.s)            P25        dis_buf[2]          sec_bcd[2]           *
  17          *     十分位(0.1s)         P26        dis_buf[1]          sec_bcd[1]           *
  18          *     百分位(0.01s)        P27        dis_buf[0]          sec_bcd[0]           *
  19          *                                                                              *
  20          ********************************************************************************
  21          */
  22          
  23          #include <reg51.h>
  24          #include <intrins.h>
  25          
  26          unsigned char data dis_digit;
  27          unsigned char key_s, key_v;
  28          
  29          unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,	// 0, 1, 2, 3
  30          				0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off 
  31          unsigned char dis_buf[8];		// 显示缓冲区
  32          unsigned char sec_bcd[8]; 		// 秒计数值, BCD码
  33          unsigned char dis_index;		// 
  34          unsigned char key_times;		// K1 按下次数				//
  35          
  36          void clr_time();	
  37          void update_disbuf();
  38          bit	scan_key();
  39          void proc_key();
  40          void delayms(unsigned char ms);
  41          
  42          sbit	K1 = P1^4;
  43          
  44          
  45          void main(void)
  46          {
  47   1      	P0 = 0xff;
  48   1      	P2 = 0xff;
  49   1      	TMOD = 0x11;		// 定时器0, 1工作模式1, 16位定时方式
  50   1      	TH1 = 0xdc;
  51   1      	TL1 = 0;
  52   1      
  53   1      	TH0 = 0xFC;
  54   1      	TL0 = 0x17;
  55   1      	
C51 COMPILER V6.12  SSS                                                                    05/28/2005 23:44:44 PAGE 2   

  56   1      	clr_time();			// 
  57   1      			                   
  58   1      	dis_digit = 0x7f;		// 初始显示P20口数码管
  59   1      	dis_index = 0;			// 
  60   1      	
  61   1      	key_times = 0;
  62   1      	key_v = 0x01;
  63   1      	
  64   1      	IE = 0x8a;				// 使能timer0, timer1中断
  65   1      	
  66   1      	TR0 = 1;
  67   1      	TR1 = 0;
  68   1      	while(1)
  69   1      	{
  70   2      		if(scan_key())
  71   2      		{
  72   3      			delayms(10);
  73   3      			if(scan_key())
  74   3      			{
  75   4      				key_v = key_s;
  76   4      				proc_key();
  77   4      			}
  78   3      		}
  79   2      		
  80   2      	}
  81   1      }
  82          
  83          void clr_time()
  84          {
  85   1      	sec_bcd[0] = 0x0;
  86   1      	sec_bcd[1] = 0x0;
  87   1      	sec_bcd[2] = 0x0;
  88   1      	sec_bcd[3] = 0x0;
  89   1      	sec_bcd[4] = 0x0;
  90   1      	sec_bcd[5] = 0x0;
  91   1      	sec_bcd[6] = 0x0;
  92   1      	sec_bcd[7] = 0x0;   
  93   1      	
  94   1      	update_disbuf();
  95   1      	
  96   1      }
  97          
  98          bit scan_key()
  99          {
 100   1      	key_s = 0x00;
 101   1      	key_s |= K1;
 102   1      	return(key_s ^ key_v);	
 103   1      }
 104          
 105          void proc_key()
 106          {
 107   1      	if((key_v & 0x01) == 0)
 108   1      	{
 109   2      		key_times++;
 110   2      		if(key_times == 1)
 111   2      		{
 112   3      			TR1 = 1;
 113   3      		}
 114   2      		else if(key_times == 2)
 115   2      		{	
 116   3      			TR1 = 0;
 117   3      		}
C51 COMPILER V6.12  SSS                                                                    05/28/2005 23:44:44 PAGE 3   

 118   2      		else
 119   2      		{
 120   3      			clr_time();
 121   3      			key_times = 0;
 122   3      		}
 123   2      		
 124   2      	}
 125   1      }
 126          
 127          void timer0() interrupt 1
 128          // 定时器0中断服务程序, 用于数码管的动态扫描
 129          // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
 130          // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
 131          //				选通P2.0口数码管
 132          // dis_buf   --- 显于缓冲区基地址	
 133          {
 134   1      	TH0 = 0xFC;
 135   1      	TL0 = 0x17;
 136   1      	
 137   1      	P2 = 0xff;							// 先关闭所有数码管
 138   1      	P0 = dis_buf[dis_index];			// 显示代码传送到P0口
 139   1      	P2 = dis_digit;						// 
 140   1      
 141   1      	dis_digit = _cror_(dis_digit,1);	// 位选通值右移(P20<-P27), 下次中断时选通下一位数码管
 142   1      	dis_index++;						// 
 143   1      					
 144   1      	dis_index &= 0x07;			// 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
 145   1      }
 146          
 147          void timer1() interrupt 3
 148          //
 149          {	
 150   1      	unsigned char i;
 151   1      	TH1 |= 0xdc;
 152   1      	for(i = 0; i < 8; i++)
 153   1      	{
 154   2      		sec_bcd[i]++;			// 低位加1
 155   2      		if(sec_bcd[i] < 10)		// 如果低位满10则向高位进1
 156   2      			break;			// 低位未满10
 157   2      		sec_bcd[i] = 0;			// 低位满10清0
 158   2      	}
 159   1      	update_disbuf();			// 更新显示缓冲区
 160   1      }
 161          
 162          void update_disbuf()
 163          // 更新显示缓冲区
 164          {
 165   1      	dis_buf[0] = dis_code[sec_bcd[0]];
 166   1      	dis_buf[1] = dis_code[sec_bcd[1]];
 167   1      	dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f;	// 加上小数点
 168   1      	dis_buf[3] = dis_code[sec_bcd[3]];
 169   1      	dis_buf[4] = dis_code[sec_bcd[4]];
 170   1      	dis_buf[5] = dis_code[sec_bcd[5]];
 171   1      	dis_buf[6] = dis_code[sec_bcd[6]];
 172   1      	dis_buf[7] = dis_code[sec_bcd[7]];
 173   1      }
 174          
 175          void delayms(unsigned char ms)	
 176          // 延时子程序
 177          {						
 178   1      	unsigned char i;
 179   1      	while(ms--)
C51 COMPILER V6.12  SSS                                                                    05/28/2005 23:44:44 PAGE 4   

 180   1      	{
 181   2      		for(i = 0; i < 120; i++);
 182   2      	}
 183   1      }
 184          


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