找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3093|回复: 0
收起左侧

单片机矩阵键盘简易计算器源程序

[复制链接]
ID:375004 发表于 2018-8-7 09:34 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. /*-----------------------------------------------
  2.   名称:液晶显示计算器
  3.   修改:无
  4.   内容:整数之间运算,没有小数所有除法得出的结果不正确,有负号运算,
  5. ------------------------------------------------*/
  6. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  7. #include<stdio.h>
  8. #include"display.h"
  9. #include"delay.h"
  10. #include"keyboard.h"


  11. /*------------------------------------------------
  12.                     主程序
  13. ------------------------------------------------*/
  14. main()
  15. {
  16. unsigned char num,i,sign;                  
  17. unsigned char temp[8];        //最大输入8个
  18. bit firstflag;
  19. int a=0,b=0;
  20. unsigned char s;

  21. Init_Timer0();   //初始化定时器0
  22. while (1)         //主循环
  23.   {


  24. num=KeyPro();  //扫描键盘
  25. if(num!=0xff)  //如果扫描是按键有效值则进行处理
  26.    {
  27.     if(i==0)    //输入是第一个字符的时候需要把改行清空,方便观看
  28.           {
  29.           for(s=0;s<8;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果
  30.                   TempData[s]=0;
  31.           }
  32.         if(('+'==num)|| (i==8) || ('-'==num) || ('x'==num)|| ('/'==num) || ('='==num))//输入数字最大值8,输入符号表示输入结束
  33.           {
  34.           i=0;  //计数器复位

  35.          if(firstflag==0)  //如果是输入的第一个数据,赋值给a,并把标志位置1,到下一个数据输入时可以跳转赋值给b
  36.              {
  37.              sscanf(temp,"%d",&a);//从一个字符串输入到变量
  38.          firstflag=1;
  39.                  }
  40.           else  
  41.              sscanf(temp,"%d",&b);
  42.           for(s=0;s<8;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果
  43.                     temp[s]=0;
  44.       
  45.           ///////////////////////
  46.           if(num!='=')      //判断当前符号位并做相应处理
  47.              sign=num;      //如果不是等号记下标志位
  48.           else
  49.              {  
  50.                  firstflag=0;   //检测到输入=号,判断上次读入的符合
  51.          switch(sign)
  52.                {
  53.                     case '+':a=a+b;
  54.                         break;
  55.                         case '-':a=a-b;
  56.                         break;
  57.                         case 'x':a=a*b;
  58.                         break;
  59.                         case '/':a=a/b;
  60.                         break;
  61.                         default:break;
  62.                    }
  63.                  sprintf(temp,"%d",a);  //打印十进制到临时缓冲区
  64.                  for(s=0;s<8;s++)       //由于打印的是ASCII码值
  65.                     {
  66.                         if(temp[s]==0)      //所以需要转换,如果为0表示null 数码管上则不能显示,所以赋值0
  67.                 TempData[s]=0;
  68.                         else if(temp[s]==0x2d)//表示负号,数码管显示负号 0x40
  69.                              TempData[s]=0x40;
  70.                     else
  71.                          TempData[s]=dofly_DuanMa[temp[s]-'0'];//其他0-9负号则进行ASCII 到 数字处理,如当前是'3',用'3'-'0'=3
  72.                                                                        //'3'的16进制是0x33,'0'的16进制是0x30                             
  73.                         }
  74.                  sign=0;a=b=0;            //用完后所有数据清零
  75.                  for(s=0;s<8;s++)
  76.                     temp[s]=0;
  77.                  }
  78.           }

  79. ……………………

  80. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
矩阵键盘简易计算器.rar (43.27 KB, 下载次数: 25)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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