找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1920|回复: 3
收起左侧

求助,为什么计算器无法正确仿真

  [复制链接]
ID:306995 发表于 2018-4-17 13:47 | 显示全部楼层 |阅读模式
要求是:
1.简易四则运算,包括负数运算
2.错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示OV;当除数为0时,计算器会在LCD上提示ERR。
仿真图在压缩包里
以下是程序:
  1. #include<reg51.h>   
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit lcden=P1^1;
  5. sbit rs=P1^0;
  6. sbit rw=P1^2;
  7. sbit busy=P0^7;

  8. char i,j,temp,num,num_1;
  9. long a,b,c;     
  10. float a_c,b_c;
  11. uchar flag,fuhao;



  12. uchar code table[]={
  13. 7,8,9,0,
  14. 4,5,6,0,
  15. 1,2,3,0,
  16. 0,0,0,0};
  17. uchar code table1[]={
  18. 7,8,9,0x2f-0x30,      
  19. 4,5,6,0x2a-0x30,
  20. 1,2,3,0x2d-0x30,      
  21. 0x01-0x30,0,0x3d-0x30,0x2b-0x30
  22. };
  23. void delay(uchar z)
  24. {
  25. uchar y;
  26. for(z;z>0;z--)
  27.    for(y=0;y<110;y++);
  28. }
  29. void write_com(uchar com)
  30. {
  31.         rs=0;
  32.         P0=com;   
  33.         delay(5);lcden=1;delay(5); lcden=0;
  34. }

  35. void write_date(uchar date)
  36. {
  37.         rs=1; P0=date; delay(5);
  38.         lcden=1; delay(5); lcden=0;
  39. }

  40. void init()
  41. {
  42.     num=-1;
  43. lcden=1;
  44. rw=0;
  45. write_com(0x38);
  46. delay(5); write_com(0x38);
  47. delay(5); write_com(0x0c);
  48. delay(1); write_com(0x06);
  49. delay(1); write_com(0x80);
  50. delay(1); write_com(0x01);
  51. num_1=0;
  52. i=0; j=0;
  53. a=0;     
  54. b=0;     
  55. c=0;
  56. flag=0;
  57. fuhao=0;
  58. }
  59. void keyscan()
  60. {
  61.         P2=0xfe;
  62.         if(P2!=0xfe)
  63.         {
  64.            delay(20);
  65.            if(P2!=0xfe) {  temp=P2&0xf0;
  66.             switch(temp)
  67.             {
  68.              case 0xe0:num=0;   break;        //7
  69.              case 0xd0:num=1;   break;         //8
  70.              case 0xb0:num=2;   break;        //9
  71.              case 0x70:num=3;   break;      
  72.             }
  73.            }   while(P2!=0xfe);
  74.            if(num==0||num==1||num==2)
  75.            {
  76.                if(j!=0){write_com(0x01); j=0;  }
  77.                if(flag==0)
  78.                     { a=a*10+table[num];    }
  79.                     else
  80.                     {    b=b*10+table[num];   }
  81.            }
  82.            else
  83.            {
  84.             flag=1;         
  85.             fuhao=4;
  86.            }
  87.            i=table1[num];     
  88.            write_date(0x30+i);
  89.         }

  90.         P2=0xfd;
  91.         if(P2!=0xfd)
  92.         {
  93.            delay(20);
  94.            if(P2!=0xfd){  temp=P2&0xf0;
  95.             switch(temp)
  96.             {
  97.              case 0xe0:num=4; break; //4
  98.              case 0xd0:num=5; break; //5
  99.              case 0xb0:num=6; break; //6
  100.              case 0x70:num=7; break; //¡á
  101.             }
  102.            }   while(P2!=0xfd);
  103.            if(num==4||num==5||num==6&&num!=7)
  104.            {
  105.             if(j!=0){ write_com(0x01);  j=0;   }
  106.                if(flag==0)
  107.             { a=a*10+table[num];     }
  108.             else
  109.             { b=b*10+table[num];   }
  110.            }
  111.            else
  112.            {  flag=1;
  113.               fuhao=3;
  114.            }
  115.            i=table1[num];      
  116.            write_date(0x30+i);
  117.         }

  118.         P2=0xfb;
  119.         if(P2!=0xfb){  delay(20);
  120.            if(P2!=0xfb) { temp=P2&0xf0;
  121.             switch(temp)
  122.             {
  123.              case 0xe0:num=8;    break;         //1
  124.              case 0xd0:num=9;    break;         //2
  125.              case 0xb0:num=10;   break;         //3
  126.              case 0x70:num=11;   break;         //-
  127.             }
  128.            }   while(P2!=0xfb);
  129.            if(num==8||num==9||num==10)
  130.            {
  131.             if(j!=0){ write_com(0x01);  j=0;  }
  132.               if(flag==0)
  133.             { a=a*10+table[num];   }
  134.             else
  135.             { b=b*10+table[num]; }
  136.            }
  137.            else if(num==11)
  138.            {
  139.             flag=1;
  140.             fuhao=2;
  141.            }
  142.            i=table1[num];  
  143.            write_date(0x30+i);
  144.         }

  145.         P2=0xf7;
  146.         if(P2!=0xf7){   delay(20);
  147.            if(P2!=0xf7){ temp=P2&0xf0;
  148.             switch(temp)
  149.             {
  150.              case 0xe0:num=12; break;
  151.              case 0xd0:num=13; break;     
  152.              case 0xb0:num=14; break;     
  153.              case 0x70:num=15; break;  
  154.             }                                                                  
  155.                 } while(P2!=0xf7);

  156.            switch(num)
  157.            {
  158.             case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}
  159.                             break;
  160.             case 13:{               
  161.                if(flag==0)
  162.                { a=a*10;  write_date(0x30);     P2=0;       }
  163.                else if(flag>=1)
  164.                {  b=b*10;   write_date(0x30);       }
  165.               }     break;
  166.             case 14:{j=1;
  167.                    if(fuhao==1)         
  168.                            {
  169.                                            write_com(0x80+0x4f);
  170.                                    write_com(0x04);     
  171.                                    c=a+b;
  172.                                    while(c!=0){write_date(0x30+c%10);        c=c/10;                }
  173.                                    write_date(0x3d);     
  174.                                    a=0;b=0;flag=0;fuhao=0;
  175.                    }
  176.                       else if(fuhao==2)         
  177.                              {
  178.                                         write_com(0x80+0x4f);
  179.                             write_com(0x04);     
  180.                                    if(a-b>0)                 c=a-b;
  181.                                    else                      c=b-a;
  182.                                    while(c!=0)        { write_date(0x30+c%10);c=c/10;         }
  183.                                    if(a-b<0)          write_date(0x2d);
  184.                                    write_date(0x3d);            
  185.                                    a=0;b=0;flag=0;fuhao=0;
  186.                    }
  187.                        else if(fuhao==3)      
  188.                                  {write_com(0x80+0x4f);            write_com(0x04);
  189.                              c=a*b;
  190.                              while(c!=0)        {write_date(0x30+c%10);        c=c/10;              }
  191.                              write_date(0x3d);           a=0;b=0;flag=0;fuhao=0;
  192.                      }
  193.                         else if(fuhao==4)
  194.                                           {write_com(0x80+0x4f);
  195.                                     write_com(0x04);
  196.                                     i=0;
  197.                                                 if(b!=0)
  198.                                                 {
  199.                                             c=(long)(((float)a/b)*1000);
  200.                                             while(c!=0)
  201.                                              {
  202.                                                        write_date(0x30+c%10);
  203.                                                         c=c/10;
  204.                                                            i++; if(i==3) write_date(0x2e);
  205.                                                 }
  206.                                                     if(a/b<=0)
  207.                                                          {
  208.                                                                  if(i<=2)
  209.                                                                  {      
  210.                                                                         
  211.                                                                         if(i==1) write_date(0x30);
  212.                                                                         write_date(0x2e);           //  .
  213.                                                                         write_date(0x30);
  214.                                                                  }
  215.                                                                
  216.                                                       write_date(0x30);           //
  217.                                                         }
  218.                                             write_date(0x3d);                              
  219.                                                     a=0;b=0;flag=0;fuhao=0;
  220.                                                 }
  221.                                                 else
  222.                                                 {
  223.                                                         write_date('!');write_date('R');write_date('O');
  224.                                                         write_date('R');write_date('R');write_date('E');
  225.                                                 }
  226.                          }
  227.               }  break;
  228.              case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}     break;
  229.            }
  230.         }//P2!=0xf7
  231. }

  232. main()
  233. {
  234.         init();      
  235.         while(1)
  236.         {
  237.            keyscan();
  238.         }
  239. }
复制代码


回复

使用道具 举报

ID:310447 发表于 2018-4-17 21:33 | 显示全部楼层
找到人了没,兄弟
回复

使用道具 举报

ID:164602 发表于 2018-4-18 14:58 | 显示全部楼层

http://www.51hei.com/bbs/dpj-76023-1.html
在本论坛找的,你还可以找找其它的帖子,这个内容应该不新鲜。
回复

使用道具 举报

ID:444306 发表于 2019-2-1 10:14 | 显示全部楼层
你自身要求的这些判断条件你都没很好的加进去,正确做法应该是一个个地将条件加入进去调试.而却这一步是最好关键的!

评分

参与人数 5黑币 +115 收起 理由
yoxi + 15
#include51.h + 15
Sawardeakar + 15 很给力!
刀刀见红 + 35 很给力!
shuisheng + 35 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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