久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4299|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

基于單片機+RTX51 tiny編寫的LCD1602計算器程序與仿真

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:633559 發(fā)表于 2020-3-26 01:03 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
  首先得說明的是,這個計算器是數(shù)組之間的運算,而不是簡單的a+b或者a*b就得出來結(jié)果了的那種,這樣子運算也不精準啊。以前也發(fā)過一個計算器程序,不滿意,所以想著重寫一個,但一個東西再寫一遍有意思嗎?起碼要加點新東西進去,才能有所長進嘛。為什么不滿意呢?程序中你中有我我中有你就會顯得亂,再加上沒有實物玩,如果是我自己下載了一個別人的這樣的一個程序,我想我是不會完完整整的看的。我總是想把我想要說的東西說的很詳細的那種,讓人一看就懂。但就目前來說,火候還是欠佳,最突出的一點就是,當我寫完程序后再反過來注釋的話,我的心會浮躁。以后,我務(wù)必要寫一段程序注釋一段。所以這次我痛改前非,盡量使程序劃分的比較清晰,我是用實物直接試驗的,本來我是不會再用仿真的,但考慮到?jīng)]有實物的程序也不太好看,我還是弄了個仿真圖,試了下還行,這樣程序好看了點。從寫第一個RTX51 tiny程序到“完整計算器”文件都壓縮了,除了文件“完整計算器”我做了有限測試,其他文件都只是試了下,其中“四則計算器”就存在漏洞。本人水平雖然有限,但分享資料的心天地可鑒,如果我這資料能給他人覺得有所收獲,我很滿足。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


全部資料51hei下載地址:
RTX51 tiny.rar (9.25 MB, 下載次數(shù): 66)

評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:328014 發(fā)表于 2020-3-26 02:48 | 只看該作者
好資料,51黑有你更精彩!!!樓主的主程序:
  1. #include "yunsuan.h"

  2. u8 jshcq[16]={0};                                    //計算結(jié)果緩存區(qū)
  3. _SU shushu1={0,0,{0,0,0,0,0,0,0,0,0,0,0,0,0,0}};     //前數(shù)
  4. _SU shushu2={0,0,{0,0,0,0,0,0,0,0,0,0,0,0,0,0}};     //后數(shù)

  5. extern u8 da;    //定義靜態(tài)變量da,對應(yīng)LCD顯示字符位置

  6. /**********************************************
  7. *功能:LCD顯示數(shù)組清零
  8. **********************************************/
  9. void Lcd_qinpin(void)
  10. {
  11.   u8 i;                  //定義變量i
  12.         for(i=0;i<16;i++){     //循環(huán)16次
  13.           lcdxs[i]=' ';        //LCD顯示字符數(shù)組清空
  14.         }
  15. }

  16. /**********************************************************************************************************************************
  17. *功能:LCD輸入顯示算式限制函數(shù)
  18. 目的:限制字符的輸入顯示。
  19. 情況分析:1、兩個數(shù)首位都不能是無意義的0。  例如,00.12。
  20.           2、兩個數(shù)的小數(shù)點最多都只能有1個。例如,12.3.4。
  21.           3、兩個數(shù)首位只能是數(shù)字。         例如,.5898。
  22.           4、兩個數(shù)尾位都不能是無效的0。    例如,65.30。
  23.           5、算式中運算符必須有1個。        例如,567。
  24.           (情況分析后補,具體看程序)
  25. zhuangtai對應(yīng)位說明:
  26.   bit[2-0] :  前個顯示字符對應(yīng)的標號(fenzu)。
  27.   bit[3]   :  0)當前輸入數(shù)首位數(shù)字不是0,  1)當前輸入數(shù)首位數(shù)字是0。                
  28.   bit[4]   :  0)字符不顯示,               1)顯示字符。
  29.   bit[5]   :  0)算式后數(shù)沒小數(shù)點,         1)算式后數(shù)有小數(shù)點。
  30.   bit[6]   :  0)算式前數(shù)沒小數(shù)點,         1)算式前數(shù)有小數(shù)點。
  31.   bit[7]   :  0)當前算式?jīng)]有輸入過運算符, 1)當前算式有輸入過運算符。
  32. 輸入算式滿了的情況下,只能按等號鍵有效,通過da判斷實現(xiàn)。
  33. **********************************************************************************************************************************/
  34. u8 Shizhe_Xianzhi(u8 x)
  35. {
  36.         static u8 zhuangtai=0x04;    //給定zhuangtai的初值0x04,為什么是0x04?分析知道首位的限制情況和前一個字符是運算符類似
  37.         u8 fenzu=0;                  //定義變量fenzu,作用如下
  38.         //-------------給輸入按鍵情況分類-------------                    
  39.         if(x=='0'){                  //輸入'0'
  40.                 if(da<16){                 
  41.             fenzu=1;                 //fenzu=1
  42.                 }
  43.         }else{
  44.            if(x>'0'){               
  45.                          if(x=='='){             //輸入'='
  46.                                  fenzu=5;              //fenzu=5
  47.                          }else{                  //輸入'123456789'
  48.                                   if(da<16){
  49.                                     fenzu=2;           //fenzu=2
  50.                                         }
  51.                                 }             
  52.                  }else{
  53.                     if(x=='.'){            //輸入'.'
  54.                                         if(da<16){
  55.                                     fenzu=3;           //fenzu=3
  56.                                         }
  57.                                 }else{                 //輸入'+-*/'       
  58.                                          if(da<16){
  59.              fenzu=4;          //fenzu=4
  60.                                          }                                                 
  61.                                  }
  62.                   }
  63.          }
  64.         zhuangtai&=0xef;                     //zhuangtai字符顯示標志位置0       
  65.         //---------------------按等號鍵的后續(xù)處理-----------------------------------------
  66.         if((zhuangtai&0x07)==0x06){    //上一個狀態(tài)是清除'='按下
  67.           zhuangtai=0x04;              //zhuangtai恢復(fù)初始值
  68.         }
  69.         if((zhuangtai&0x07)==0x05){    //上一個狀態(tài)是計算'='按下
  70.                 if(fenzu==5){                //計算完算式,需再次按'='清屏處理,不然不執(zhí)行任何操作
  71.                   zhuangtai=0x06;            //zhuangtai恢復(fù)初始值
  72.                         zhuangtai|=0x10;           //zhuangtai字符顯示標志位置1       
  73.                         return zhuangtai;          //跳出準備執(zhí)行清屏與相關(guān)數(shù)據(jù)初始化工作
  74.                 }else{
  75.                    return zhuangtai;         //跳出,無操作
  76.                  }  
  77.         }       
  78.   //-------------------------------------按fenzu分類處理--------------------------------------------------------------------------
  79.         switch(fenzu)
  80.         {
  81.                 case 1:
  82.                         if((zhuangtai&0x0f)!=0x09){           //排除一種情況:當前輸入數(shù)首位數(shù)字是0,并且前一個字符是'0'
  83.                                 if((zhuangtai&0x07)==0x04){         //兩種情況:剛開始輸入、前一個字符是運算符
  84.                                   zhuangtai|=0x08;                  //zhuangtai第3位置位
  85.                                 }
  86.                                 zhuangtai&=0xf8;                    //zhuangtai清零后3位
  87.                                 zhuangtai|=0x11;                                            //zhuangtai字符顯示標志位置1、zhuangtai添加后3位狀態(tài)值(1)      
  88.                         }
  89.                         break;
  90.                 case 2:
  91.                         if((zhuangtai&0x0f)!=0x09){           //排除一種情況:當前輸入數(shù)首位數(shù)字是0,并且前一個字符是'0'
  92.                           zhuangtai&=0xf8;                    //zhuangtai清零后3位
  93.         zhuangtai|=0x12;                                            //zhuangtai字符顯示標志位置1、zhuangtai添加后3位狀態(tài)值(2)                    
  94.                         }
  95.                         break;
  96.                 case 3:
  97.                         //排除情況:前一個字符是小數(shù)點、前一個字符是運算符、當前算式有小數(shù)點沒有運算符、當前算式有運算符有小數(shù)點
  98.                         if(((zhuangtai&0x07)!=0x03)&&((zhuangtai&0x07)!=0x04)&&((zhuangtai&0xc0)!=0x40)&&((zhuangtai&0xa0)!=0xa0)){
  99.                           zhuangtai&=0xf8;                    //zhuangtai清零后3位
  100.                                 if(zhuangtai&0x80){                 //當前算式有運算符
  101.                                   zhuangtai|=0x20;                  //zhuangtai第5位置位
  102.                                 }else{                              //當前算式?jīng)]有運算符
  103.                                    zhuangtai|=0x40;                 //zhuangtai第6位置位
  104.                                  }
  105.                                 zhuangtai&=0xf7;                    //zhuangtai第3位(首位數(shù)字0標志位)清零(有小數(shù)點后,首位是不是0,對輸入數(shù)字字符沒影響)
  106.         zhuangtai|=0x13;                                            //zhuangtai字符顯示標志位置1、zhuangtai添加后3位狀態(tài)值(3)   
  107.                         }
  108.                         break;
  109.                 case 4:
  110.                         //排除情況:前一個字符是小數(shù)點、前一個字符是運算符、前數(shù)有小數(shù)點前一個字符是0、算式輸入過一次運算符
  111.                         if(((zhuangtai&0x07)!=0x03)&&((zhuangtai&0x07)!=0x04)&&((zhuangtai&0xc7)!=0x41)&&((zhuangtai&0x80)!=0x80)){
  112.                           zhuangtai&=0xf8;                    //zhuangtai清零后3位
  113.                                 zhuangtai&=0xf7;                    //zhuangtai第3位(首位數(shù)字0標志位)清零
  114.         zhuangtai|=0x94;                                            //zhuangtai字符顯示標志位置1、zhuangtai第7位置位、zhuangtai添加后3位狀態(tài)值(4)
  115.                         }
  116.                         break;
  117.                 case 5:
  118.                         //排除情況:前一個字符是小數(shù)點、前一個字符是運算符、后數(shù)有小數(shù)點前一個字符是0、算式?jīng)]輸入過運算符
  119.                         if(((zhuangtai&0x07)!=0x03)&&((zhuangtai&0x07)!=0x04)&&((zhuangtai&0xa7)!=0xa1)&&(zhuangtai&0x80)){
  120.                           zhuangtai&=0xf8;                    //zhuangtai清零后3位
  121.         zhuangtai|=0x15;                                            //zhuangtai字符顯示標志位置1、zhuangtai添加后3位狀態(tài)值(5)
  122.                         }else{
  123.                                  //輸入算式不合理的情況下
  124.                            zhuangtai=0x16;                    //zhuangtai字符顯示標志位置1、zhuangtai添加后3位狀態(tài)值(6)
  125.                          }
  126.                         break;
  127.                 default:
  128.                         break;
  129.         }
  130.         //--------------------------------------------------------------------------------------------------------------------------------
  131.         return zhuangtai;                         //返回按鍵狀態(tài)值
  132. }

  133. /**********************************************************************************************************
  134. *功能:結(jié)構(gòu)體數(shù)據(jù)隨輸入字符改變
  135. 目的:隨著輸入字符,改變相應(yīng)的結(jié)構(gòu)體數(shù)據(jù)(用于四則運算)。
  136. 具體情況:記錄,shushu1.zscd           //前數(shù)整數(shù)個數(shù)     
  137.                shushu1.sscd           //前數(shù)小數(shù)個數(shù)
  138.                shushu1.shujuabc[]     //去除小數(shù)點后的前數(shù)數(shù)據(jù)
  139.                shushu2.zscd           //后數(shù)整數(shù)個數(shù)
  140.                shushu2.sscd           //后數(shù)小數(shù)個數(shù)
  141.                shushu2.shujuabc[]     //去除小數(shù)點后的后數(shù)數(shù)據(jù)
  142. **********************************************************************************************************/
  143. void Jiegou_Chuli(u8 xcu)
  144. {
  145.         static u8 i=0,xs=0,ys=0;                  //定義變量i對應(yīng)shujuabc[]標號,變量xs對應(yīng)小數(shù)點,變量ys對應(yīng)運算符
  146.         if(xcu!='='){                             //按下的不是等號鍵
  147.           if(xcu>='0'){                           //輸入數(shù)字
  148.       if(xs==0){                                     
  149.                                 if(ys==0){                          //(輸入算式?jīng)]小數(shù)點、沒運算符)前數(shù)整數(shù)部分       
  150.                                   shushu1.zscd++;                   //前數(shù)整數(shù)對應(yīng)個數(shù)加一
  151.                       shushu1.shujuabc[i]=xcu-0x30;     //輸入字符數(shù)字存入shushu1.shujuabc[]
  152.                                 }else{                              //(輸入算式?jīng)]小數(shù)點、有運算符)后數(shù)整數(shù)部分       
  153.                                    shushu2.zscd++;                  //后數(shù)整數(shù)對應(yīng)個數(shù)加一
  154.                        shushu2.shujuabc[i]=xcu-0x30;    //輸入字符數(shù)字存入shushu2.shujuabc[]
  155.                                  }
  156.                   }else{
  157.                      if(xs==1){                     
  158.                              if(ys==0){                       //(輸入算式有一個小數(shù)點、沒運算符)前數(shù)小數(shù)部分       
  159.                                            shushu1.sscd++;                //前數(shù)小數(shù)對應(yīng)個數(shù)加一
  160.                                      shushu1.shujuabc[i]=xcu-0x30;  //輸入字符數(shù)字存入shushu1.shujuabc[]
  161.                                    }else{                           //(輸入算式前數(shù)有小數(shù)點、有運算符)后數(shù)整數(shù)部分
  162.                                       shushu2.zscd++;               //后數(shù)整數(shù)對應(yīng)個數(shù)加一
  163.                           shushu2.shujuabc[i]=xcu-0x30; //輸入字符數(shù)字存入shushu2.shujuabc[]
  164.                                     }
  165.                            }else{                             //(輸入算式后數(shù)有小數(shù)點、有運算符)后數(shù)小數(shù)部分
  166.                               shushu2.sscd++;                 //后數(shù)小數(shù)對應(yīng)個數(shù)加一
  167.                                     shushu2.shujuabc[i]=xcu-0x30;   //輸入字符數(shù)字存入shushu2.shujuabc[]
  168.                             }
  169.                    }                          
  170.                   i++;                                  //變量i加一
  171.           }else{
  172.                    if(xcu=='.'){                        //是小數(shù)點
  173.                            if(ys==0){                         //當前沒有運算符
  174.                              xs=1;                            //xs=1,表示前數(shù)有小數(shù)點了
  175.                            }else{                             //當前有運算符
  176.                               xs=2;                           //xs=2,表示后數(shù)有小數(shù)點了
  177.                             }                                 
  178.                    }else{                               //是運算符
  179.                                   i=0;                              //變量i置零,開始對應(yīng)后數(shù)存儲數(shù)組shujuabc[]
  180.                       ys=1;                             //ys=1,表示運算符有了
  181.                     }
  182.            }
  183.         }else{                                    //按下的是等號鍵
  184.            i=0;                                   //變量初始化,準備下次運算
  185.                  xs=0;
  186.                  ys=0;
  187.          }
  188. }

  189. /*********************************************************************************************
  190. *功能:結(jié)構(gòu)體數(shù)據(jù)初始化
  191. 目的:結(jié)構(gòu)體數(shù)據(jù)和計算結(jié)果存儲數(shù)組初始化,為下次運算準備。
  192. *********************************************************************************************/
  193. void Jiegou_Csh(void)
  194. {
  195. //---------初始化結(jié)構(gòu)體數(shù)據(jù)和計算結(jié)果存儲數(shù)組---------       
  196.   u8 i;                               //定義變量i
  197.         shushu1.zscd=0;              //前數(shù)整數(shù)個數(shù)置零
  198.         shushu1.sscd=0;              //前數(shù)小數(shù)個數(shù)置零
  199.         shushu2.zscd=0;              //后數(shù)整數(shù)個數(shù)置零
  200.         shushu2.sscd=0;              //后數(shù)小數(shù)個數(shù)置零
  201.         for(i=0;i<14;i++){           //循環(huán)14次  
  202.                 shushu1.shujuabc[i]=0;     //前數(shù)數(shù)據(jù)清零
  203.                 shushu2.shujuabc[i]=0;     //后數(shù)數(shù)據(jù)清零
  204.                 jshcq[i]=0;                //計算結(jié)果存儲數(shù)組前14位清零
  205.         }
  206.         jshcq[14]=0;                 //計算結(jié)果存儲數(shù)組15位清零
  207.         jshcq[15]=0;                 //計算結(jié)果存儲數(shù)組16位清零
  208. }

  209. /********************************************************************************************************************
  210. *功能:運算符判斷
  211. 目的:以運算符分類處理四則運算。
  212. ********************************************************************************************************************/
  213. u8 Yunsf_Jl(void)
  214. {
  215.         u8 ysf;                                    //ysf用作運算符記錄
  216.         if(shushu1.sscd==0){                       //沒有小數(shù)部分
  217.           ysf=lcdxs[shushu1.zscd];                 //前數(shù)的整數(shù)部分長度就是運算符在lcdxs[]中的位置
  218.         }else{                                     //有小數(shù)部分
  219.            ysf=lcdxs[shushu1.zscd+shushu1.sscd+1]; //前數(shù)的整數(shù)部分加前數(shù)的小數(shù)部分長度再加小數(shù)位就是運算符在lcdxs[]中的位置
  220.          }
  221.         return ysf;                                //返回ysf
  222. }

  223. /**********************************************************************************************************************************************************
  224. *功能:乘法函數(shù)
  225. **********************************************************************************************************************************************************/
  226. u8 Chengfa(void)
  227. {
  228.         u8 ic=0,jc=0,nc=0,mc=0;                                                            //前數(shù)開始運算位,后數(shù)開始運算位,計算結(jié)果存儲位置變量,計算結(jié)果存儲起始位
  229.         ic=shushu1.zscd+shushu1.sscd-1;                                                    //賦值“前數(shù)的的尾位在shushu1.shujuabc[]中的位置”給ic
  230.         jc=shushu2.zscd+shushu2.sscd-1;                                                    //賦值“后數(shù)的的尾位在shushu2.shujuabc[]中的位置”給jc
  231.         if(((ic==0)&&(shushu1.shujuabc[ic]==0))||((jc==0)&&(shushu2.shujuabc[jc]==0))){    //前數(shù)和后數(shù)中至少一個是0
  232.                 jshcq[0]=0;                                                                      //顯示計算結(jié)果'0'
  233.                 return 0xf0;                                                                     //跳出
  234.         }
  235.         //----------------------------循環(huán)0---------------------------------------------------------
  236.         do
  237.         {
  238.           jshcq[nc]+=shushu2.shujuabc[jc]*shushu1.shujuabc[ic];     //存儲兩數(shù)運算結(jié)果
  239.           if(jshcq[nc]>9){                                          //兩數(shù)運算結(jié)果是2位數(shù)
  240.                         jshcq[nc+1]+=jshcq[nc]/10;                              //高位累加進位
  241.                         jshcq[nc]%=10;                                          //低位取個位
  242.                 }
  243.                 if(ic!=0){                                                //前數(shù)數(shù)據(jù)沒取完
  244.                   ic--;                                                   //前數(shù)運算位左移
  245.                         nc++;                                                   //運算結(jié)果存儲位右移
  246.                 }else{                                                    //前數(shù)數(shù)據(jù)取完了
  247.                    if(jc!=0){                                             //后數(shù)數(shù)據(jù)沒取完
  248.          ic=shushu1.zscd+shushu1.sscd-1;                      //前數(shù)起始位初始值                         
  249.                            jc--;                                                //后數(shù)運算位左移
  250.                                  mc++;                                                //存儲結(jié)果起始位右移
  251.                                  nc=mc;                                                                        //賦值給nc
  252.                          }else{                                                 //后數(shù)數(shù)據(jù)取完了
  253.                                   if(jshcq[nc+1]!=0){                                 //如果計算完有進位
  254.                                           nc++;                                             //相應(yīng)的nc加一
  255.                                         }
  256.                             break;                                              //跳出循環(huán)   <<<====(循環(huán)0,出口)
  257.                           }
  258.                  }                 
  259.         }while(1);
  260.         //--------------------------------------------------------------------------------------------
  261.         jc=15;                                          //jc賦值15,作用不同上面
  262.         if((shushu1.sscd!=0)||(shushu2.sscd!=0)){       //前數(shù)和后數(shù)中至少有一個有小數(shù)點
  263.           jc=nc-(shushu1.sscd+shushu2.sscd);            //計算結(jié)果總長度(不算小數(shù)點)-兩個數(shù)小數(shù)部分長度和。jc是小數(shù)點在lcdxs[]中的位置
  264.         }       
  265.         mc=(jc<<4)+nc;                                  //高四位存小數(shù)點位,低四位存計算結(jié)果長度
  266.   return mc;                                      //帶出mc
  267. }

  268. /***************************************************************************************************************************************
  269. *功能:加法函數(shù)
  270. ***************************************************************************************************************************************/
  271. u8 Jiafa(void)
  272. {
  273.   u8 ic=0,jc=0,nc=0,mc=0;                        //前數(shù)開始運算位,后數(shù)開始運算位,計算結(jié)果存儲位置變量,計算結(jié)果存儲起始位
  274.         ic=shushu1.zscd+shushu1.sscd-1;                //賦值“前數(shù)的的尾位在shushu1.shujuabc[]中的位置”給ic
  275.         jc=shushu2.zscd+shushu2.sscd-1;                //賦值“后數(shù)的的尾位在shushu2.shujuabc[]中的位置”給jc
  276.         //-------------------處理前數(shù)和后數(shù)小數(shù)位較長的部分--------------------------
  277.         if(shushu1.sscd>shushu2.sscd){                 //前數(shù)的小數(shù)部分比后數(shù)的小數(shù)部分長
  278.                 do
  279.                 {
  280.                         if(ic-shushu1.zscd==jc-shushu2.zscd){      //直到取到小數(shù)位一樣長后
  281.                           break;                                   //跳出         <<<====(出口)
  282.                         }else{
  283.                                  jshcq[nc]+=shushu1.shujuabc[ic];        //小數(shù)位長的直接賦值給jshcq[]
  284.                            nc++;                                   //存儲位遞加
  285.                                  ic--;                                   //移位取下一位小數(shù)位
  286.                          }
  287.                 }while(1);
  288.     mc=shushu1.sscd;                                         //小數(shù)點位置計算用到
  289.         }else{
  290.                  if(shushu1.sscd!=shushu2.sscd){             //小數(shù)位等長不用處理
  291.                    do
  292.                    {
  293.                            if(ic-shushu1.zscd==jc-shushu2.zscd){   //直到取到小數(shù)位一樣長后
  294.                              break;                                //跳出         <<<====(出口)
  295.                            }else{
  296.                                           jshcq[nc]+=shushu2.shujuabc[jc];     //小數(shù)位長的直接賦值給jshcq[]
  297.                               nc++;                                //存儲位遞加
  298.                                     jc--;                                //移位取下一位小數(shù)位
  299.                             }
  300.                    }while(1);
  301.                  }
  302.                  mc=shushu2.sscd;                            //小數(shù)點位置計算用到
  303.          }
  304.         //-------------------處理另一部分--------------------------------------------------
  305.         do
  306.         {
  307.                 jshcq[nc]+=shushu1.shujuabc[ic]+shushu2.shujuabc[jc];    //兩數(shù)中間部分相加
  308.     if(jshcq[nc]>9){                                         //兩數(shù)運算結(jié)果是2位數(shù)
  309.                         jshcq[nc+1]+=jshcq[nc]/10;                             //高位累加進位
  310.                         jshcq[nc]%=10;                                         //低位取個位
  311.                 }               
  312.                 if((ic!=0)&&(jc!=0)){                                    //兩個數(shù)數(shù)據(jù)都沒取完            
  313.                         nc++;
  314.                         ic--;
  315.                         jc--;
  316.                 }else{
  317.                    if((ic==0)&&(jc==0)){                                 //兩個數(shù)數(shù)據(jù)都取完
  318.                            break;                                              //跳出     <<<====(出口)
  319.                          }else{
  320.                             if(ic==0){                                         //前數(shù)數(shù)據(jù)取完
  321.                                                 //-------------------后數(shù)整數(shù)部分長出的部分處理---------------------------
  322.                                                 do{
  323.                                                         if(jc==0){
  324.                                                                 break;                                       //跳出     <<<====(出口)
  325.                                                         }else{         
  326.                                                            nc++;
  327.                                                                  jc--;
  328.                                                          }
  329.                                                         jshcq[nc]+=shushu2.shujuabc[jc];               //后數(shù)整數(shù)長的部分再取
  330.                                                         if(jshcq[nc]>9){                               //兩數(shù)運算結(jié)果是2位數(shù)
  331.                                   jshcq[nc+1]+=jshcq[nc]/10;                   //高位累加進位
  332.                                   jshcq[nc]%=10;                               //低位取個位
  333.                           }         
  334.                                                 }while(1);
  335.                                                 //------------------------------------------------------------------------
  336.                                         }else{                                             //后數(shù)數(shù)據(jù)取完
  337.                                                  //-------------------前數(shù)整數(shù)部分長出的部分處理---------------------------
  338.                                                  do{
  339.                                                          if(ic==0){
  340.                                                            break;                                      //跳出     <<<====(出口)
  341.                                                          }else{         
  342.                                                             nc++;
  343.                                                                   ic--;
  344.                                                           }
  345.                                                          jshcq[nc]+=shushu1.shujuabc[ic];              //前數(shù)整數(shù)長的部分再取
  346.                                                          if(jshcq[nc]>9){                              //兩數(shù)運算結(jié)果是2位數(shù)
  347.                                    jshcq[nc+1]+=jshcq[nc]/10;                  //高位累加進位
  348.                                    jshcq[nc]%=10;                              //低位取個位
  349.                            }
  350.                                                  }while(1);
  351.                                                  //------------------------------------------------------------------------                                  
  352.                                          }
  353.                                         break;                                             //跳出
  354.                           }
  355.                  }
  356.         }while(1);
  357.         if(jshcq[nc+1]>0){                                         //高位有進位的情況
  358.                 nc++;
  359.         }
  360.   //------------------------------------------------------------------------------------
  361.         jc=15;
  362.         if((shushu1.sscd!=0)||(shushu2.sscd!=0)){
  363.           jc=nc-mc;                                                //計算結(jié)果總長度(不算小數(shù)點)-小數(shù)部分長度。小數(shù)點在lcdxs[]中的位置
  364.         }       
  365.         mc=(jc<<4)+nc;                                             //高四位存小數(shù)點位,低四位存計算結(jié)果長度
  366.   return mc;
  367. }

  368. /******************************************************************************************************************************************
  369. *功能:減法函數(shù)
  370. ******************************************************************************************************************************************/
  371. u8 Jianfa(void)
  372. {
  373.   u8 ic=0,jc=0,nc=0,mc=0;
  374.         //-----------------------------比較前數(shù)和后數(shù)的大小---------------------------------------------------------------------
  375.         if(shushu1.zscd>shushu2.zscd){                                 //前數(shù)整數(shù)部分比后數(shù)整數(shù)部分長
  376.           mc=1;                                 //前數(shù)比后數(shù)大
  377.         }else{
  378.            if(shushu1.zscd!=shushu2.zscd){                            //前數(shù)整數(shù)部分比后數(shù)整數(shù)部分短
  379.                    mc=2;                              //后數(shù)比前數(shù)大
  380.                  }else{                                                     //前數(shù)整數(shù)部分和后數(shù)整數(shù)部分一樣長
  381.                     do
  382.                                 {
  383.                             if(shushu1.shujuabc[ic]>shushu2.shujuabc[jc]){        //前數(shù)高位比后數(shù)高位大
  384.                                     mc=1;
  385.                                                 break;                  //跳出
  386.                                   }else{
  387.                                      if(shushu1.shujuabc[ic]!=shushu2.shujuabc[jc]){    //前數(shù)高位比后數(shù)高位小
  388.                                              mc=2;
  389.                                                          break;               //跳出
  390.                                            }else{                                             //前數(shù)高位和后數(shù)高位一樣大
  391.                                               if((ic!=shushu1.zscd+shushu1.sscd-1)&&(jc!=shushu2.zscd+shushu2.sscd-1)){       //前數(shù)和后數(shù)數(shù)據(jù)都沒有取完
  392.                               ic++;
  393.                                                                         jc++;
  394.                                                                 }else{                                         
  395.                                                                    if((ic==shushu1.zscd+shushu1.sscd-1)&&(jc==shushu2.zscd+shushu2.sscd-1)){    //前數(shù)和后數(shù)數(shù)據(jù)都取完
  396.                                                                            mc=0;          //前數(shù)和后數(shù)一樣大
  397.                                                                                  break;         //跳出
  398.                                                                          }else{
  399.                                                                             if(ic==shushu1.zscd+shushu1.sscd-1){      //前數(shù)數(shù)據(jù)取完,后數(shù)沒取完
  400.                                                                                           mc=2;
  401.                                                                                                 break;                        //跳出                                                               
  402.                                                                                         }else{                                    //后數(shù)數(shù)據(jù)取完,前數(shù)沒取完
  403.                                                                                            mc=1;
  404.                                                                                                  break;     //跳出
  405.                                                                                          }
  406.                                                                           }                                                                        
  407.                                                                  }                                                       
  408.                                             }
  409.                                    }
  410.                           }while(1);
  411.                   }
  412.          }
  413.         //-----------------------------------------------------------------------------------------------------------------------
  414.         ic=shushu1.zscd+shushu1.sscd-1;
  415.         jc=shushu2.zscd+shushu2.sscd-1;
  416.         switch(mc)
  417.         {
  418.           case 0:
  419.                   jshcq[0]=0;                                                   //顯示計算結(jié)果'0'
  420.                         break;
  421.                 case 1:     //與下面mc=2是一樣的,下面?zhèn)渥⒃敿汓c
  422.                         if(shushu1.sscd>=shushu2.sscd){                               //前數(shù)不比后數(shù)小數(shù)部分短
  423.                           do
  424.                                 {
  425.                                         if(ic-shushu1.zscd==jc-shushu2.zscd){                     //直到取到小數(shù)位一樣長后                     
  426.                                                 break;                                                  //跳出
  427.                             }else{
  428.                                      jshcq[nc]=shushu1.shujuabc[ic];                        //小數(shù)位長的直接賦值給jshcq[]
  429.                                nc++;                                                  //存儲位遞加
  430.                                      ic--;                                                  //移位取下一位小數(shù)位
  431.                              }
  432.                                  }while(1);                       
  433.                   }else{                                                        //前數(shù)比后數(shù)小數(shù)部分短
  434.                                  shushu1.shujuabc[ic]--;                                    //減一
  435.                                  jshcq[nc]=10-shushu2.shujuabc[jc];
  436.                                  nc++;
  437.                                  jc--;
  438.                                  do
  439.                                  {
  440.                              if(ic-shushu1.zscd==jc-shushu2.zscd){                    //直到取到小數(shù)位一樣長后                     
  441.                                                  break;                                                 //跳出
  442.                              }else{
  443.                                       jshcq[nc]=9-shushu2.shujuabc[jc];
  444.                                 nc++;                                                 //存儲位遞加
  445.                                       jc--;                                                 //移位取下一位小數(shù)位
  446.                               }
  447.                                  }while(1);                                         
  448.                          }                 
  449.                         do
  450.                         {
  451.                                 if(shushu1.shujuabc[ic]>=shushu2.shujuabc[jc]){             //前數(shù)不比后數(shù)小
  452.                                         jshcq[nc]+=shushu1.shujuabc[ic]-shushu2.shujuabc[jc];     //前數(shù)-后數(shù)
  453.                                         if(jc==0){                                                //后數(shù)取完了                                             
  454.                                                 do
  455.                                                 {
  456.               if(ic!=0){                                            //前數(shù)沒取完
  457.                                                           nc++;                  
  458.                                                                 ic--;       
  459.                                                         }else{
  460.                                                                  break;
  461.                                                          }       
  462.               jshcq[nc]+=shushu1.shujuabc[ic];                                                        
  463.                                                 }while(1);       
  464.                                                 break;                                                  //前數(shù)取完跳出循環(huán)                                                                               
  465.                                         }else{
  466.                                                  ic--;
  467.                                                  jc--;
  468.                                                  nc++;
  469.                                          }
  470.                                 }else{                                                      //前數(shù)比后數(shù)小
  471.                                          shushu1.shujuabc[ic]+=10;                                //加10
  472.                                          if(shushu1.shujuabc[ic-1]!=0){                           //當前運算前數(shù)的前一位不等于0
  473.                                                  shushu1.shujuabc[ic-1]--;                              //減一位
  474.                                                  
  475.                                          }else{                                                   //當前運算前數(shù)的前一位等于0
  476.                                                         mc=ic;                                                //mc的作用變了
  477.                                                         ic--;
  478.                                                         do
  479.                                                         {                                                                    
  480.                                                                 shushu1.shujuabc[ic]=9;                             //0位置9
  481.                                                                 if(shushu1.shujuabc[ic-1]!=0){                      //找可以減的位
  482.                                                                         shushu1.shujuabc[ic-1]--;                                                                                            //減一
  483.                                                                         break;                                            //跳出
  484.                                                           }else{                                                                                                          //再找
  485.                                                                          ic--;                                       
  486.                                                                  }
  487.                                                         }while(1);
  488.               ic=mc;                                                                               
  489.                                                 }
  490.                                  }                                                       
  491.                         }while(1);
  492.                         break;
  493.                 case 2:       
  494.                         if(shushu2.sscd>=shushu1.sscd){                               //后數(shù)不比前數(shù)小數(shù)部分短  <<<=====(分情況實現(xiàn))
  495.                           //---------------------------------------------------------------------------------------------------
  496.                                 do
  497.                                 {
  498.                                         if(ic-shushu1.zscd==jc-shushu2.zscd){                     //直到取到小數(shù)位一樣長后        <<<=====(目的)     
  499.                                                 break;                                                  //跳出
  500.                             }else{
  501.                                      jshcq[nc]=shushu2.shujuabc[jc];                        //小數(shù)位長的直接賦值給jshcq[]
  502.                                nc++;                                                  //存儲位遞加
  503.                                      jc--;                                                  //移位取下一位小數(shù)位
  504.                              }
  505.                                  }while(1);                       
  506.                                 //---------------------------------------------------------------------------------------------------
  507.                   }else{                                                        //后數(shù)比前數(shù)小數(shù)部分短
  508.                                  //--------------------------------------------------------------------------------------------------
  509.                                  shushu2.shujuabc[jc]--;                                    //減一
  510.                                  jshcq[nc]=10-shushu1.shujuabc[ic];
  511.                                  nc++;
  512.                                  ic--;
  513.                                  do
  514.                                  {
  515.                              if(ic-shushu1.zscd==jc-shushu2.zscd){                    //直到取到小數(shù)位一樣長后        <<<=====(目的)             
  516.                                                  break;                                                 //跳出
  517.                              }else{
  518.                                       jshcq[nc]=9-shushu1.shujuabc[ic];
  519.                                 nc++;                                                 //存儲位遞加
  520.                                       ic--;                                                 //移位取下一位小數(shù)位
  521.                               }
  522.                                  }while(1);       
  523.          //--------------------------------------------------------------------------------------------------                                 
  524.                          }
  525.       //-----------------------------循環(huán)0-------------------------------------------------------------------                       
  526.                         do
  527.                         {
  528.                                 if(shushu2.shujuabc[jc]>=shushu1.shujuabc[ic]){             //后數(shù)不比前數(shù)小
  529.                                         jshcq[nc]+=shushu2.shujuabc[jc]-shushu1.shujuabc[ic];     //后數(shù)-前數(shù)
  530.                                         if(ic==0){                                                //前數(shù)取完了                                         
  531.                                                 //------------------------循環(huán)2-----------------------------------------------------
  532.                                                 do
  533.                                                 {
  534.               if(jc!=0){                                            //后數(shù)沒取完
  535.                                                                 nc++;                  
  536.                                                                 jc--;                  
  537.                                                         }else{                                                //后數(shù)取完了           
  538.                                                                  break;                                             //跳出  <<<====(循環(huán)2,出口)
  539.                                                          }
  540.                jshcq[nc]+=shushu2.shujuabc[jc];                                                                
  541.                                           }while(1);
  542.             //----------------------------------------------------------------------------------                                       
  543.                                                 nc++;
  544.                                                 jshcq[nc]='-'-0x30;                                                        //負號先記上
  545.                                                 break;                                                  //后數(shù)取完跳出循環(huán)   <<<=====(循環(huán)0,出口)                                                                               
  546.                                         }else{
  547.                                                  ic--;
  548.                                                  jc--;
  549.                                                  nc++;
  550.                                          }
  551.                                 }else{                                                      //后數(shù)比前數(shù)小
  552.                                          shushu2.shujuabc[jc]+=10;                                //加10
  553.                                          if(shushu2.shujuabc[jc-1]!=0){                           //當前運算后數(shù)的前一位不等于0
  554.                                                  shushu2.shujuabc[jc-1]--;                              //減一位
  555.                                                  
  556.                                          }else{                                                   //當前運算后數(shù)的前一位等于0
  557.                                                         //-------------------------------循環(huán)1---------------------------------------------------------
  558.                                                   mc=jc;                                                //mc的作用變了
  559.                                                         jc--;
  560.                                                         do
  561.                                                         {                                                                    
  562.                                                                 shushu2.shujuabc[jc]=9;                             //0位置9
  563.                                                                 if(shushu2.shujuabc[jc-1]!=0){                      //找可以減的位
  564.                                                                         shushu2.shujuabc[jc-1]--;                                                                                            //不夠減,高位要         <<<=====(循環(huán)1,目的)       
  565.                                                                         break;                                            //跳出
  566.                                                           }else{                                                                                                          //再找
  567.                                                                          ic--;                                       
  568.                                                                  }
  569.                                                         }while(1);
  570.               jc=mc;       
  571.               //---------------------------------------------------------------------------------------------                                                       
  572.                                                 }
  573.                                  }                                                       
  574.                         }while(1);
  575.                         //-----------------------------------------------------------------------------------------------------       
  576.                         break;
  577.                 default:
  578.                         break;
  579.         }
  580.         jc=15;
  581.         if(shushu1.sscd>=shushu2.sscd){                 //沒有多余變量可以利用,只能再判斷一次小數(shù)部分長短
  582.           mc=shushu1.sscd;
  583.         }else{
  584.            mc=shushu2.sscd;
  585.          }
  586.         if((shushu1.sscd!=0)||(shushu2.sscd!=0)){
  587.           jc=nc-mc;                                     //計算結(jié)果總長度(不算小數(shù)點)-小數(shù)部分長度。小數(shù)點在lcdxs[]中的位置
  588.         }       
  589.         mc=(jc<<4)+nc;                                  //高四位存小數(shù)點位,低四位存計算結(jié)果長度
  590.   return mc;
  591. }

  592. /*********************************************************************************************************
  593. *功能:除法函數(shù)
  594. *********************************************************************************************************/
  595. u8 Chufa(void)
  596. {
  597.         u8 ic=0,jc=0,nc=0,mc=0,gc=0,xc=0;       
  598.         //--------------------------------特殊情況處理-----------------------------------------------------------
  599.         if((shushu2.shujuabc[0]==0)&&(shushu2.zscd==1)&&(shushu2.sscd==0)){   //后數(shù)是0的情況,不進行運算
  600.                 Lcd_qinpin();                                                       //LCD顯示數(shù)組清零
  601.                 lcdxs[0]='x';                                                       //無法計算結(jié)果
  602.                 return 0xff;
  603.         }
  604.         if((shushu1.shujuabc[0]==0)&&(shushu1.zscd==1)&&(shushu1.sscd==0)){   //前數(shù)是0的情況
  605.                 Lcd_qinpin();                                                       //LCD顯示數(shù)組清零,準備存儲計算結(jié)果
  606.                 lcdxs[0]='0';                                                       //計算結(jié)果是0
  607.                 return 0xff;
  608.         }
  609.         //--------------------------------------------------------------------------------------------------------
  610.         while(shushu1.shujuabc[ic]==0){             //前數(shù)是0的位不用運算   
  611.           ic++;
  612.         }
  613.         while(shushu2.shujuabc[jc]==0){             //后數(shù)是0的位不用運算   
  614.           jc++;
  615.         }
  616.         xc=shushu2.zscd-shushu1.zscd+ic-jc+15;      //小數(shù)點位置
  617.         mc=jc<<4;                                   //當前jc值存入mc高四位,jc最大13,4位足以存儲
  618.         //---------------------------------大循環(huán)0號,直到計算出16位計算結(jié)果才跳出------------------------------------------------
  619.         do
  620.         {               
  621.                 mc&=0xf0;                                          //清除低四位
  622.                 mc|=ic;                                            //記錄ic的值,存入mc低四位 (關(guān)鍵點:mc之前的數(shù)據(jù)一定是0)
  623.                 if(nc!=16){                                        //計算結(jié)果沒滿16位
  624.                         if((mc&0x0f)>=14-shushu2.zscd-shushu2.sscd){     //“前數(shù)截取部分的長度首位置之后的剩余的長度”不會比“后數(shù)的長度”長
  625.                     //----------------------------------循環(huán)1號,為了能計算出足有16位的結(jié)果----------------------------------------------
  626.                                 jc=0;                                          //這里jc的作用是一個起始值為0的變量
  627.                     do
  628.                     {
  629.                       shushu1.shujuabc[jc]=shushu1.shujuabc[ic];   //將剩余的有效數(shù)字重新以shushu1.shujuabc[0]為起始順序存儲
  630.                             shushu1.shujuabc[ic]=0;                      //清除
  631.                             if(ic==13){                                  //數(shù)據(jù)重存完
  632.                               break;                                     //跳出
  633.                             }else{                                       //繼續(xù)轉(zhuǎn)存有效數(shù)據(jù)
  634.                                jc++;
  635.                                      ic++;
  636.                              }
  637.                     }while(1);
  638.                     ic=0;                                          //相應(yīng)的變量值也將改變,實現(xiàn)一個14位數(shù)據(jù)的數(shù)組當一個28位數(shù)據(jù)的數(shù)組使用    <<<====(循環(huán)1號,目的)
  639.                     mc&=0xf0;                                      //清除低四位,mc低四位清零,同步ic值
  640.                     jc=mc>>4;                                      //jc恢復(fù)初始值
  641.                                 //-----------------------------------------------------------------------------------------------------------------
  642.                         }
  643.           }else{                           //得到16位計算結(jié)果                                                                         <<<====(大循環(huán)0號,目的)
  644.              break;                        //跳出
  645.            }
  646.                 //-----------------------循環(huán)2號,截取前數(shù)(可減后數(shù),即必須比后數(shù)大)部分-------------------------------------------------------------------------------
  647.           do
  648.           {
  649.                   if(shushu1.shujuabc[ic]>shushu2.shujuabc[jc]){         //從高位開始比較  
  650.         ic=(mc&0x0f)+shushu2.zscd+shushu2.sscd-1;                         //前數(shù)截取長度和后數(shù)等長
  651.                           break;              //跳出(大的時候會跳出)                                                                 <<<====(出口1)
  652.                   }else{
  653.                            if(shushu1.shujuabc[ic]!=shushu2.shujuabc[jc]){     //前數(shù)比后數(shù)小                         
  654.                                    if(shushu1.shujuabc[ic]!=0){                      //該位不是0,前數(shù)截取長度比后數(shù)多1位肯定比后數(shù)大
  655.                                      ic=(mc&0x0f)+shushu2.zscd+shushu2.sscd;         //前數(shù)截取比后數(shù)多1位數(shù)
  656.                                                  if(!(gc&0x80)){                                 //gc最高位是0,在gc最高位是1的情況下nc不能加加
  657.                                                    nc++;                                         //計算結(jié)果位置移位
  658.                                                          gc|=0x80;                                     //最高位置1,表示前數(shù)截取部分比后數(shù)長1位數(shù)
  659.                                                  }                                                 
  660.                                    }else{                                            //該位是0
  661.                                                   if(ic==mc){                                    //0是前數(shù)截取部分第一位
  662.                                                                 ic++;                                        //判斷位移位
  663.                                                     mc++;                                        //mc低四位加一同步ic
  664.                                               jc=mc>>4;                                    //后數(shù)回到起始位置
  665.                                                     gc&=0x7f;                                    //高位置0,表示
  666.                                               gc|=0x01;                                    //gc最低位作為這一情況的標志,表示不用運算
  667.                                                                 nc++;
  668.                                                         }else{                                         //0是前數(shù)截取部分非首位,首位肯定不是0,這種情況是前數(shù)截取部分減了后數(shù)若干次后的結(jié)果小于后數(shù)了
  669.                                                            ic=(mc&0x0f)+shushu2.zscd+shushu2.sscd;     //前數(shù)截取比后數(shù)多1位數(shù)
  670.                                                                  if(!(gc&0x80)){                             //gc最高位是0,在gc最高位是1的情況下nc不能加加,比如,4480-452=4028,4028-452這種情況nc不能加
  671.                                                        nc++;                                     //計算結(jié)果位置移位
  672.                                                              gc|=0x80;                                 //最高位置1,表示前數(shù)截取部分比后數(shù)長1位數(shù)
  673.                                                      }                       
  674.                                                          }
  675.                                     }       
  676.             break;                                         //跳出(小的時候跳出)                                                                   <<<====(出口2)
  677.                      }else{                                              //前數(shù)和后數(shù)高位一樣大
  678.                                     if(jc!=shushu2.zscd+shushu2.sscd-1){             //后數(shù)數(shù)據(jù)沒有取完,繼續(xù)下位比較
  679.                           ic++;
  680.                                             jc++;
  681.                                     }else{                                           //前數(shù)和后數(shù)一樣大
  682.                                                    ic=(mc&0x0f)+shushu2.zscd+shushu2.sscd-1;                 //前數(shù)截取長度和后數(shù)等長
  683.                break;                                 //跳出(相等的時候跳出)                                                                 <<<====(出口3)
  684.                                      }                                                       
  685.                             }
  686.              }
  687.     }while(1);       
  688.     //----------------------------------------------------------------------------------------------------------------------------------------------------               
  689.           if(!(gc&0x01)){                                                 //gc最低位是1的時候,不進行運算
  690.             jc=shushu2.zscd+shushu2.sscd-1;                               //后數(shù)尾數(shù)開始運算
  691.             //------------------------------------循環(huán)3號,前數(shù)截取部分-后數(shù),求得可減次數(shù),化除法為減法----------------------------------------------
  692.             do
  693.                         {
  694.                     if(shushu1.shujuabc[ic]>=shushu2.shujuabc[jc]){             //前數(shù)不比后數(shù)小                                          
  695.                             shushu1.shujuabc[ic]-=shushu2.shujuabc[jc];               //前數(shù)-后數(shù)
  696.                             if(jc==mc>>4){                                            //后數(shù)取完了
  697.                                                 if(ic!=(mc&0x0f)){                                      //前數(shù)截取部分沒取完       
  698.                                                   if(shushu1.shujuabc[ic-1]==0){                        //前數(shù)多的一位是0
  699.                                                           gc&=0x7f;                                           //最高位置0,表示如果減后的前數(shù)截取部分長度比后數(shù)小的話,存儲位置nc需要加加
  700.                                                         }else{                                                //這里說明肯定比后數(shù)還大,存儲位置nc不能移位
  701.                                                            ic--;
  702.                                                         }                                                               
  703.                                                 }         
  704.                                     break;                        //跳出循環(huán)                                           <<<====(循環(huán)3號,出口)                                                                       
  705.                             }else{
  706.                                      ic--;
  707.                                      jc--;
  708.                              }
  709.                     }else{                                                      //前數(shù)比后數(shù)小
  710.           //----------------------------------只進行數(shù)據(jù)改變,不運算-----------------------------------------------------------
  711.                             shushu1.shujuabc[ic]+=10;                                 //加10
  712.                                         if(shushu1.shujuabc[ic-1]!=0){                            //當前運算前數(shù)的前一位不等于0
  713.                                      shushu1.shujuabc[ic-1]--;                              //減一位
  714.                              }else{                                                   //當前運算前數(shù)的前一位等于0
  715.                                             //-----------------------------循環(huán)4號,尋找可借位高位-----------------------------------------------------------
  716.                                                   gc|=ic;                                               //gc這里的作用是保存當前ic的值,ic最大值13,用gc的低四位足夠
  717.                                             ic--;
  718.                                             do
  719.                                       {                                                                    
  720.                                                     shushu1.shujuabc[ic]=9;                             //0位置9
  721.                                                     if(shushu1.shujuabc[ic-1]!=0){                      //找可以減的位    <<<====(循環(huán)4號,目的)
  722.                                                       shushu1.shujuabc[ic-1]--;                                                                                            //減一
  723.                                                             break;                                            //跳出
  724.                                               }else{                                                                                                          //再找
  725.                                                              ic--;                                       
  726.                                                }
  727.                                             }while(1);
  728.               ic=gc&0x7f;                                           //ic恢復(fù)原保存值
  729.                     gc&=0x80;                                             //保留最高位,清除其他位                                           
  730.               //--------------------------------------------------------------------------------------------------------------                                               
  731.                                     }
  732.                                          //-----------------------------------------------------------------------------------------------------------------
  733.                      }                                                       
  734.             }while(1);
  735.                         //------------------------------------------------------------------------------------------------------------------------------------
  736.             jshcq[nc]++;                                                  //前數(shù)截取部分和后數(shù)減一次,計算結(jié)果累加一次                       
  737.           }
  738.                 gc&=0x80;                                                       //最高位不變,其他位清零
  739.         }while(1);
  740.         //-------------------------------------------------------------------------------------------------------------------------
  741.         Lcd_qinpin();                          //LCD顯示數(shù)組清零,準備存儲計算結(jié)果
  742.         jc=0;
  743.         gc=0;
  744.         //-------------------計算結(jié)果和顯示轉(zhuǎn)換--------------------------
  745.         if(xc<16){
  746.                 //-----計算結(jié)果大于等于1(還有0.幾的情況在內(nèi))-----------------
  747.           nc=16-xc;
  748.                 //-------------------計算結(jié)果數(shù)據(jù)處理--------------------------
  749.                 if(jshcq[0]==0&&nc!=1){              //計算結(jié)果首位數(shù)字是0,并且不是0.
  750.                   jc++;                              //起始數(shù)據(jù)位置加一
  751.                         nc--;                              //小數(shù)點位置同步
  752.                 }
  753.                 //-------------------存入顯示數(shù)組------------------------------
  754.                 for(ic=0;ic<16;ic++){                //計算結(jié)果轉(zhuǎn)換為顯示數(shù)據(jù)
  755.                         if(ic==nc){                        //小數(shù)點位置
  756.                           lcdxs[ic]='.';
  757.                         }else{                             //數(shù)字位置
  758.                            lcdxs[ic]=jshcq[jc]+0x30;
  759.                      jc++;
  760.                          }  
  761.     }
  762.                 //---------刪除計算結(jié)果后面無效的0----------------------------
  763.                 ic=15;
  764.                 do
  765.                 {
  766.                   if(lcdxs[ic]=='0'||lcdxs[ic]=='.'){   //這里存在一種情況,如果一個計算結(jié)果是無理數(shù)并且顯示尾部是0,那么0也會被不顯示,這雖然不是想要的結(jié)果,但還可以接受
  767.                     lcdxs[ic]=' ';
  768.                                 ic--;
  769.                   }else{
  770.                            break;
  771.                          }
  772.                 }while(1);
  773.         //---------------------------------------------------------------
  774.         }else{                                
  775.                  //-------------------計算結(jié)果小于1-------------------------------------------
  776.            nc=xc-14;          
  777.      //------------計算結(jié)果小于等于0.001采用科學計數(shù)法----------------------------
  778.                  if((nc==4&&jshcq[0]==0)||nc>4){   
  779.                          if(jshcq[0]!=0){                   //沒算小數(shù)點的計算結(jié)果首位不是0,nc要減一
  780.                            nc--;                                                
  781.                          }else{                             //首位0不用顯示
  782.                             jc++;
  783.                           }
  784.                          //-------------------固定顯示部分------------------------------------------
  785.                          lcdxs[1]='.';                                                                           
  786.                          if(nc<10){
  787.                                  lcdxs[13]='e';
  788.                            lcdxs[14]='-';
  789.                            lcdxs[15]=nc+0x30;
  790.                                  mc=12;                           //下面刪除無效0不顯示有用
  791.                          }else{
  792.                             lcdxs[12]='e';
  793.                             lcdxs[13]='-';
  794.                             lcdxs[14]=nc/10+0x30;
  795.                                   lcdxs[15]=nc%10+0x30;
  796.                                   mc=11;                          //下面刪除無效0不顯示有用
  797.                           }       
  798.        //-------------------存入顯示數(shù)組------------------------------------------                 
  799.                    for(ic=0;ic<14;ic++){              //計算結(jié)果轉(zhuǎn)換為顯示數(shù)據(jù)
  800.                            if(lcdxs[ic]==' '){              //lcdxs[]沒有賦值
  801.                                    lcdxs[ic]=jshcq[jc]+0x30;
  802.                        jc++;
  803.                                          if(lcdxs[ic]!='0'){            //lcdxs[]只要有一位數(shù)不是0,gc就賦值1
  804.                                            gc=1;                                                  
  805.                                          }
  806.                                  }                  
  807.                          }
  808.                          //-----------------------特殊情況------------------------------------------
  809.        if(gc==0){                                //全是0,表示計算結(jié)果無效
  810.                            Lcd_qinpin();
  811.                                  lcdxs[0]='x';                           //顯示x,表示計算不出來,當計算結(jié)果小于1/9999999999999時
  812.                          }else{
  813.                             do
  814.                       {
  815.                         if(lcdxs[mc]=='0'||lcdxs[mc]=='.'){  //這里存在一種情況,如果一個計算結(jié)果是無理數(shù)并且顯示尾部是0,那么0也會被不顯示,這雖然不是想要的結(jié)果,但還可以接受,比如,計算結(jié)果9.99000999000e-4會顯示9.99000999e-4
  816.                           lcdxs[mc]=' ';
  817.                                       mc--;
  818.                         }else{
  819.                                  break;
  820.                                }
  821.                       }while(1);
  822.                           }       
  823.      //----------------------------------------------------------------------------                 
  824.                  }else{       
  825.         //------------計算結(jié)果大于0.001-----------------------------------------                         
  826.                     for(ic=0;ic<16;ic++){                    //0和小數(shù)點部分
  827.                             if(ic<nc){
  828.             if(ic==1){
  829.                                       lcdxs[ic]='.';
  830.                                     }else{
  831.                                        lcdxs[ic]='0';
  832.                                      }                                                          
  833.                             }else{                                 //其余部分
  834.                                            lcdxs[ic]=jshcq[jc]+0x30;
  835.                                      jc++;
  836.                              }                       
  837.         }
  838.                                 ic=15;
  839.                                 do
  840.                     {
  841.                       if(lcdxs[ic]=='0'||lcdxs[ic]=='.'){    //這里存在一種情況,如果一個計算結(jié)果是無理數(shù)并且顯示尾部是0,那么0也會被不顯示,這雖然不是想要的結(jié)果,但還可以接受
  842.                         lcdxs[ic]=' ';
  843.                                     ic--;
  844.                       }else{
  845.                                break;
  846.                              }
  847.                     }while(1);
  848.                         }
  849.             //-------------------------------------------------------------------------
  850.          }
  851.         //----------------------------------------------------------------------------
  852.   return 0xff;
  853. }

  854. /*************************************************************************************************
  855. *功能:四則運算
  856. *************************************************************************************************/
  857. void Jisuan(void)
  858. {
  859.         u8 yun,u=0;
  860.         yun=Yunsf_Jl();
  861.         switch(yun)
  862.         {
  863.                 case '+':
  864.                         yun=Jiafa();                           //yun的作用變了
  865.                         break;
  866.                 case '-':
  867.                         yun=Jianfa();
  868.                         break;
  869.                 case '*':
  870.                         yun=Chengfa();
  871.                         break;
  872.                 case '/':
  873.                         yun=Chufa();
  874.                         break;
  875.                 default:
  876.                         break;
  877.         }
  878.         if(yun!=0xff){                             //排除除法,其他3種算法需執(zhí)行的程序
  879.           Lcd_qinpin();                            //LCD顯示數(shù)組清零,準備存儲計算結(jié)果
  880.           do
  881.                 {
  882.                         lcdxs[u]=jshcq[yun%16]+0x30;           //計算結(jié)果存儲數(shù)組中的數(shù)據(jù)以字符形式放入LCD顯示數(shù)組
  883.                         if(yun%16!=0){
  884.                                 if(u==yun/16){                       //小數(shù)位處理
  885.                                         u++;
  886.                                         lcdxs[u]='.';
  887.                                 }                               
  888.                                 yun--;                               //jshcq[]存放形式低位到高位
  889.                                 u++;                                 //lcdxs[]存放形式高位到低位
  890.                         }else{                                 //跳出循壞條件:數(shù)據(jù)取完
  891.                                 break;
  892.                         }
  893.                 }while(1);
  894.                 //--------------去掉計算結(jié)果后面沒用的0---------------------------比如,34.00
  895.                 if(yun/16!=15){                       //有小數(shù)點時
  896.                         do
  897.                         {
  898.                                 if(lcdxs[u]=='0'){                //碰到'0'
  899.                                         lcdxs[u]=' ';                   //空格符代替
  900.                                 }else{
  901.                                          if(lcdxs[u]=='.'){             //碰到'.'
  902.                                                  lcdxs[u]=' ';                //空格符代替
  903.                                          }
  904.                                    break;                         //碰到非'0'數(shù)字字符跳出                                           
  905.                                  }
  906.         u--;                                                //移位,判斷下一位
  907.                   }while(1);
  908.           }
  909.                 //-----------去掉計算結(jié)果前面沒用的0------------------------------比如,00.34
  910.                 u=0;                              
  911.                 do
  912.                 {
  913.                         if(lcdxs[u]=='0'){           
  914.                                 if(lcdxs[u+1]=='.'){      
  915.                                         break;                      //當計算結(jié)果是'0''.'的時候,跳出循環(huán)
  916.                                 }else{
  917.                                          if(lcdxs[u+1]==' '){       //計算結(jié)果是'0'的時候
  918.                                                  break;
  919.                                    }
  920.                              lcdxs[u]=' ';              //如果'0'后面沒跟'.'
  921.                                    u++;                       //移位,準備下一位判斷
  922.                            }                 
  923.                   }else{
  924.                            if(lcdxs[u]!='-'){           
  925.                              break;                     //碰到不是'-',跳出循環(huán)
  926.                            }else{
  927.                               u++;
  928.                             }
  929.                    }
  930.           }while(1);
  931.         }  
  932. }
復(fù)制代碼
回復(fù)

使用道具 舉報

板凳
ID:328014 發(fā)表于 2020-5-15 18:59 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

地板
ID:546568 發(fā)表于 2020-5-15 19:45 | 只看該作者

好厲害,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

5#
ID:89217 發(fā)表于 2020-5-16 11:51 | 只看該作者


好厲害,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

6#
ID:546698 發(fā)表于 2020-6-10 21:31 | 只看該作者
膜拜,大師級別的了,我是看不懂的。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天爽综合网 | 91av在线免费播放 | 91视频进入| 日韩在线小视频 | 国产成人精品a视频一区www | 国产一区 在线视频 | 国产精品久久久久久一级毛片 | 欧美在线视频一区二区 | 呦呦在线视频 | 亚洲精品一区中文字幕乱码 | 国产精品视频久久久久久 | 成人日韩精品 | 97精品国产手机 | 久久精品日产第一区二区三区 | 午夜影院在线观看 | 日韩欧美国产一区二区三区 | 99久久夜色精品国产亚洲96 | 国产乡下妇女做爰 | 日本精品一区二区三区四区 | 福利片在线观看 | 欧美日韩大片 | 亚洲一区二区网站 | www.国产精品| 精品成人| 夜夜草 | 久久99视频免费观看 | 精精国产xxxx视频在线野外 | 国产精品亚洲欧美日韩一区在线 | 中文字幕在线中文 | 一级黄色毛片子 | 精品久久久av | 国产美女在线观看 | 欧美一区二区三区 | 亚欧精品一区 | 国产在线不卡视频 | 久久精品亚洲精品国产欧美 | 午夜视频在线视频 | 日韩免费网站 | 精品欧美一区二区中文字幕视频 | 天天天操操操 | 久久成人在线视频 |