找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5922|回复: 1
收起左侧

基于单片机设计的简易计算器 能实现基本的加减乘除和清零

[复制链接]
ID:170729 发表于 2017-3-25 14:58 | 显示全部楼层 |阅读模式
这是用STC59C52单片机做的计算器,使用数码管显示,能实现基本的加减乘除和清零
2.jpg 1.jpg


源程序:
  1. /*****利用单片机设计的简易计算器********/
  2. /*****   单片机型号:STC59C52  ********/
  3. /*
  4. *采用4*4键盘,4行线,4列线
  5. *键盘行线列线接P1 IO口
  6. *数码管接P0口
  7. */
  8. #include <reg52.h>
  9. #define uchar unsigned char
  10. #define uint unsigned int
  11. sbit dula=P2^6;//573段选使能
  12. sbit wela=P2^7;//573位选使能

  13. sbit beep=P3^2;//蜂鸣器


  14. uchar temp,key;//按键变量
  15. uchar fun;//加,减,乘,除,标志位
  16. long int num1,num2,res;//num1与num2是2个要运算的变量,res是结果
  17. uchar aa,dis;//aa 2个运算数标志位 dis 2个运算数与结果标志
  18. uchar code table[]={       
  19.         0x00,0x3f,0x06,0x5b,
  20.         0x4f,0x66,0x6d,0x7d,
  21.         0x07,0x7f,0x6f,0x77,
  22.         0x7c,0x39,0x5e,0x79,0x71};//数码管段码
  23. uchar code weixuan[]={
  24.         0xdf,0xef,0xf7,
  25.         0xfb,0xfd,0xfe};//数码管位码

  26. void delay(unsigned char i)//延时
  27. {
  28. uchar j,k;
  29.   for(j=i;j>0;j--)
  30.     for(k=125;k>0;k--);
  31. }

  32. void bee()//蜂鸣器
  33. {
  34.         beep=0;        
  35.         delay(255);
  36.         delay(255);
  37.         beep=1;        
  38. }

  39. //按键检测
  40. //如果没有按键按下,则key取Init()函数中所赋值为16
  41. void key_scan()
  42. {
  43.         P1=0xfe;//先置第一行线为低,其余为高       
  44.            //高四位为列线,低四位为行线
  45.         temp=P1;
  46.            temp=temp&0xf0;
  47.         //进行与运算,把结果赋给temp
  48.         //此时temp = 0xf0
  49.         if(temp!=0xf0)                /*判断temp的高四位是否有0,如果有零的话,则此时temp != 0*/
  50.            {
  51.                 delay(10);
  52.                 temp = P1;
  53.                 temp=temp&0xf0;
  54.              if(temp!=0xf0)
  55.              {
  56.                        temp=P1;
  57.                        switch(temp)
  58.                        {
  59.                          case 0xee:     //此时按键坐标为1行1列
  60.                               key=1;
  61.                               break;
  62.                          case 0xde:
  63.                               key=2;
  64.                               break;
  65.                          case 0xbe:
  66.                               key=3;
  67.                               break;
  68.                          case 0x7e:
  69.                               key=12;
  70.                               break;
  71.                 }
  72.                 while(temp!=0xf0)        //等待按键释放
  73.                 {
  74.                           temp=P1;
  75.                           temp=temp&0xf0;
  76.                 }
  77.              }
  78.    }
  79.            P1=0xfd;
  80.            temp=P1;
  81.            temp=temp&0xf0;
  82.            if(temp!=0xf0)
  83.            {
  84.              delay(10);
  85.                 temp = P1;
  86.                 temp=temp&0xf0;
  87.              if(temp!=0xf0)
  88.              {
  89.                temp=P1;
  90.                switch(temp)
  91.                {
  92.                  case 0xed:
  93.                       key=4;
  94.                       break;
  95.                  case 0xdd:
  96.                       key=5;
  97.                       break;
  98.                  case 0xbd:
  99.                       key=6;
  100.                       break;
  101.                  case 0x7d:
  102.                       key=13;
  103.                       break;
  104.                 }
  105.                 while(temp!=0xf0)
  106.                 {
  107.                   temp=P1;
  108.                   temp=temp&0xf0;
  109.                 }
  110.              }
  111.     }
  112.    P1=0xfb;
  113.    temp=P1;
  114.    temp=temp&0xf0;
  115.    if(temp!=0xf0)
  116.    {
  117.              delay(10);
  118.                 temp = P1;
  119.                 temp=temp&0xf0;
  120.              if(temp!=0xf0)
  121.              {
  122.                        temp=P1;
  123.                        switch(temp)
  124.                        {
  125.                          case 0xeb:
  126.                               key=7;
  127.                               break;
  128.                          case 0xdb:
  129.                               key=8;
  130.                               break;
  131.                          case 0xbb:
  132.                               key=9;
  133.                               break;
  134.                          case 0x7b:
  135.                               key=14;
  136.                               break;
  137.                 }
  138.                 while(temp!=0xf0)
  139.                 {
  140.                           temp=P1;
  141.                           temp=temp&0xf0;
  142.                 }
  143.              }
  144.     }
  145.            P1=0xf7;
  146.            temp=P1;
  147.            temp=temp&0xf0;
  148.            if(temp!=0xf0)
  149.            {
  150.              delay(10);
  151.                 temp = P1;
  152.                 temp=temp&0xf0;
  153.              if(temp!=0xf0)
  154.              {
  155.                        temp=P1;
  156.                        switch(temp)
  157.                        {
  158.                                     case 0xe7:
  159.                                            key=10;
  160.                                      break;
  161.                                 case 0xd7:
  162.                                      key=0;
  163.                                      break;
  164.                                 case 0xb7:
  165.                                      key=11;
  166.                                      break;
  167.                                 case 0x77:
  168.                                      key=15;
  169.                                      break;
  170.                         }
  171.                 while(temp!=0xf0)
  172.                 {
  173.                           temp=P1;
  174.                           temp=temp&0xf0;
  175.                 }
  176.              }
  177.           }
  178. }
  179. /*uchar temp,key;//按键变量
  180. uchar fun;//加,减,乘,除,标志位
  181. long int num1,num2,res; //num1与num2是2个要运算的变量,res是结果
  182. uchar aa,dis;//aa 2个运算数标志位 dis 2个运算数与结果标志
  183. */
  184. void Init()//初始化
  185. {
  186.         num1=0;
  187.         num2=0;
  188.    
  189.     //P0 = 0; //关闭所有段选
  190.     wela=1;
  191.         P0=0xdf;//11011111
  192.         wela=0;
  193.        
  194.     dula=1;
  195.         P0=table[1];//显示0
  196.         dula=0;
  197.        
  198.         key=16;
  199.         aa=0;
  200.         dis=0;
  201.         res=0;
  202. }

  203. void dis_play(long int nm)//显示函数
  204. {
  205.         uchar a1,a6;//a1位段选变量,a6为位选变量
  206.         long int shu;
  207.         shu=nm;
  208.         if(shu==0)
  209.         {
  210.                 wela=1;
  211.                 P0=0xdf;
  212.                 wela=0;
  213.         dula=1;
  214.                 P0=table[1];
  215.                 dula=0;
  216.         }
  217.         else
  218.         {
  219.                 for(a6=0; a6<6; a6++)
  220.                 {
  221.                         a1=shu%10;//shu%10 shu比10小 a1=shu本身
  222.                         if(shu!=0)
  223.                         {
  224.                                 a1=a1+1;
  225.                         }
  226.                         shu=shu/10;//shu/10 shu比10小 shu为0
  227.                         P0=table[a1];
  228.             dula=1;
  229.                         dula=0;
  230.                         P0=weixuan[a6];
  231.                         wela=1;
  232.                         wela=0;
  233.                         delay(5);
  234.                 }        
  235.         }
  236. }
  237. void display()//显示选择函数,dis 0或1显示运算数,dis为2显示结果
  238. {
  239.         switch (dis)
  240.            {
  241.      case 0:
  242.                  {
  243.                         dis_play(num1);
  244.                 }        
  245.                 break;
  246.      case 1:
  247.                  {
  248.                         dis_play(num2);
  249.                 }        
  250.                 break;
  251.      case 2:
  252.                 {
  253.                         dis_play(res);
  254.                 }        
  255.                 break;
  256.    }        
  257. }

  258. void shanshuo()//数码管闪烁
  259. {
  260.         wela=1;
  261.         P0=0xff;
  262.         wela=0;
  263.         delay(255);
  264. }

  265. /*uchar temp,key;//按键变量
  266. uchar fun;//加,减,乘,除,标志位
  267. long int num1,num2,res; //num1与num2是2个要运算的变量,res是结果
  268. uchar aa,dis;//aa 2个运算数标志位 dis 2个运算数与结果标志
  269. */
  270. void check()//运算函数
  271. {
  272.         if(key!=16)
  273.         {
  274.                 bee();
  275.                 if(key>=10)
  276.                 {
  277.                         switch (key)
  278.                            {
  279.                      // CE   
  280.                                      case 10:
  281.                                          Init();
  282.                                          break;  
  283.                                      // =
  284.                                      case 11:
  285.                                          {
  286.                                                    switch (fun)//加,减,乘,除选择标志位
  287.                                                    {
  288.                                                      case 0:
  289.                                                          res=num1+num2,dis=2;
  290.                                                          break;//加法
  291.                                                      case 1:
  292.                                                          res=num1-num2,dis=2;
  293.                                                          break;//减法
  294.                                                      case 2:res=num1*num2,dis=2;
  295.                                  break;//乘法
  296.                                                      case 3:res=num1/num2,dis=2;
  297.                                  break;//除法
  298.                                                    }
  299.                                         };
  300.                                         break;
  301.                                         // +
  302.                                     case 12:
  303.                                                 fun=0,aa=1,shanshuo();
  304.                                         break;
  305.                                         // -   
  306.                                     case 13:
  307.                                                 fun=1,aa=1,shanshuo();
  308.                                         break;
  309.                                         // *   
  310.                                         case 14:
  311.                                                 fun=2,aa=1,shanshuo();
  312.                                         break;
  313.                                         // /   
  314.                                     case 15:
  315.                                                 fun=3,aa=1,shanshuo();
  316.                                         break;   
  317.                            }
  318.                 }
  319.                 else
  320.                 {
  321.                         switch (aa)//运算变量赋值标志位
  322.                            {
  323.                      case 0:
  324.                                  {
  325.                                         num1=num1*10+key;//把按键检测到的值赋给num1运算变量1        
  326.                                 };
  327.                                 break;
  328.                      case 1:
  329.                                  {
  330.                                         dis=1;
  331.                                         num2=num2*10+key;//把按键检测到的值赋给num2运算变量2
  332.                                 };


  333. …………余下代码请下载附件…………
复制代码
0.png

下载:
v1.rar (32.22 KB, 下载次数: 51)

评分

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

查看全部评分

回复

使用道具 举报

ID:1 发表于 2017-3-25 22:05 | 显示全部楼层
好资料,51黑有你更精彩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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