找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1930|回复: 1
打印 上一主题 下一主题
收起左侧

求助,为何protues仿真运算符号键均用不了

[复制链接]
跳转到指定楼层
楼主
5黑币
点第一个数后 点符号键 前一个数会清0


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uint num1,num2,result;
  5. uchar symbol1,symbol2,flag;
  6. uchar codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  7. void delayms(uint x) //延时函数
  8. {   
  9. uint i;   
  10. while(x--) for(i=0;i<120;i++);   
  11. }
  12. void CLR()//清零
  13. {  
  14. result=0;     
  15. num1=0;  
  16. num2=0;  
  17. symbol1=0;
  18. symbol2=0;
  19. flag=0;   
  20. }
  21. void display(uint result)  //显示函数
  22. {
  23.        ucharqian,bai,shi,ge;
  24.        qian= result/1000;
  25.        bai= result%1000/100;
  26.        shi= result%100/10;
  27.        ge= result%10;
  28.        P0= 0;
  29.        P1= 0xfe;                     //千位
  30.        P0= table[qian];
  31.        delayms(3);
  32.        P1= 0xfd;                     //百位
  33.        P0= table[bai];
  34.        delayms(3);
  35.                                           
  36.        P1= 0xfb;                     //十位
  37.        P0= table[shi];
  38.        delayms(3);
  39.        P1= 0xf7;                     //个位
  40.        P0= table[ge];
  41.        delayms(3);
  42. }
  43. void keybord()                                           //反转法
  44. { uchar firstnum,nextnum,keynum;
  45. flag = result = num1 = num2 = 0;
  46. while(1)
  47. {  P2=0x0f;
  48.        firstnum=P2;
  49.         P2=0xf0;
  50.         nextnum=P2;
  51.         keynum=nextnum|firstnum;
  52.         switch(keynum)
  53.         {
  54.         case 0xee: delayms(200);
  55.                             if(flag< 2)                  //1
  56.                             {
  57.                                   num1= num1*10 + 1;
  58.                                    result= num1;
  59.                                    flag++;
  60.                                    
  61.                             };break;
  62.         case 0xde:delayms(200);                                //2
  63.                          if(flag < 2)
  64.                             {
  65.                                   num1= num1*10 + 2;
  66.                                    result= num1;
  67.                                    flag++;
  68.                             };break;
  69.         case 0xbe: delayms(200);                            //3
  70.                          if(flag < 2)
  71.                             {
  72.                                   num1= num1*10 + 3;
  73.                                    result= num1;
  74.                                    flag++;
  75.                             };break;
  76.         case 0x7e: delayms(200);                     //4
  77.                          if(flag < 2)
  78.                             {
  79.                                   num1= num1*10 + 4;
  80.                                    result= num1;
  81.                                    flag++;
  82.                             };break;
  83.         case 0xed: delayms(200);                            //5
  84.                          if(flag < 2)
  85.                             {
  86.                                   num1= num1*10 + 5;
  87.                                    result= num1;
  88.                                    flag++;
  89.                             };break;
  90.         case 0xdd: delayms(200);                            //6
  91.                          if(flag < 2)
  92.                             {
  93.                                   num1= num1*10 + 6;
  94.                                    result= num1;
  95.                                    flag++;
  96.                             };break;
  97.         case 0xbd: delayms(200);                     //7
  98.                          if(flag < 2)
  99.                             {
  100.                                   num1= num1*10 + 7;
  101.                                    result= num1;
  102.                                    flag++;
  103.                             };break;
  104.         case 0x7d: delayms(200);                            //8
  105.                          if(flag < 2)
  106.                             {
  107.                                   num1= num1*10 + 8;
  108.                                    result= num1;
  109.                                    flag++;
  110.                             };break;
  111.         case 0xeb: delayms(200);                     //9
  112.                          if(flag < 2)
  113.                             {
  114.                                   num1= num1*10 + 9;
  115.                                    result= num1;
  116.                                    flag++;
  117.                             };break;
  118.         case 0xdb: delayms(200);            //0
  119.                          if(flag < 2)
  120.                             {
  121.                                   num1= num1*10 + 0;
  122.                                    result= num1;
  123.                                    flag++;
  124.                             };break;
  125.         case 0xbb: symbol1 = '+';                       //+
  126.                             symbol2= symbol1;
  127.                             result= num2 = num1;
  128.                             num1= 0;
  129.                             flag= 0;
  130.                             break;
  131.         case 0x7b: symbol1 = '-';                   //-
  132.                             symbol2= symbol1;
  133.                             result= num2 = num1;
  134.                             num1= 0;
  135.                             flag= 0;
  136.                             break;
  137.         case 0xe7: symbol1 = '*';                           //*
  138.                             symbol2= symbol1;
  139.                             result= num2 = num1;
  140.                             num1= 0;
  141.                             flag= 0;
  142.                             break;
  143.         case 0xd7: symbol1 = '/';                  //÷
  144.                             symbol2= symbol1;
  145.                             result= num2 = num1;
  146.                             num1= 0;
  147.                             flag= 0;
  148.                             break;
  149.         case 0xb7: CLR();break;
  150.         case 0x77: delayms(200);                     //=
  151.                           symbol1= '=';
  152.                             break;
  153.         
  154.               default:break;
  155.         }
  156.                                   if(symbol1=='=')
  157.                                   {switch(symbol2)
  158.                            {
  159.                              case '+':
  160.                                     result = num2 + num1;
  161.                                 break;
  162.                            
  163.                                 case '-':
  164.                                     result = num2 - num1;
  165.                                 break;     
  166.                            
  167.                                 case '*':
  168.                                     result = num2 * num1;
  169.                                break;     
  170.                            
  171.                                 case'/':
  172.                                     result = num2 / num1;
  173.                                 break;   }      
  174.                            }display(result);
  175.   }
  176.   
  177. }
  178. void main()
  179.   {
  180.       keybord();
  181.       
  182.   }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:265478 发表于 2017-12-24 11:56 | 只看该作者
求大神 求别沉
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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