亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? calculator.c

?? 計(jì)算器。4x4鍵盤控制數(shù)碼管顯示
?? C
字號:

/*******************************************************************************
************                 LABCENTER ELECTRONICS                  ************                              
************		     Proteus VSM Sample Design Code             ************		 	
************	       Integer Calculator ( 2K Code Limit)	        ************
*******************************************************************************/

#include <intrins.h>
#include <reg51.h>
#include "calc.h"

//Variables
static  data LONG lvalue;
static  data LONG rvalue;
static  data CHAR currtoken;
static  data CHAR lasttoken;
static  data CHAR lastpress;
static  xdata CHAR outputbuffer[MAX_DISPLAY_CHAR];

VOID main (VOID)
//Initialise our variables and call the 
//Assembly routine to initialise the LCD display. 
 { lvalue    = 0;
   rvalue    = 0;
   currtoken = '=';
   lasttoken = '0';
   initialise();  // Initialize the LCD
   calc_output(OK);
   calc_evaluate();
 }   

VOID calc_evaluate()
 { CHAR data key;
   INT  data i;
   CHAR xdata number[MAX_DISPLAY_CHAR];
   CHAR xdata *bufferptr;
   
   // Clear the buffer before we start.
   for (i = 0; i <= MAX_DISPLAY_CHAR; i++)
      { number[i] = ' ';
	  }
   bufferptr = number;  
   
   for (;;)
     { key = calc_getkey();
	   if (calc_testkey(key))
       // Key test positive for digit so we read it into the
       // buffer and then write the buffer to the screen/LCD.
	   // Size limit the number of digits - allow for termination
	   // and possible negative results.
          { if (bufferptr != &number[MAX_DISPLAY_CHAR - 2])
               { *bufferptr = key;
                 calc_display(number);
                 bufferptr++;
               }
          }

       else
       // Key is an operator so pass it to the function handlers.
       // If we are just after startup or cancel then assign to lvalue
       // otherwise assign to rvalue.
          { 
		    //Assign the value.
            if (lasttoken == '0')
               { lvalue = calc_asciidec (number);}
            else
               { rvalue = calc_asciidec (number);}

            //Clear the number buffer.
            bufferptr = number;
            for (i = 0;i <= MAX_DISPLAY_CHAR; i++)
               { number[i] = ' '; }
		 
            //Process the Operator.
            currtoken = key;
			if (currtoken == 'C') 
			   { calc_opfunctions(currtoken); }
		 	else
			   { calc_opfunctions(lasttoken); }
		
 		    // Clear the outputbuffer for reuse on next operation.
            for (i = 0;i <= MAX_DISPLAY_CHAR;i++)
               { outputbuffer[i] = ' ';}
		      
      	     bufferptr = number;
			// Handle the equals operation here for brevity.
			// All we need do is preserve the previous operator in
			// lasttoken.
			if (currtoken != 0x3D) lasttoken = currtoken;
            
   		  }
       lastpress = key;
     }
 }

VOID calc_opfunctions (CHAR token)
// Handle the operations. Lvalue holds the result and we test for
// consecutive operator presses.
 { CHAR data result;
   switch(token)
        // Add.
     {  case '+' : if ((currtoken == '=' ) || ((lastpress >= 0x30) && (lastpress <=0x39)))
      			      { lvalue += rvalue;
        			    result = calc_chkerror(lvalue);
					  }
   				   else
      				  { result =  SLEEP; }		break;
        // Subtract.
		case '-' : if ((currtoken == '=' ) || ((lastpress >= 0x30) && (lastpress <=0x39)))
                      { lvalue -= rvalue;
                        result = calc_chkerror(lvalue);		
					  }
                   else
                      { result = SLEEP;}		break;
        // Multiply.
		case '*' : if ((currtoken == '=' ) || ((lastpress >= 0x30) && (lastpress <=0x39)))
                      { lvalue *= rvalue;
                        result =  calc_chkerror(lvalue);
                      }
                   else
                      { result =  SLEEP;}		break;
		// Divide.			  
		case '/' : if ((currtoken == '=' ) || ((lastpress >= 0x30) && (lastpress <=0x39)))
                      { if (rvalue)
                           { lvalue /= rvalue;
                             result = calc_chkerror(lvalue);
                           }
                        else
                           { result = ERROR;}				 
                      }
                   else
                      { result = SLEEP;}		break;
		// Cancel.
 		case 'C' : lvalue = 0;
                   rvalue = 0;
                   currtoken = '0';
                   lasttoken = '0';
                   result = OK;				  	break;
	
		default :  result = SLEEP;  

      }
   calc_output(result); 
 }

 
/************************************************************************
***** Utility Routines *****
***************************/

INT calc_chkerror (LONG num)
// Check upper and lower bounds for the display.
// i.e. 99999999 and -99999999.
 { if ((num >= -9999999) && (num <= 9999999))
      return OK;
   else
      return ERROR;
 }


VOID calc_output (INT status)
// Output according to the status of the operation.
// *Sleep* is used for the first op press after a full cancel
// or on startup.  
 { switch (status)
      { case OK      : calc_display(calc_decascii(lvalue));    break;
        case SLEEP   :                                         break;
		case ERROR   : calc_display("Exception ");			   break;	
        default      : calc_display("Exception ");	    	   break;
      }
 }


LONG calc_asciidec (CHAR *buffer)
// Convert the ASCII string into the floating point number.
 { LONG data value;
   LONG data digit;
   value = 0;
   while (*buffer != ' ')
      { digit = *buffer - 48;
	    value = value*10 + digit;
        buffer++;
	  }
   return value;
 }

CHAR *calc_decascii (LONG num)
// A rather messy function to convert a floating
// point number into an ASCII string.
 { LONG data temp = num;
   CHAR xdata *arrayptr = &outputbuffer[MAX_DISPLAY_CHAR];
   LONG data divisor = 10;
   LONG data result;
   CHAR data remainder,asciival;
   INT  data i;
   
   // If the result of the calculation is zero 
   // insert a zero in the buffer and finish.
   if (!temp)
      { *arrayptr = 48;
	    goto done;
	  }
   // Handle Negative Numbers.
   if (temp < 0)
      { outputbuffer[0] = '-';
	    temp -= 2*temp;
	  }

   for (i=0 ; i < sizeof(outputbuffer) ; i++)
      { remainder = temp % divisor;   
        result = temp / divisor;
	    
		// If we run off the end of the number insert a space into
	    // the buffer.
	    if ((!remainder) && (!result))
 	       { *arrayptr = ' ';}
	  
	    // We're in business - store the digit offsetting
	    // by 48 decimal to account for the ascii value.
	    else
	       { asciival = remainder + 48;
		     *arrayptr = asciival;
		   } 
 	  
		temp /= 10;
	    // Save a place for a negative sign.
	    if (arrayptr != &outputbuffer[1]) arrayptr--;
	   }
   done: return outputbuffer;
 }


CHAR calc_testkey (CHAR key)
// Test whether the key is a digit or an operator. Return 1 for digit, 0 for op.
 { if ((key >= 0x30) && (key <= 0x39))
      { return 1;}
   else
      { return 0;}
 }

/************************************************************************
***** I/O Routines *****
***********************/

CHAR calc_getkey (VOID)
// Use the input routine from the *Keypad_Read* assembly file to 
// Scan for a key and return ASCII value of the Key pressed.
{ CHAR data mykey;
  do mykey = input();
     while (mykey == 0);
  return mykey;
 }

VOID calc_display (CHAR buf[MAX_DISPLAY_CHAR])
// Use the Output and Clearscreen routines from the 
// *LCD_Write* assembly file to output ASCII values to the LCD.
 { INT data  i = 0;
   clearscreen();
   for (i ; i <= MAX_DISPLAY_CHAR ; i++)
      { if (buf[i] != ' ')
	     { output(buf[i]); }
	  }	
 }






?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国产免费看| 国内欧美视频一区二区| 国产午夜亚洲精品午夜鲁丝片| 在线视频欧美区| 色综合久久久网| 99久久精品免费看| 成人在线综合网站| 国产在线播放一区三区四| 男女激情视频一区| 免费成人在线网站| 国产不卡视频一区二区三区| 国产精品88888| 国产精品一二三在| 色狠狠av一区二区三区| 91久久免费观看| 3d成人动漫网站| 777久久久精品| 亚洲国产高清aⅴ视频| 国产精品麻豆网站| 国产精品大尺度| 亚洲久本草在线中文字幕| 亚洲人成网站色在线观看| 亚洲人123区| 裸体健美xxxx欧美裸体表演| 免费成人在线视频观看| av爱爱亚洲一区| 精品视频全国免费看| 欧美精品乱人伦久久久久久| 欧美一区二区在线播放| www亚洲一区| 欧美激情中文字幕一区二区| 亚洲成人免费影院| 免费高清不卡av| 色先锋资源久久综合| 久久蜜桃av一区精品变态类天堂| 国产蜜臀av在线一区二区三区| 中文字幕在线观看不卡| 亚洲永久免费av| 美女高潮久久久| 色婷婷久久综合| 国产日韩欧美制服另类| 日本不卡不码高清免费观看| 91麻豆高清视频| 欧美精选在线播放| 亚洲欧美在线另类| 国产精品 欧美精品| 色成年激情久久综合| 久久精品一区四区| 蜜臀av国产精品久久久久| 欧美亚洲日本国产| 精品理论电影在线| 亚洲黄色免费电影| 不卡av免费在线观看| 欧美日韩精品久久久| 久久综合国产精品| 日本vs亚洲vs韩国一区三区二区 | 精品国产自在久精品国产| 久久久久亚洲综合| 蜜桃av一区二区在线观看| 欧美老肥妇做.爰bbww| 一区二区三区在线视频观看| 免费xxxx性欧美18vr| 欧美日韩国产另类不卡| 亚洲一区在线电影| 91豆麻精品91久久久久久| 1区2区3区欧美| 成人黄色777网| 欧美激情一区不卡| 国产99精品在线观看| 久久久久久久网| 国产精品69久久久久水密桃| 欧美精品一区二区三区蜜臀| 久久精品国产久精国产爱| 日韩久久精品一区| 有码一区二区三区| 色婷婷久久99综合精品jk白丝| 亚洲色图20p| 国产成人综合自拍| 精品粉嫩超白一线天av| 激情六月婷婷久久| 国产亚洲综合性久久久影院| 国产电影一区在线| 国产精品欧美久久久久一区二区 | 欧美激情在线免费观看| 国产成人精品三级麻豆| 国产精品午夜免费| 99视频在线精品| 亚洲同性gay激情无套| 色综合色狠狠综合色| 一区二区三区视频在线观看| 欧美偷拍一区二区| 日日嗨av一区二区三区四区| 91福利在线观看| 亚洲成人免费在线观看| 日韩亚洲欧美成人一区| 亚洲成人av免费| 欧美一级生活片| 国产一区二区精品在线观看| 国产精品久久久久久久裸模| 91国产免费观看| 青青青爽久久午夜综合久久午夜| 精品久久久影院| 成人妖精视频yjsp地址| 一区二区三区中文字幕| 欧美剧在线免费观看网站| 麻豆国产精品777777在线| 国产拍揄自揄精品视频麻豆| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 日本一区二区在线不卡| 色www精品视频在线观看| 天天色 色综合| 欧美精品在线视频| 激情综合五月婷婷| 精品少妇一区二区三区免费观看 | 国产日韩欧美制服另类| 色av一区二区| 精品一区二区三区日韩| 中日韩免费视频中文字幕| 欧美在线观看一区二区| 久久99精品国产91久久来源| 国产精品美女久久久久av爽李琼 | 亚洲成在人线免费| 精品久久一区二区| 91免费观看视频| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲欧洲日韩综合一区二区| 宅男在线国产精品| 99久久久久免费精品国产| 男女男精品视频网| 又紧又大又爽精品一区二区| 精品91自产拍在线观看一区| 色国产综合视频| 国产黄人亚洲片| 无吗不卡中文字幕| 国产精品日韩成人| 日韩一区二区三区高清免费看看 | 亚洲欧洲中文日韩久久av乱码| 8x福利精品第一导航| 成人av资源网站| 免费日韩伦理电影| 亚洲精品一卡二卡| 久久人人97超碰com| 欧美日韩一区二区三区四区五区 | 欧美激情一区在线观看| 91精品国产色综合久久不卡蜜臀| 成人免费视频一区| 麻豆91在线播放| 一区二区免费看| 日本一区二区成人| 日韩视频中午一区| 欧美亚洲免费在线一区| www.综合网.com| 国产在线视频一区二区| 五月婷婷欧美视频| 亚洲三级在线播放| 国产欧美久久久精品影院| 日韩欧美一二三区| 欧美电影在哪看比较好| 色诱亚洲精品久久久久久| 国产a久久麻豆| 激情欧美日韩一区二区| 美女任你摸久久 | 欧美成人性福生活免费看| 欧美综合色免费| 99re6这里只有精品视频在线观看| 韩国成人精品a∨在线观看| 亚洲a一区二区| 亚洲综合丁香婷婷六月香| 18成人在线视频| 国产精品欧美极品| 国产欧美一区二区精品久导航| 精品日韩欧美在线| 欧美刺激午夜性久久久久久久| 欧美日韩国产一级片| 欧美体内she精高潮| 色一情一乱一乱一91av| 色综合天天综合网天天狠天天 | 日韩欧美在线123| 欧美日韩免费电影| 欧美主播一区二区三区| 欧美性受极品xxxx喷水| 色婷婷亚洲婷婷| 欧美性xxxxx极品少妇| 在线亚洲一区二区| 色av一区二区| 色狠狠av一区二区三区| 欧美自拍偷拍午夜视频| 在线免费观看日本欧美| 色吧成人激情小说| 亚洲欧美另类在线| 亚洲蜜臀av乱码久久精品蜜桃| 日韩美女精品在线| 亚洲精品国产成人久久av盗摄 | 欧美调教femdomvk| 欧美精品久久99| 日韩三级中文字幕| 2020国产精品自拍| 国产欧美精品在线观看| 国产精品国产三级国产专播品爱网 | 一区二区三区在线视频免费|