找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3034|回复: 2
收起左侧

简易单片机计算器仿真与程序源码

[复制链接]
ID:301988 发表于 2018-8-29 23:20 | 显示全部楼层 |阅读模式
一个简易计算器程序,包括keil4程序和protues仿真图

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. #include <reg52.h>

  2. unsigned char show[8]={0,0,0,0,0,0,0,0};
  3. unsigned char code seg7_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00,0x50,0x5c};
  4. unsigned char code wei_table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  5. unsigned char code err[]={0x0e,0x12,0x12,0x13,0x12,0x11,0x11,0x11};
  6. unsigned char count=0;
  7. unsigned long a,b;
  8. unsigned char flag=0;
  9. //unsigned char flag1=1;
  10. unsigned char key_code;
  11. bit key_press=0;

  12. void delay(long dly)
  13. {
  14.         while(dly--);
  15. }


  16. void disp(long dat)
  17. {
  18.    
  19.         bit flag1=0;   
  20.         long e;
  21.         unsigned char i;
  22.         e=dat;
  23.          if(e==0)
  24.         {
  25.                 for(i=0;i<7;i++)
  26.                 {
  27.                         show[i]=0x11;
  28.                 }
  29.                 show[7]=0x00;
  30.         }
  31.         else if((e>99999999)||(e<-9999999))
  32.         {
  33.         for(i=0;i<8;i++)
  34.                 {
  35.                          show[i]=err[i];
  36.                 }               
  37.         }
  38.        
  39.         else
  40.         {
  41.             if(e<0)
  42.                 {
  43.                         flag1=1;
  44.                         e=-e;
  45.                 }
  46.                 for(i=0;i<8;i++)
  47.                 {
  48.                         if(e>=1)
  49.                         {
  50.                             show[7-i]=e%10;
  51.                                 e=e/10;
  52.                         }
  53.                         else
  54.                         {
  55.                             if(flag1==1)
  56.                                 {
  57.                                         show[7-i]=0x10;
  58.                                         flag1=0;
  59.                                 }
  60.                                 else
  61.                                 {
  62.                                         show[7-i]=0x11;
  63.                                 }
  64.                         }
  65.                 }

  66.         }
  67. }

  68. void read_key()                //4X4矩阵键盘说明:行为输入,列为输出
  69. {
  70.     char x,y;
  71.         char i;
  72.         P1=0xf0;
  73.         if(P1!=0xf0)
  74.         {
  75.                 delay(1000);
  76.                 if(P1!=0xf0)
  77.                 {
  78.                     y=P1;
  79.                         x=0xfe;
  80.                         for(i=0;i<4;i++)
  81.                         {
  82.                                 P1=x |0xf0;
  83.                                 if((P1 & 0xf0)!=0xf0)
  84.                                 {
  85.                                         x=P1;
  86.                                         key_code=y | (x & 0x0f);
  87.                                         key_press=1;
  88.                                 }
  89.                                 x=(x<<1)+0x01;
  90.                         }
  91.                                 switch(key_code)
  92.                                         {
  93.                                                 case 0xee:    key_code=7;break;
  94.                                                 case 0xde:    key_code=8;break;
  95.                                                 case 0xbe:    key_code=9;break;
  96.                                                 case 0x7e:    key_code=14;break;
  97.                              case 0xed:    key_code=4;break;
  98.                                                 case 0xdd:    key_code=5;break;
  99.                                                 case 0xbd:    key_code=6;break;
  100.                                                 case 0x7d:    key_code=13;break;
  101.                                                 case 0xeb:    key_code=1;break;
  102.                                                 case 0xdb:    key_code=2;break;
  103.                                                 case 0xbb:    key_code=3;break;
  104.                                                 case 0x7b:    key_code=12;break;
  105.                              case 0xe7:    key_code=15;break;
  106.                                                 case 0xd7:    key_code=0;break;
  107.                                                 case 0xb7:    key_code=16;break;
  108.                                                 case 0x77:    key_code=11;break;
  109.                                         }
  110.                                   
  111.                 }
  112.                
  113.         }
  114. }
  115. void calculate()
  116. {
  117.       if(key_code<10)
  118.           {
  119.                if(flag==0)
  120.                    {
  121.                       a=a*10+key_code;
  122.                           disp(a);
  123.                         }
  124.                    else
  125.                    {
  126.                       b=b*10+key_code;
  127.                           disp(b);
  128.                         }
  129.       }
  130.           else
  131.           {
  132.              switch(key_code)
  133.                 {
  134.                         case 11:flag=1;break;
  135.                         case 12:flag=2;break;
  136.                         case 13:flag=3;break;
  137.                         case 14:flag=4;break;
  138.                         case 15:a=0;b=0;disp(a);flag=0;break;
  139.                         case 16:{
  140.                                                 switch(flag)
  141.                                                 {
  142.                                                         case 1:a=a+b;disp(a);b=0;break;
  143.                                                         case 2:a=a-b;disp(a);b=0;break;
  144.                                                         case 3:a=a*b;disp(a);b=0;break;
  145.                                                         case 4:a=a/b;disp(a);b=0;break;
  146.                                                 }
  147.                                         }
  148.                 }
  149.           }
  150.              

  151.      
  152. }

  153. void main()
  154. {
  155.     TMOD=0x01;
  156.         TH0=(65536-1000)/256;
  157.         TL0=(65536-1000)%256;
  158.         TR0=1;
  159.         EA=1;
  160.         ET0=1;
  161.         a=0;
  162.         b=0;
  163.         disp(a);
  164. //        get_keycode();
  165.         while(1)
  166.         {
  167.                 read_key();
  168.                 if(key_press==1)
  169.                 {
  170.                         calculate();
  171.                     key_press=0;
  172.                 }
  173.                 delay(3000);
  174.         }
  175. }

  176. void TIMER0_ISR() interrupt 1  using 1
  177. {
  178.         TH0=(65536-1000)/256;
  179.         TL0=(65536-1000)%256;
  180.         P0=0x00;
  181.         P2=(P2 & 0xe3)|(count<<2);
  182.         P0=seg7_table[show[count]];
  183.         count++;
  184.         if(count>7)
  185.         {
  186.                 count=0;
  187.         }
  188. }
复制代码
0.png
所有资料51hei提供下载:
简易计算器.zip (64.61 KB, 下载次数: 51)

评分

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

查看全部评分

回复

使用道具 举报

ID:768763 发表于 2020-6-10 20:45 | 显示全部楼层
请问一下这个计算器的功能
回复

使用道具 举报

ID:702749 发表于 2020-6-11 09:36 | 显示全部楼层
981120 发表于 2020-6-10 20:45
请问一下这个计算器的功能

实现基本的运算
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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