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

📄 calculator.lst

📁 用单片机系统实现8位的加减乘除运算
💻 LST
字号:
C51 COMPILER V6.12  CALCULATOR                                                             06/10/2005 15:28:44 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE CALCULATOR
OBJECT MODULE PLACED IN .\calculator.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE .\calculator.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include <math.h>
   2          #include <stdio.h>
   3          #include <reg51.h>
   4          
   5          #define		TRUE			1
   6          #define		FALSE			0
   7          #define     ENRD         0     //读有效
   8          #define     DISRD        1
   9          #define     ENWR         0
  10          #define     DISWR        1 
  11          #define		DELAY_VALUE		3
  12          
  13          #define    	PinDrvKey1	P0_0
  14          #define		PinDrvKey2	P0_1
  15          #define		PinDrvKey3	P0_2
  16          #define    	PinDrvKey4	P0_3		//键盘扫描的驱动线
  17          
  18          #define    	PinScanKey1	P0_0
  19          #define    	PinScanKey2	P0_1
  20          #define    	PinScanKey3	P0_2
  21          #define    	PinScanKey4	P0_3		//键盘扫描的信号获取线
  22          
  23          #define		LedSelect0	0x01
  24          #define		LedSelect1	0x02
  25          #define		LedSelect2	0x04
  26          #define		LedSelect3	0x08
  27          #define		LedSelect4	0x10
  28          #define		LedSelect5	0x20
  29          #define		LedSelect6	0x40
  30          #define		LedSelect7	0x80    //led选择位
  31          
  32          #define     num0  0x3f         //字符0的编码
  33          #define     num1  0x06
  34          #define     num2  0x5b
  35          #define     num3  0x4f
  36          #define     num4  0x66
  37          #define     num5  0x6d
  38          #define     num6  0x7d
  39          #define     num7  0x07
  40          #define     num8  0x7f 
  41          #define     num9  0x67         //字符九的编码
  42          
  43          sbit		P0_0=P0^0;
  44          sbit		P0_1=P0^1;
  45          sbit		P0_2=P0^2;
  46          sbit		P0_3=P0^3;
  47          sbit		P0_4=P0^4;
  48          sbit		P0_5=P0^5;
  49          sbit		P0_6=P0^6;
  50          sbit		P0_7=P0^7;
  51          
  52          sbit		P1_0=P1^0;
  53          sbit		P1_1=P1^1;
  54          sbit		P1_2=P1^2;
  55          sbit		P1_3=P1^3;
C51 COMPILER V6.12  CALCULATOR                                                             06/10/2005 15:28:44 PAGE 2   

  56          sbit		P1_4=P1^4;
  57          sbit		P1_5=P1^5;
  58          sbit		P1_6=P1^6;
  59          sbit		P1_7=P1^7;
  60          
  61          sbit		P2_0=P2^0;
  62          sbit		P2_1=P2^1;
  63          sbit		P2_2=P2^2;
  64          sbit		P2_3=P2^3;
  65          sbit		P2_4=P2^4;
  66          sbit		P2_5=P2^5;
  67          sbit		P2_6=P2^6;
  68          sbit		P2_7=P2^7;
  69          
  70          char numtochar(char n)
  71          { switch(n)
  72   1        {case 0:return num0;
  73   2               break;
  74   2        case 1:return num1;
  75   2               break;
  76   2        case 2:return num2;
  77   2               break;
  78   2        case 3:return num3;
  79   2               break;
  80   2        case 4:return num4;
  81   2               break;
  82   2        case 5:return num5;
  83   2               break;
  84   2        case 6:return num6;
  85   2               break;
  86   2        case 7:return num7;
  87   2               break;
  88   2        case 8:return num8;
  89   2               break;
  90   2        case 9:return num9;
  91   2               break;
  92   2        default:break;
  93   2      
  94   2        }
  95   1      }
  96          
  97          
  98          
  99          void initial(void);              //初始化子程序
 100          void delay(short i);
 101          void display(unsigned char i,unsigned char num);
 102          unsigned char keyscan(void);
 103          
 104          void main(void)
 105          {  char Li,Ln;           //第Li个le显示数字ln;
 106   1         long dt1,dt2,temp;
 107   1      	char op,keyword;
 108   1         dt1=0;               //dt1为第一操作数
 109   1      	dt2=0;               //dt2为第二操作数
 110   1      
 111   1      	initial();	
 112   1      		//键盘驱动信号都设为低
 113   1        for(Li=7;Li>=0;Li--) 
 114   1         {Ln=keyscan();  
 115   2      	display(Li,Ln);
 116   2      	}
 117   1      
C51 COMPILER V6.12  CALCULATOR                                                             06/10/2005 15:28:44 PAGE 3   

 118   1      /*    keyword=0;
 119   1          do
 120   1        { 
 121   1      	keyword=keyscan();
 122   1      	if(keyword<=9)
 123   1      	{
 124   1      	  dt2=dt2*10+keyword;
 125   1      	  temp=dt2;
 126   1      	  for(Li=0;Li<=7;Li++)
 127   1      	  {  
 128   1      	     Ln=temp%10;
 129   1      		  temp=temp/10;
 130   1      		  display(Li,Ln);   //显示输入的数字
 131   1      		  if(temp==0)break;
 132   1      	  }
 133   1         }
 134   1      else if(keyword<=13)
 135   1      	 { op=keyword-10;
 136   1      	   dt1=dt2;
 137   1      	   dt2=0;
 138   1      		switch(op)
 139   1      		{case 0:display(7,0);
 140   1      		        break;
 141   1      		 case 1:display(7,1);
 142   1      		        break;
 143   1      	    case 2:display(7,2);
 144   1      		        break;
 145   1      		 case 3:display(7,3);
 146   1      		        break;
 147   1      		default:break;
 148   1      		}
 149   1      	}
 150   1         }while(keyword!=14);  
 151   1      	switch(op)
 152   1      		{case 0:dt1=dt1+dt2;
 153   1      		         break;
 154   1      		 case 1:dt1=dt1-dt2;
 155   1      		         break;
 156   1      	    case 2:dt1=dt1*dt2;
 157   1      		         break;
 158   1      		 case 3:dt1=dt1/dt2;
 159   1      		         break;
 160   1      		 default:break;
 161   1      		}
 162   1      		for(Li=0;Li<=7;Li++)
 163   1      	  {  
 164   1      	     Ln=dt1%10;
 165   1      		  dt1=dt1/10;
 166   1      		  display(Li,Ln);   //显示结果
 167   1      		  if(dt1==0)break;
 168   1      	  }
 169   1      	*/
 170   1      }
*** WARNING C280 IN LINE 106 OF .\CALCULATOR.C: 'temp': unreferenced local variable
*** WARNING C280 IN LINE 107 OF .\CALCULATOR.C: 'op': unreferenced local variable
*** WARNING C280 IN LINE 107 OF .\CALCULATOR.C: 'keyword': unreferenced local variable
 171          
 172          
 173          void initial(void)
 174          {  WR=ENWR;
 175   1         P2=0x80;
 176   1      	P0=0xff;
C51 COMPILER V6.12  CALCULATOR                                                             06/10/2005 15:28:44 PAGE 4   

 177   1         P2=0x90;
 178   1      	P0=0x00; //键盘驱动信号都设为低
 179   1         WR=DISWR; 		
 180   1      }
 181          
 182          unsigned char keyscan()
 183          {
 184   1      char kword=0;
 185   1      P0=0x00;
 186   1      P2=0x80;
 187   1      while(1)
 188   1      {
 189   2      RD=DISRD;
 190   2      WR=ENWR;
 191   2      PinDrvKey1=TRUE;
 192   2      WR=DISWR;
 193   2      RD=ENRD;
 194   2      
 195   2      if(PinScanKey1==TRUE)
 196   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 197   2      if(PinScanKey1==TRUE)
 198   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 199   3      if(PinScanKey1==TRUE)			
 200   3      	kword=1;
 201   3      	break;}					//确认确实有按键信号,返回键值
 202   2      if(PinScanKey2==TRUE)
 203   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 204   2      if(PinScanKey2==TRUE)
 205   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 206   3      if(PinScanKey2==TRUE)			
 207   3      	kword=2;break;}					//确认确实有按键信号,返回键值
 208   2      if(PinScanKey3==TRUE)
 209   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 210   2      if(PinScanKey3==TRUE)
 211   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 212   3      if(PinScanKey3==TRUE)			
 213   3      	kword=3;break;}					//确认确实有按键信号,返回键值
 214   2      if(PinScanKey4==TRUE)
 215   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 216   2      if(PinScanKey2==TRUE)
 217   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 218   3      if(PinScanKey2==TRUE)
 219   3      	kword=10;break;}					//确认确实有按键信号,返回键值
 220   2      				//以上语句扫描第一列
 221   2      
 222   2      
 223   2      RD=DISRD;
 224   2      WR=ENWR;
 225   2      PinDrvKey1=FALSE;
 226   2      PinDrvKey2=TRUE;
 227   2      WR=DISWR;
 228   2      RD=ENRD;
 229   2      
 230   2      if(PinScanKey1==TRUE)
 231   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 232   2      if(PinScanKey1==TRUE)
 233   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 234   3      if(PinScanKey1==TRUE)
 235   3      	kword=4;break;}					//确认确实有按键信号,返回键值
 236   2      if(PinScanKey2==TRUE)
 237   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 238   2      if(PinScanKey2==TRUE)
C51 COMPILER V6.12  CALCULATOR                                                             06/10/2005 15:28:44 PAGE 5   

 239   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 240   3      if(PinScanKey2==TRUE)
 241   3      	kword=5;break;}					//确认确实有按键信号,返回键值
 242   2      if(PinScanKey3==TRUE)
 243   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 244   2      if(PinScanKey3==TRUE)
 245   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 246   3      if(PinScanKey3==TRUE)
 247   3      	kword=6;break;}					//确认确实有按键信号,返回键值
 248   2      if(PinScanKey4==TRUE)
 249   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次 
 250   2      if(PinScanKey4==TRUE)
 251   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 252   3      if(PinScanKey4==TRUE)
 253   3      	kword=11;break;}					//确认确实有按键信号,返回键值
 254   2      			//以上语句扫描第二列
 255   2      
 256   2      RD=DISRD;
 257   2      WR=ENWR;
 258   2      PinDrvKey2=FALSE;	
 259   2      PinDrvKey3=TRUE;
 260   2      WR=DISWR;
 261   2      RD=ENRD;
 262   2      
 263   2      if(PinScanKey1==TRUE)
 264   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 265   2      if(PinScanKey1==TRUE)
 266   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 267   3      if(PinScanKey1==TRUE)
 268   3      	kword=7;break;}					//确认确实有按键信号,返回键值
 269   2      if(PinScanKey2==TRUE)
 270   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 271   2      if(PinScanKey2==TRUE)
 272   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 273   3      if(PinScanKey2==TRUE)
 274   3      	kword=8;break;}					//确认确实有按键信号,返回键值
 275   2      if(PinScanKey3==TRUE)
 276   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次 
 277   2      if(PinScanKey3==TRUE)
 278   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 279   3      if(PinScanKey3==TRUE)
 280   3      	kword=9;break;}					//确认确实有按键信号,返回键值
 281   2      if(PinScanKey4==TRUE)
 282   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 283   2      if(PinScanKey4==TRUE)
 284   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 285   3      if(PinScanKey4==TRUE)
 286   3      	kword=12;}					//确认确实有按键信号,返回键值
 287   2      			//以上语句扫描第三列
 288   2      
 289   2      RD=DISRD;
 290   2      WR=ENWR;
 291   2      PinDrvKey3=FALSE;	
 292   2      PinDrvKey4=TRUE;
 293   2      WR=DISWR;
 294   2      RD=ENRD;
 295   2      
 296   2      if(PinScanKey4==TRUE)
 297   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 298   2      if(PinScanKey1==TRUE)
 299   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 300   3      if(PinScanKey1==TRUE)
C51 COMPILER V6.12  CALCULATOR                                                             06/10/2005 15:28:44 PAGE 6   

 301   3      	kword=0;break;}					//确认确实有按键信号,返回键值
 302   2      if(PinScanKey2==TRUE)
 303   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 304   2      if(PinScanKey2==TRUE)
 305   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 306   3      if(PinScanKey2==TRUE)
 307   3      	kword=14;break;}					//确认确实有按键信号,返回键值
 308   2      if(PinScanKey3==TRUE)
 309   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次
 310   2      if(PinScanKey3==TRUE)
 311   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 312   3      if(PinScanKey3==TRUE)
 313   3      	kword=14;break;}					//确认确实有按键信号,返回键值
 314   2      if(PinScanKey4==TRUE)
 315   2      	delay(DELAY_VALUE);		//如果判断有信号,则延时一次 
 316   2      if(PinScanKey4==TRUE)
 317   2      { delay(DELAY_VALUE);			//假如判断还有信号,则再延时
 318   3      if(PinScanKey4==TRUE)
 319   3      	kword=13;break;}					//假如判断还有信号,则再延时
 320   2      	 //以上语句扫描第四列
 321   2      
 322   2      RD=DISRD;
 323   2      WR=ENWR;
 324   2      PinDrvKey4=FALSE;	
 325   2      WR=DISWR;
 326   2      RD=ENRD;
 327   2      }return kword;
 328   1      }
 329          
 330          
 331          
 332          void display(unsigned char i,unsigned char num)
 333          {  WR=FALSE;
 334   1      	if(num >= 0 && num <=9)
 335   1      	{switch(i)
 336   2      	{ case 0:P2=0x80;
 337   3      	         P0=LedSelect0;
 338   3       			   P2=0x90;
 339   3      				P0=numtochar(num);
 340   3                 //Led0显示nu
 341   3      	break;
 342   3      	  case 1:P2=0x80;
 343   3      	         P0=LedSelect1;
 344   3       			   P2=0x90;
 345   3      				P0=numtochar(num);
 346   3                 //Led1显示nu
 347   3      		  break;
 348   3      	  case 2:P2=0x80;
 349   3      	         P0=LedSelect2;
 350   3       			   P2=0x90;
 351   3      				P0=numtochar(num);
 352   3                 //Led2显示nu镜氖

⌨️ 快捷键说明

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