微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机计算器程序问题··

51单片机计算器程序问题··

时间:10-02 整理:3721RD 点击:

我C语言很基础·····
这个程序有很多地方都不明白·求大侠给讲解··
红字部分是我自己理解的·和想不明白的地方······
可能我表达的会有些不清楚···最好大侠能深刻的讲解下·····
C语言我是自学的·上学那会都没怎么学··而且工作几年了都忘了··其他的不说了·多谢帮助·多多包涵·····谢谢关照·····

源程序·····
#include<reg52.h>
#include<stdio.h>
#include"display.h"
#include"delay.h"
#include"keyboard.h"
main()
{
    unsigned char num,i,sign;
    unsigned char temp[8];
    unsigned char s;
    bit firstflag;
    int a=0,b=0;

    init_timer0();
    while(1)
    {
        num=keypro();
        if(num!=0xff)
        {
            if(i==0)
            {
                for(s=0;s<8;s++)
                tempdata=0;
            }
            if(('+'==num)||(i==8)||('-'==num)||('x'==num)||('/'==num)||('='==num))【1】如果按键按下这些符号键或者i==8就执行下面语句·
            {
                i=0;
                if(firstflag==0)【2】这句话不太明白·为什么是等于0呢·等于1不可以吗·还有为什么要使用这么一个条件语句呢·
                {
                    sscanf(temp,"%d",&a);【3】sscanf不太明白他的作用·百度后理解是从temp中输入一个数字;不知道对不对·
                    firstflag=1;【4】这时候为什么是1了呢···不明白··
                    }
                    else
                    sscanf(temp,"%d",&b);
                    for(s=0;s<8;s++)
                    temp=0;
                    if(num!='=')
                    sign=num;
                    else
                    {
                        firstflag=0;【5】同样不理解····
                        switch(sign)
                        {
                            case '+':a=a+b;break;
                            case '-':a=a-b;break;
                            case 'x':a=a*b;break;
                            case '/':a=a/b;break;
                            default:break;
                        }
                        sprintf(temp,"%d",a);【6】sprintf的作用也是不太明白·百度后也是从temp中输出一个数组··就不明白写这两个命令的作用是什么?
                        for(s=0;s<8;s++)
                        {
                            if(temp==0)
                            tempdata=0;
                            else if(temp==0x2d)
                            tempdata=0x40;
                            else
                            tempdata=duanma[temp-'0'];【7】这句话说是ASCII转换成数字·难道temp存储的是16进制数?是不是跟数码管定义的数字?
                        }
                        sign=0;a=b=0;
                        for(s=0;s<8;s++)
                        temp=0;
                    }
                }
                else if(i<16)
                {
                    temp=num+'0';【8】·那这句话是不是由数字转换成ASCII,我那么麻烦干什么呢·我吧上面的temp-'0'换成temp 不就行了·?
                    tempdata=duanma[num];
                    i++;
                }
            }
        }
    }

写的好乱啊,建议你去看看单片机寄存器的定义和使用方法

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top