找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2658|回复: 5
收起左侧

基于单片机+RTX51 tiny编写的LCD1602计算器程序与仿真

[复制链接]
ID:633559 发表于 2020-3-26 01:03 | 显示全部楼层 |阅读模式
  首先得说明的是,这个计算器是数组之间的运算,而不是简单的a+b或者a*b就得出来结果了的那种,这样子运算也不精准啊。以前也发过一个计算器程序,不满意,所以想着重写一个,但一个东西再写一遍有意思吗?起码要加点新东西进去,才能有所长进嘛。为什么不满意呢?程序中你中有我我中有你就会显得乱,再加上没有实物玩,如果是我自己下载了一个别人的这样的一个程序,我想我是不会完完整整的看的。我总是想把我想要说的东西说的很详细的那种,让人一看就懂。但就目前来说,火候还是欠佳,最突出的一点就是,当我写完程序后再反过来注释的话,我的心会浮躁。以后,我务必要写一段程序注释一段。所以这次我痛改前非,尽量使程序划分的比较清晰,我是用实物直接试验的,本来我是不会再用仿真的,但考虑到没有实物的程序也不太好看,我还是弄了个仿真图,试了下还行,这样程序好看了点。从写第一个RTX51 tiny程序到“完整计算器”文件都压缩了,除了文件“完整计算器”我做了有限测试,其他文件都只是试了下,其中“四则计算器”就存在漏洞。本人水平虽然有限,但分享资料的心天地可鉴,如果我这资料能给他人觉得有所收获,我很满足。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
完整计算器.png 测试1.jpg 测试2.jpg 除法小数位置计算.jpg 51hei.png

全部资料51hei下载地址:
RTX51 tiny.rar (9.25 MB, 下载次数: 50)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2020-3-26 02:48 | 显示全部楼层
好资料,51黑有你更精彩!!!楼主的主程序:
  1. #include "yunsuan.h"

  2. u8 jshcq[16]={0};                                    //计算结果缓存区
  3. _SU shushu1={0,0,{0,0,0,0,0,0,0,0,0,0,0,0,0,0}};     //前数
  4. _SU shushu2={0,0,{0,0,0,0,0,0,0,0,0,0,0,0,0,0}};     //后数

  5. extern u8 da;    //定义静态变量da,对应LCD显示字符位置

  6. /**********************************************
  7. *功能:LCD显示数组清零
  8. **********************************************/
  9. void Lcd_qinpin(void)
  10. {
  11.   u8 i;                  //定义变量i
  12.         for(i=0;i<16;i++){     //循环16次
  13.           lcdxs[i]=' ';        //LCD显示字符数组清空
  14.         }
  15. }

  16. /**********************************************************************************************************************************
  17. *功能:LCD输入显示算式限制函数
  18. 目的:限制字符的输入显示。
  19. 情况分析:1、两个数首位都不能是无意义的0。  例如,00.12。
  20.           2、两个数的小数点最多都只能有1个。例如,12.3.4。
  21.           3、两个数首位只能是数字。         例如,.5898。
  22.           4、两个数尾位都不能是无效的0。    例如,65.30。
  23.           5、算式中运算符必须有1个。        例如,567。
  24.           (情况分析后补,具体看程序)
  25. zhuangtai对应位说明:
  26.   bit[2-0] :  前个显示字符对应的标号(fenzu)。
  27.   bit[3]   :  0)当前输入数首位数字不是0,  1)当前输入数首位数字是0。                
  28.   bit[4]   :  0)字符不显示,               1)显示字符。
  29.   bit[5]   :  0)算式后数没小数点,         1)算式后数有小数点。
  30.   bit[6]   :  0)算式前数没小数点,         1)算式前数有小数点。
  31.   bit[7]   :  0)当前算式没有输入过运算符, 1)当前算式有输入过运算符。
  32. 输入算式满了的情况下,只能按等号键有效,通过da判断实现。
  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.         //---------------------按等号键的后续处理-----------------------------------------
  66.         if((zhuangtai&0x07)==0x06){    //上一个状态是清除'='按下
  67.           zhuangtai=0x04;              //zhuangtai恢复初始值
  68.         }
  69.         if((zhuangtai&0x07)==0x05){    //上一个状态是计算'='按下
  70.                 if(fenzu==5){                //计算完算式,需再次按'='清屏处理,不然不执行任何操作
  71.                   zhuangtai=0x06;            //zhuangtai恢复初始值
  72.                         zhuangtai|=0x10;           //zhuangtai字符显示标志位置1       
  73.                         return zhuangtai;          //跳出准备执行清屏与相关数据初始化工作
  74.                 }else{
  75.                    return zhuangtai;         //跳出,无操作
  76.                  }  
  77.         }       
  78.   //-------------------------------------按fenzu分类处理--------------------------------------------------------------------------
  79.         switch(fenzu)
  80.         {
  81.                 case 1:
  82.                         if((zhuangtai&0x0f)!=0x09){           //排除一种情况:当前输入数首位数字是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位状态值(1)      
  88.                         }
  89.                         break;
  90.                 case 2:
  91.                         if((zhuangtai&0x0f)!=0x09){           //排除一种情况:当前输入数首位数字是0,并且前一个字符是'0'
  92.                           zhuangtai&=0xf8;                    //zhuangtai清零后3位
  93.         zhuangtai|=0x12;                                            //zhuangtai字符显示标志位置1、zhuangtai添加后3位状态值(2)                    
  94.                         }
  95.                         break;
  96.                 case 3:
  97.                         //排除情况:前一个字符是小数点、前一个字符是运算符、当前算式有小数点没有运算符、当前算式有运算符有小数点
  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{                              //当前算式没有运算符
  103.                                    zhuangtai|=0x40;                 //zhuangtai第6位置位
  104.                                  }
  105.                                 zhuangtai&=0xf7;                    //zhuangtai第3位(首位数字0标志位)清零(有小数点后,首位是不是0,对输入数字字符没影响)
  106.         zhuangtai|=0x13;                                            //zhuangtai字符显示标志位置1、zhuangtai添加后3位状态值(3)   
  107.                         }
  108.                         break;
  109.                 case 4:
  110.                         //排除情况:前一个字符是小数点、前一个字符是运算符、前数有小数点前一个字符是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位(首位数字0标志位)清零
  114.         zhuangtai|=0x94;                                            //zhuangtai字符显示标志位置1、zhuangtai第7位置位、zhuangtai添加后3位状态值(4)
  115.                         }
  116.                         break;
  117.                 case 5:
  118.                         //排除情况:前一个字符是小数点、前一个字符是运算符、后数有小数点前一个字符是0、算式没输入过运算符
  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位状态值(5)
  122.                         }else{
  123.                                  //输入算式不合理的情况下
  124.                            zhuangtai=0x16;                    //zhuangtai字符显示标志位置1、zhuangtai添加后3位状态值(6)
  125.                          }
  126.                         break;
  127.                 default:
  128.                         break;
  129.         }
  130.         //--------------------------------------------------------------------------------------------------------------------------------
  131.         return zhuangtai;                         //返回按键状态值
  132. }

  133. /**********************************************************************************************************
  134. *功能:结构体数据随输入字符改变
  135. 目的:随着输入字符,改变相应的结构体数据(用于四则运算)。
  136. 具体情况:记录,shushu1.zscd           //前数整数个数     
  137.                shushu1.sscd           //前数小数个数
  138.                shushu1.shujuabc[]     //去除小数点后的前数数据
  139.                shushu2.zscd           //后数整数个数
  140.                shushu2.sscd           //后数小数个数
  141.                shushu2.shujuabc[]     //去除小数点后的后数数据
  142. **********************************************************************************************************/
  143. void Jiegou_Chuli(u8 xcu)
  144. {
  145.         static u8 i=0,xs=0,ys=0;                  //定义变量i对应shujuabc[]标号,变量xs对应小数点,变量ys对应运算符
  146.         if(xcu!='='){                             //按下的不是等号键
  147.           if(xcu>='0'){                           //输入数字
  148.       if(xs==0){                                     
  149.                                 if(ys==0){                          //(输入算式没小数点、没运算符)前数整数部分       
  150.                                   shushu1.zscd++;                   //前数整数对应个数加一
  151.                       shushu1.shujuabc[i]=xcu-0x30;     //输入字符数字存入shushu1.shujuabc[]
  152.                                 }else{                              //(输入算式没小数点、有运算符)后数整数部分       
  153.                                    shushu2.zscd++;                  //后数整数对应个数加一
  154.                        shushu2.shujuabc[i]=xcu-0x30;    //输入字符数字存入shushu2.shujuabc[]
  155.                                  }
  156.                   }else{
  157.                      if(xs==1){                     
  158.                              if(ys==0){                       //(输入算式有一个小数点、没运算符)前数小数部分       
  159.                                            shushu1.sscd++;                //前数小数对应个数加一
  160.                                      shushu1.shujuabc[i]=xcu-0x30;  //输入字符数字存入shushu1.shujuabc[]
  161.                                    }else{                           //(输入算式前数有小数点、有运算符)后数整数部分
  162.                                       shushu2.zscd++;               //后数整数对应个数加一
  163.                           shushu2.shujuabc[i]=xcu-0x30; //输入字符数字存入shushu2.shujuabc[]
  164.                                     }
  165.                            }else{                             //(输入算式后数有小数点、有运算符)后数小数部分
  166.                               shushu2.sscd++;                 //后数小数对应个数加一
  167.                                     shushu2.shujuabc[i]=xcu-0x30;   //输入字符数字存入shushu2.shujuabc[]
  168.                             }
  169.                    }                          
  170.                   i++;                                  //变量i加一
  171.           }else{
  172.                    if(xcu=='.'){                        //是小数点
  173.                            if(ys==0){                         //当前没有运算符
  174.                              xs=1;                            //xs=1,表示前数有小数点了
  175.                            }else{                             //当前有运算符
  176.                               xs=2;                           //xs=2,表示后数有小数点了
  177.                             }                                 
  178.                    }else{                               //是运算符
  179.                                   i=0;                              //变量i置零,开始对应后数存储数组shujuabc[]
  180.                       ys=1;                             //ys=1,表示运算符有了
  181.                     }
  182.            }
  183.         }else{                                    //按下的是等号键
  184.            i=0;                                   //变量初始化,准备下次运算
  185.                  xs=0;
  186.                  ys=0;
  187.          }
  188. }

  189. /*********************************************************************************************
  190. *功能:结构体数据初始化
  191. 目的:结构体数据和计算结果存储数组初始化,为下次运算准备。
  192. *********************************************************************************************/
  193. void Jiegou_Csh(void)
  194. {
  195. //---------初始化结构体数据和计算结果存储数组---------       
  196.   u8 i;                               //定义变量i
  197.         shushu1.zscd=0;              //前数整数个数置零
  198.         shushu1.sscd=0;              //前数小数个数置零
  199.         shushu2.zscd=0;              //后数整数个数置零
  200.         shushu2.sscd=0;              //后数小数个数置零
  201.         for(i=0;i<14;i++){           //循环14次  
  202.                 shushu1.shujuabc[i]=0;     //前数数据清零
  203.                 shushu2.shujuabc[i]=0;     //后数数据清零
  204.                 jshcq[i]=0;                //计算结果存储数组前14位清零
  205.         }
  206.         jshcq[14]=0;                 //计算结果存储数组15位清零
  207.         jshcq[15]=0;                 //计算结果存储数组16位清零
  208. }

  209. /********************************************************************************************************************
  210. *功能:运算符判断
  211. 目的:以运算符分类处理四则运算。
  212. ********************************************************************************************************************/
  213. u8 Yunsf_Jl(void)
  214. {
  215.         u8 ysf;                                    //ysf用作运算符记录
  216.         if(shushu1.sscd==0){                       //没有小数部分
  217.           ysf=lcdxs[shushu1.zscd];                 //前数的整数部分长度就是运算符在lcdxs[]中的位置
  218.         }else{                                     //有小数部分
  219.            ysf=lcdxs[shushu1.zscd+shushu1.sscd+1]; //前数的整数部分加前数的小数部分长度再加小数位就是运算符在lcdxs[]中的位置
  220.          }
  221.         return ysf;                                //返回ysf
  222. }

  223. /**********************************************************************************************************************************************************
  224. *功能:乘法函数
  225. **********************************************************************************************************************************************************/
  226. u8 Chengfa(void)
  227. {
  228.         u8 ic=0,jc=0,nc=0,mc=0;                                                            //前数开始运算位,后数开始运算位,计算结果存储位置变量,计算结果存储起始位
  229.         ic=shushu1.zscd+shushu1.sscd-1;                                                    //赋值“前数的的尾位在shushu1.shujuabc[]中的位置”给ic
  230.         jc=shushu2.zscd+shushu2.sscd-1;                                                    //赋值“后数的的尾位在shushu2.shujuabc[]中的位置”给jc
  231.         if(((ic==0)&&(shushu1.shujuabc[ic]==0))||((jc==0)&&(shushu2.shujuabc[jc]==0))){    //前数和后数中至少一个是0
  232.                 jshcq[0]=0;                                                                      //显示计算结果'0'
  233.                 return 0xf0;                                                                     //跳出
  234.         }
  235.         //----------------------------循环0---------------------------------------------------------
  236.         do
  237.         {
  238.           jshcq[nc]+=shushu2.shujuabc[jc]*shushu1.shujuabc[ic];     //存储两数运算结果
  239.           if(jshcq[nc]>9){                                          //两数运算结果是2位数
  240.                         jshcq[nc+1]+=jshcq[nc]/10;                              //高位累加进位
  241.                         jshcq[nc]%=10;                                          //低位取个位
  242.                 }
  243.                 if(ic!=0){                                                //前数数据没取完
  244.                   ic--;                                                   //前数运算位左移
  245.                         nc++;                                                   //运算结果存储位右移
  246.                 }else{                                                    //前数数据取完了
  247.                    if(jc!=0){                                             //后数数据没取完
  248.          ic=shushu1.zscd+shushu1.sscd-1;                      //前数起始位初始值                         
  249.                            jc--;                                                //后数运算位左移
  250.                                  mc++;                                                //存储结果起始位右移
  251.                                  nc=mc;                                                                        //赋值给nc
  252.                          }else{                                                 //后数数据取完了
  253.                                   if(jshcq[nc+1]!=0){                                 //如果计算完有进位
  254.                                           nc++;                                             //相应的nc加一
  255.                                         }
  256.                             break;                                              //跳出循环   <<<====(循环0,出口)
  257.                           }
  258.                  }                 
  259.         }while(1);
  260.         //--------------------------------------------------------------------------------------------
  261.         jc=15;                                          //jc赋值15,作用不同上面
  262.         if((shushu1.sscd!=0)||(shushu2.sscd!=0)){       //前数和后数中至少有一个有小数点
  263.           jc=nc-(shushu1.sscd+shushu2.sscd);            //计算结果总长度(不算小数点)-两个数小数部分长度和。jc是小数点在lcdxs[]中的位置
  264.         }       
  265.         mc=(jc<<4)+nc;                                  //高四位存小数点位,低四位存计算结果长度
  266.   return mc;                                      //带出mc
  267. }

  268. /***************************************************************************************************************************************
  269. *功能:加法函数
  270. ***************************************************************************************************************************************/
  271. u8 Jiafa(void)
  272. {
  273.   u8 ic=0,jc=0,nc=0,mc=0;                        //前数开始运算位,后数开始运算位,计算结果存储位置变量,计算结果存储起始位
  274.         ic=shushu1.zscd+shushu1.sscd-1;                //赋值“前数的的尾位在shushu1.shujuabc[]中的位置”给ic
  275.         jc=shushu2.zscd+shushu2.sscd-1;                //赋值“后数的的尾位在shushu2.shujuabc[]中的位置”给jc
  276.         //-------------------处理前数和后数小数位较长的部分--------------------------
  277.         if(shushu1.sscd>shushu2.sscd){                 //前数的小数部分比后数的小数部分长
  278.                 do
  279.                 {
  280.                         if(ic-shushu1.zscd==jc-shushu2.zscd){      //直到取到小数位一样长后
  281.                           break;                                   //跳出         <<<====(出口)
  282.                         }else{
  283.                                  jshcq[nc]+=shushu1.shujuabc[ic];        //小数位长的直接赋值给jshcq[]
  284.                            nc++;                                   //存储位递加
  285.                                  ic--;                                   //移位取下一位小数位
  286.                          }
  287.                 }while(1);
  288.     mc=shushu1.sscd;                                         //小数点位置计算用到
  289.         }else{
  290.                  if(shushu1.sscd!=shushu2.sscd){             //小数位等长不用处理
  291.                    do
  292.                    {
  293.                            if(ic-shushu1.zscd==jc-shushu2.zscd){   //直到取到小数位一样长后
  294.                              break;                                //跳出         <<<====(出口)
  295.                            }else{
  296.                                           jshcq[nc]+=shushu2.shujuabc[jc];     //小数位长的直接赋值给jshcq[]
  297.                               nc++;                                //存储位递加
  298.                                     jc--;                                //移位取下一位小数位
  299.                             }
  300.                    }while(1);
  301.                  }
  302.                  mc=shushu2.sscd;                            //小数点位置计算用到
  303.          }
  304.         //-------------------处理另一部分--------------------------------------------------
  305.         do
  306.         {
  307.                 jshcq[nc]+=shushu1.shujuabc[ic]+shushu2.shujuabc[jc];    //两数中间部分相加
  308.     if(jshcq[nc]>9){                                         //两数运算结果是2位数
  309.                         jshcq[nc+1]+=jshcq[nc]/10;                             //高位累加进位
  310.                         jshcq[nc]%=10;                                         //低位取个位
  311.                 }               
  312.                 if((ic!=0)&&(jc!=0)){                                    //两个数数据都没取完            
  313.                         nc++;
  314.                         ic--;
  315.                         jc--;
  316.                 }else{
  317.                    if((ic==0)&&(jc==0)){                                 //两个数数据都取完
  318.                            break;                                              //跳出     <<<====(出口)
  319.                          }else{
  320.                             if(ic==0){                                         //前数数据取完
  321.                                                 //-------------------后数整数部分长出的部分处理---------------------------
  322.                                                 do{
  323.                                                         if(jc==0){
  324.                                                                 break;                                       //跳出     <<<====(出口)
  325.                                                         }else{         
  326.                                                            nc++;
  327.                                                                  jc--;
  328.                                                          }
  329.                                                         jshcq[nc]+=shushu2.shujuabc[jc];               //后数整数长的部分再取
  330.                                                         if(jshcq[nc]>9){                               //两数运算结果是2位数
  331.                                   jshcq[nc+1]+=jshcq[nc]/10;                   //高位累加进位
  332.                                   jshcq[nc]%=10;                               //低位取个位
  333.                           }         
  334.                                                 }while(1);
  335.                                                 //------------------------------------------------------------------------
  336.                                         }else{                                             //后数数据取完
  337.                                                  //-------------------前数整数部分长出的部分处理---------------------------
  338.                                                  do{
  339.                                                          if(ic==0){
  340.                                                            break;                                      //跳出     <<<====(出口)
  341.                                                          }else{         
  342.                                                             nc++;
  343.                                                                   ic--;
  344.                                                           }
  345.                                                          jshcq[nc]+=shushu1.shujuabc[ic];              //前数整数长的部分再取
  346.                                                          if(jshcq[nc]>9){                              //两数运算结果是2位数
  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;                                                //计算结果总长度(不算小数点)-小数部分长度。小数点在lcdxs[]中的位置
  364.         }       
  365.         mc=(jc<<4)+nc;                                             //高四位存小数点位,低四位存计算结果长度
  366.   return mc;
  367. }

  368. /******************************************************************************************************************************************
  369. *功能:减法函数
  370. ******************************************************************************************************************************************/
  371. u8 Jianfa(void)
  372. {
  373.   u8 ic=0,jc=0,nc=0,mc=0;
  374.         //-----------------------------比较前数和后数的大小---------------------------------------------------------------------
  375.         if(shushu1.zscd>shushu2.zscd){                                 //前数整数部分比后数整数部分长
  376.           mc=1;                                 //前数比后数大
  377.         }else{
  378.            if(shushu1.zscd!=shushu2.zscd){                            //前数整数部分比后数整数部分短
  379.                    mc=2;                              //后数比前数大
  380.                  }else{                                                     //前数整数部分和后数整数部分一样长
  381.                     do
  382.                                 {
  383.                             if(shushu1.shujuabc[ic]>shushu2.shujuabc[jc]){        //前数高位比后数高位大
  384.                                     mc=1;
  385.                                                 break;                  //跳出
  386.                                   }else{
  387.                                      if(shushu1.shujuabc[ic]!=shushu2.shujuabc[jc]){    //前数高位比后数高位小
  388.                                              mc=2;
  389.                                                          break;               //跳出
  390.                                            }else{                                             //前数高位和后数高位一样大
  391.                                               if((ic!=shushu1.zscd+shushu1.sscd-1)&&(jc!=shushu2.zscd+shushu2.sscd-1)){       //前数和后数数据都没有取完
  392.                               ic++;
  393.                                                                         jc++;
  394.                                                                 }else{                                         
  395.                                                                    if((ic==shushu1.zscd+shushu1.sscd-1)&&(jc==shushu2.zscd+shushu2.sscd-1)){    //前数和后数数据都取完
  396.                                                                            mc=0;          //前数和后数一样大
  397.                                                                                  break;         //跳出
  398.                                                                          }else{
  399.                                                                             if(ic==shushu1.zscd+shushu1.sscd-1){      //前数数据取完,后数没取完
  400.                                                                                           mc=2;
  401.                                                                                                 break;                        //跳出                                                               
  402.                                                                                         }else{                                    //后数数据取完,前数没取完
  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;                                                   //显示计算结果'0'
  420.                         break;
  421.                 case 1:     //与下面mc=2是一样的,下面备注详细点
  422.                         if(shushu1.sscd>=shushu2.sscd){                               //前数不比后数小数部分短
  423.                           do
  424.                                 {
  425.                                         if(ic-shushu1.zscd==jc-shushu2.zscd){                     //直到取到小数位一样长后                     
  426.                                                 break;                                                  //跳出
  427.                             }else{
  428.                                      jshcq[nc]=shushu1.shujuabc[ic];                        //小数位长的直接赋值给jshcq[]
  429.                                nc++;                                                  //存储位递加
  430.                                      ic--;                                                  //移位取下一位小数位
  431.                              }
  432.                                  }while(1);                       
  433.                   }else{                                                        //前数比后数小数部分短
  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){                    //直到取到小数位一样长后                     
  441.                                                  break;                                                 //跳出
  442.                              }else{
  443.                                       jshcq[nc]=9-shushu2.shujuabc[jc];
  444.                                 nc++;                                                 //存储位递加
  445.                                       jc--;                                                 //移位取下一位小数位
  446.                               }
  447.                                  }while(1);                                         
  448.                          }                 
  449.                         do
  450.                         {
  451.                                 if(shushu1.shujuabc[ic]>=shushu2.shujuabc[jc]){             //前数不比后数小
  452.                                         jshcq[nc]+=shushu1.shujuabc[ic]-shushu2.shujuabc[jc];     //前数-后数
  453.                                         if(jc==0){                                                //后数取完了                                             
  454.                                                 do
  455.                                                 {
  456.               if(ic!=0){                                            //前数没取完
  457.                                                           nc++;                  
  458.                                                                 ic--;       
  459.                                                         }else{
  460.                                                                  break;
  461.                                                          }       
  462.               jshcq[nc]+=shushu1.shujuabc[ic];                                                        
  463.                                                 }while(1);       
  464.                                                 break;                                                  //前数取完跳出循环                                                                               
  465.                                         }else{
  466.                                                  ic--;
  467.                                                  jc--;
  468.                                                  nc++;
  469.                                          }
  470.                                 }else{                                                      //前数比后数小
  471.                                          shushu1.shujuabc[ic]+=10;                                //加10
  472.                                          if(shushu1.shujuabc[ic-1]!=0){                           //当前运算前数的前一位不等于0
  473.                                                  shushu1.shujuabc[ic-1]--;                              //减一位
  474.                                                  
  475.                                          }else{                                                   //当前运算前数的前一位等于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){                               //后数不比前数小数部分短  <<<=====(分情况实现)
  495.                           //---------------------------------------------------------------------------------------------------
  496.                                 do
  497.                                 {
  498.                                         if(ic-shushu1.zscd==jc-shushu2.zscd){                     //直到取到小数位一样长后        <<<=====(目的)     
  499.                                                 break;                                                  //跳出
  500.                             }else{
  501.                                      jshcq[nc]=shushu2.shujuabc[jc];                        //小数位长的直接赋值给jshcq[]
  502.                                nc++;                                                  //存储位递加
  503.                                      jc--;                                                  //移位取下一位小数位
  504.                              }
  505.                                  }while(1);                       
  506.                                 //---------------------------------------------------------------------------------------------------
  507.                   }else{                                                        //后数比前数小数部分短
  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){                    //直到取到小数位一样长后        <<<=====(目的)             
  516.                                                  break;                                                 //跳出
  517.                              }else{
  518.                                       jshcq[nc]=9-shushu1.shujuabc[ic];
  519.                                 nc++;                                                 //存储位递加
  520.                                       ic--;                                                 //移位取下一位小数位
  521.                               }
  522.                                  }while(1);       
  523.          //--------------------------------------------------------------------------------------------------                                 
  524.                          }
  525.       //-----------------------------循环0-------------------------------------------------------------------                       
  526.                         do
  527.                         {
  528.                                 if(shushu2.shujuabc[jc]>=shushu1.shujuabc[ic]){             //后数不比前数小
  529.                                         jshcq[nc]+=shushu2.shujuabc[jc]-shushu1.shujuabc[ic];     //后数-前数
  530.                                         if(ic==0){                                                //前数取完了                                         
  531.                                                 //------------------------循环2-----------------------------------------------------
  532.                                                 do
  533.                                                 {
  534.               if(jc!=0){                                            //后数没取完
  535.                                                                 nc++;                  
  536.                                                                 jc--;                  
  537.                                                         }else{                                                //后数取完了           
  538.                                                                  break;                                             //跳出  <<<====(循环2,出口)
  539.                                                          }
  540.                jshcq[nc]+=shushu2.shujuabc[jc];                                                                
  541.                                           }while(1);
  542.             //----------------------------------------------------------------------------------                                       
  543.                                                 nc++;
  544.                                                 jshcq[nc]='-'-0x30;                                                        //负号先记上
  545.                                                 break;                                                  //后数取完跳出循环   <<<=====(循环0,出口)                                                                               
  546.                                         }else{
  547.                                                  ic--;
  548.                                                  jc--;
  549.                                                  nc++;
  550.                                          }
  551.                                 }else{                                                      //后数比前数小
  552.                                          shushu2.shujuabc[jc]+=10;                                //加10
  553.                                          if(shushu2.shujuabc[jc-1]!=0){                           //当前运算后数的前一位不等于0
  554.                                                  shushu2.shujuabc[jc-1]--;                              //减一位
  555.                                                  
  556.                                          }else{                                                   //当前运算后数的前一位等于0
  557.                                                         //-------------------------------循环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]--;                                                                                            //不够减,高位要         <<<=====(循环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){                 //没有多余变量可以利用,只能再判断一次小数部分长短
  582.           mc=shushu1.sscd;
  583.         }else{
  584.            mc=shushu2.sscd;
  585.          }
  586.         if((shushu1.sscd!=0)||(shushu2.sscd!=0)){
  587.           jc=nc-mc;                                     //计算结果总长度(不算小数点)-小数部分长度。小数点在lcdxs[]中的位置
  588.         }       
  589.         mc=(jc<<4)+nc;                                  //高四位存小数点位,低四位存计算结果长度
  590.   return mc;
  591. }

  592. /*********************************************************************************************************
  593. *功能:除法函数
  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)){   //后数是0的情况,不进行运算
  600.                 Lcd_qinpin();                                                       //LCD显示数组清零
  601.                 lcdxs[0]='x';                                                       //无法计算结果
  602.                 return 0xff;
  603.         }
  604.         if((shushu1.shujuabc[0]==0)&&(shushu1.zscd==1)&&(shushu1.sscd==0)){   //前数是0的情况
  605.                 Lcd_qinpin();                                                       //LCD显示数组清零,准备存储计算结果
  606.                 lcdxs[0]='0';                                                       //计算结果是0
  607.                 return 0xff;
  608.         }
  609.         //--------------------------------------------------------------------------------------------------------
  610.         while(shushu1.shujuabc[ic]==0){             //前数是0的位不用运算   
  611.           ic++;
  612.         }
  613.         while(shushu2.shujuabc[jc]==0){             //后数是0的位不用运算   
  614.           jc++;
  615.         }
  616.         xc=shushu2.zscd-shushu1.zscd+ic-jc+15;      //小数点位置
  617.         mc=jc<<4;                                   //当前jc值存入mc高四位,jc最大13,4位足以存储
  618.         //---------------------------------大循环0号,直到计算出16位计算结果才跳出------------------------------------------------
  619.         do
  620.         {               
  621.                 mc&=0xf0;                                          //清除低四位
  622.                 mc|=ic;                                            //记录ic的值,存入mc低四位 (关键点:mc之前的数据一定是0)
  623.                 if(nc!=16){                                        //计算结果没满16位
  624.                         if((mc&0x0f)>=14-shushu2.zscd-shushu2.sscd){     //“前数截取部分的长度首位置之后的剩余的长度”不会比“后数的长度”长
  625.                     //----------------------------------循环1号,为了能计算出足有16位的结果----------------------------------------------
  626.                                 jc=0;                                          //这里jc的作用是一个起始值为0的变量
  627.                     do
  628.                     {
  629.                       shushu1.shujuabc[jc]=shushu1.shujuabc[ic];   //将剩余的有效数字重新以shushu1.shujuabc[0]为起始顺序存储
  630.                             shushu1.shujuabc[ic]=0;                      //清除
  631.                             if(ic==13){                                  //数据重存完
  632.                               break;                                     //跳出
  633.                             }else{                                       //继续转存有效数据
  634.                                jc++;
  635.                                      ic++;
  636.                              }
  637.                     }while(1);
  638.                     ic=0;                                          //相应的变量值也将改变,实现一个14位数据的数组当一个28位数据的数组使用    <<<====(循环1号,目的)
  639.                     mc&=0xf0;                                      //清除低四位,mc低四位清零,同步ic值
  640.                     jc=mc>>4;                                      //jc恢复初始值
  641.                                 //-----------------------------------------------------------------------------------------------------------------
  642.                         }
  643.           }else{                           //得到16位计算结果                                                                         <<<====(大循环0号,目的)
  644.              break;                        //跳出
  645.            }
  646.                 //-----------------------循环2号,截取前数(可减后数,即必须比后数大)部分-------------------------------------------------------------------------------
  647.           do
  648.           {
  649.                   if(shushu1.shujuabc[ic]>shushu2.shujuabc[jc]){         //从高位开始比较  
  650.         ic=(mc&0x0f)+shushu2.zscd+shushu2.sscd-1;                         //前数截取长度和后数等长
  651.                           break;              //跳出(大的时候会跳出)                                                                 <<<====(出口1)
  652.                   }else{
  653.                            if(shushu1.shujuabc[ic]!=shushu2.shujuabc[jc]){     //前数比后数小                         
  654.                                    if(shushu1.shujuabc[ic]!=0){                      //该位不是0,前数截取长度比后数多1位肯定比后数大
  655.                                      ic=(mc&0x0f)+shushu2.zscd+shushu2.sscd;         //前数截取比后数多1位数
  656.                                                  if(!(gc&0x80)){                                 //gc最高位是0,在gc最高位是1的情况下nc不能加加
  657.                                                    nc++;                                         //计算结果位置移位
  658.                                                          gc|=0x80;                                     //最高位置1,表示前数截取部分比后数长1位数
  659.                                                  }                                                 
  660.                                    }else{                                            //该位是0
  661.                                                   if(ic==mc){                                    //0是前数截取部分第一位
  662.                                                                 ic++;                                        //判断位移位
  663.                                                     mc++;                                        //mc低四位加一同步ic
  664.                                               jc=mc>>4;                                    //后数回到起始位置
  665.                                                     gc&=0x7f;                                    //高位置0,表示
  666.                                               gc|=0x01;                                    //gc最低位作为这一情况的标志,表示不用运算
  667.                                                                 nc++;
  668.                                                         }else{                                         //0是前数截取部分非首位,首位肯定不是0,这种情况是前数截取部分减了后数若干次后的结果小于后数了
  669.                                                            ic=(mc&0x0f)+shushu2.zscd+shushu2.sscd;     //前数截取比后数多1位数
  670.                                                                  if(!(gc&0x80)){                             //gc最高位是0,在gc最高位是1的情况下nc不能加加,比如,4480-452=4028,4028-452这种情况nc不能加
  671.                                                        nc++;                                     //计算结果位置移位
  672.                                                              gc|=0x80;                                 //最高位置1,表示前数截取部分比后数长1位数
  673.                                                      }                       
  674.                                                          }
  675.                                     }       
  676.             break;                                         //跳出(小的时候跳出)                                                                   <<<====(出口2)
  677.                      }else{                                              //前数和后数高位一样大
  678.                                     if(jc!=shushu2.zscd+shushu2.sscd-1){             //后数数据没有取完,继续下位比较
  679.                           ic++;
  680.                                             jc++;
  681.                                     }else{                                           //前数和后数一样大
  682.                                                    ic=(mc&0x0f)+shushu2.zscd+shushu2.sscd-1;                 //前数截取长度和后数等长
  683.                break;                                 //跳出(相等的时候跳出)                                                                 <<<====(出口3)
  684.                                      }                                                       
  685.                             }
  686.              }
  687.     }while(1);       
  688.     //----------------------------------------------------------------------------------------------------------------------------------------------------               
  689.           if(!(gc&0x01)){                                                 //gc最低位是1的时候,不进行运算
  690.             jc=shushu2.zscd+shushu2.sscd-1;                               //后数尾数开始运算
  691.             //------------------------------------循环3号,前数截取部分-后数,求得可减次数,化除法为减法----------------------------------------------
  692.             do
  693.                         {
  694.                     if(shushu1.shujuabc[ic]>=shushu2.shujuabc[jc]){             //前数不比后数小                                          
  695.                             shushu1.shujuabc[ic]-=shushu2.shujuabc[jc];               //前数-后数
  696.                             if(jc==mc>>4){                                            //后数取完了
  697.                                                 if(ic!=(mc&0x0f)){                                      //前数截取部分没取完       
  698.                                                   if(shushu1.shujuabc[ic-1]==0){                        //前数多的一位是0
  699.                                                           gc&=0x7f;                                           //最高位置0,表示如果减后的前数截取部分长度比后数小的话,存储位置nc需要加加
  700.                                                         }else{                                                //这里说明肯定比后数还大,存储位置nc不能移位
  701.                                                            ic--;
  702.                                                         }                                                               
  703.                                                 }         
  704.                                     break;                        //跳出循环                                           <<<====(循环3号,出口)                                                                       
  705.                             }else{
  706.                                      ic--;
  707.                                      jc--;
  708.                              }
  709.                     }else{                                                      //前数比后数小
  710.           //----------------------------------只进行数据改变,不运算-----------------------------------------------------------
  711.                             shushu1.shujuabc[ic]+=10;                                 //加10
  712.                                         if(shushu1.shujuabc[ic-1]!=0){                            //当前运算前数的前一位不等于0
  713.                                      shushu1.shujuabc[ic-1]--;                              //减一位
  714.                              }else{                                                   //当前运算前数的前一位等于0
  715.                                             //-----------------------------循环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){                      //找可以减的位    <<<====(循环4号,目的)
  722.                                                       shushu1.shujuabc[ic-1]--;                                                                                            //减一
  723.                                                             break;                                            //跳出
  724.                                               }else{                                                                                                          //再找
  725.                                                              ic--;                                       
  726.                                                }
  727.                                             }while(1);
  728.               ic=gc&0x7f;                                           //ic恢复原保存值
  729.                     gc&=0x80;                                             //保留最高位,清除其他位                                           
  730.               //--------------------------------------------------------------------------------------------------------------                                               
  731.                                     }
  732.                                          //-----------------------------------------------------------------------------------------------------------------
  733.                      }                                                       
  734.             }while(1);
  735.                         //------------------------------------------------------------------------------------------------------------------------------------
  736.             jshcq[nc]++;                                                  //前数截取部分和后数减一次,计算结果累加一次                       
  737.           }
  738.                 gc&=0x80;                                                       //最高位不变,其他位清零
  739.         }while(1);
  740.         //-------------------------------------------------------------------------------------------------------------------------
  741.         Lcd_qinpin();                          //LCD显示数组清零,准备存储计算结果
  742.         jc=0;
  743.         gc=0;
  744.         //-------------------计算结果和显示转换--------------------------
  745.         if(xc<16){
  746.                 //-----计算结果大于等于1(还有0.几的情况在内)-----------------
  747.           nc=16-xc;
  748.                 //-------------------计算结果数据处理--------------------------
  749.                 if(jshcq[0]==0&&nc!=1){              //计算结果首位数字是0,并且不是0.
  750.                   jc++;                              //起始数据位置加一
  751.                         nc--;                              //小数点位置同步
  752.                 }
  753.                 //-------------------存入显示数组------------------------------
  754.                 for(ic=0;ic<16;ic++){                //计算结果转换为显示数据
  755.                         if(ic==nc){                        //小数点位置
  756.                           lcdxs[ic]='.';
  757.                         }else{                             //数字位置
  758.                            lcdxs[ic]=jshcq[jc]+0x30;
  759.                      jc++;
  760.                          }  
  761.     }
  762.                 //---------删除计算结果后面无效的0----------------------------
  763.                 ic=15;
  764.                 do
  765.                 {
  766.                   if(lcdxs[ic]=='0'||lcdxs[ic]=='.'){   //这里存在一种情况,如果一个计算结果是无理数并且显示尾部是0,那么0也会被不显示,这虽然不是想要的结果,但还可以接受
  767.                     lcdxs[ic]=' ';
  768.                                 ic--;
  769.                   }else{
  770.                            break;
  771.                          }
  772.                 }while(1);
  773.         //---------------------------------------------------------------
  774.         }else{                                
  775.                  //-------------------计算结果小于1-------------------------------------------
  776.            nc=xc-14;          
  777.      //------------计算结果小于等于0.001采用科学计数法----------------------------
  778.                  if((nc==4&&jshcq[0]==0)||nc>4){   
  779.                          if(jshcq[0]!=0){                   //没算小数点的计算结果首位不是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.        //-------------------存入显示数组------------------------------------------                 
  799.                    for(ic=0;ic<14;ic++){              //计算结果转换为显示数据
  800.                            if(lcdxs[ic]==' '){              //lcdxs[]没有赋值
  801.                                    lcdxs[ic]=jshcq[jc]+0x30;
  802.                        jc++;
  803.                                          if(lcdxs[ic]!='0'){            //lcdxs[]只要有一位数不是0,gc就赋值1
  804.                                            gc=1;                                                  
  805.                                          }
  806.                                  }                  
  807.                          }
  808.                          //-----------------------特殊情况------------------------------------------
  809.        if(gc==0){                                //全是0,表示计算结果无效
  810.                            Lcd_qinpin();
  811.                                  lcdxs[0]='x';                           //显示x,表示计算不出来,当计算结果小于1/9999999999999时
  812.                          }else{
  813.                             do
  814.                       {
  815.                         if(lcdxs[mc]=='0'||lcdxs[mc]=='.'){  //这里存在一种情况,如果一个计算结果是无理数并且显示尾部是0,那么0也会被不显示,这虽然不是想要的结果,但还可以接受,比如,计算结果9.99000999000e-4会显示9.99000999e-4
  816.                           lcdxs[mc]=' ';
  817.                                       mc--;
  818.                         }else{
  819.                                  break;
  820.                                }
  821.                       }while(1);
  822.                           }       
  823.      //----------------------------------------------------------------------------                 
  824.                  }else{       
  825.         //------------计算结果大于0.001-----------------------------------------                         
  826.                     for(ic=0;ic<16;ic++){                    //0和小数点部分
  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]=='.'){    //这里存在一种情况,如果一个计算结果是无理数并且显示尾部是0,那么0也会被不显示,这虽然不是想要的结果,但还可以接受
  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种算法需执行的程序
  879.           Lcd_qinpin();                            //LCD显示数组清零,准备存储计算结果
  880.           do
  881.                 {
  882.                         lcdxs[u]=jshcq[yun%16]+0x30;           //计算结果存储数组中的数据以字符形式放入LCD显示数组
  883.                         if(yun%16!=0){
  884.                                 if(u==yun/16){                       //小数位处理
  885.                                         u++;
  886.                                         lcdxs[u]='.';
  887.                                 }                               
  888.                                 yun--;                               //jshcq[]存放形式低位到高位
  889.                                 u++;                                 //lcdxs[]存放形式高位到低位
  890.                         }else{                                 //跳出循坏条件:数据取完
  891.                                 break;
  892.                         }
  893.                 }while(1);
  894.                 //--------------去掉计算结果后面没用的0---------------------------比如,34.00
  895.                 if(yun/16!=15){                       //有小数点时
  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'数字字符跳出                                           
  905.                                  }
  906.         u--;                                                //移位,判断下一位
  907.                   }while(1);
  908.           }
  909.                 //-----------去掉计算结果前面没用的0------------------------------比如,00.34
  910.                 u=0;                              
  911.                 do
  912.                 {
  913.                         if(lcdxs[u]=='0'){           
  914.                                 if(lcdxs[u+1]=='.'){      
  915.                                         break;                      //当计算结果是'0''.'的时候,跳出循环
  916.                                 }else{
  917.                                          if(lcdxs[u+1]==' '){       //计算结果是'0'的时候
  918.                                                  break;
  919.                                    }
  920.                              lcdxs[u]=' ';              //如果'0'后面没跟'.'
  921.                                    u++;                       //移位,准备下一位判断
  922.                            }                 
  923.                   }else{
  924.                            if(lcdxs[u]!='-'){           
  925.                              break;                     //碰到不是'-',跳出循环
  926.                            }else{
  927.                               u++;
  928.                             }
  929.                    }
  930.           }while(1);
  931.         }  
  932. }
复制代码
回复

使用道具 举报

ID:328014 发表于 2020-5-15 18:59 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:546568 发表于 2020-5-15 19:45 | 显示全部楼层

好厉害,51黑有你更精彩!!!
回复

使用道具 举报

ID:89217 发表于 2020-5-16 11:51 | 显示全部楼层


好厉害,51黑有你更精彩!!!
回复

使用道具 举报

ID:546698 发表于 2020-6-10 21:31 | 显示全部楼层
膜拜,大师级别的了,我是看不懂的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表