新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于51單片機六位整數計算器源程序

        基于51單片機六位整數計算器源程序

        作者: 時間:2016-11-23 來源:網絡 收藏
        #include

        #define uint unsigned int
        #define uchar unsigned char
        sbit beep=P2^3; //beep用于控制蜂鳴器(每按一次鍵就為0并且叫一下)
        sbit dula=P2^6; //dula通過控制鎖存器1來控制數碼管段選
        sbit wela=P2^7; //wela通過控制鎖存器2來控制數碼管位選
        uchar code table[]={ //數碼管的顯示編碼
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x79};
        uchar fuhao=0,scan=0; //全局變量fuhao用來存放運算符的值 scan作為是否按鍵的標志位(按下就為1沒按為0)
        void delay(uint z); //延時Z毫秒
        void display(long n);//用六位數碼管顯示long值
        uchar keyscan(); //鍵盤掃描并把掃描得到的值返回
        void displayerror();//顯示錯誤操作提示信息

        void main()
        {
        uchar val=0,j=0,i=0,jie,e=0; //i,j用于判斷每次輸入的數是否超過六位,e為錯誤操作標志位(為1表示已錯誤操作),jie為顯示計算結果標志位(為1表示要顯示結果)
        long a=0,b=0,c=0;//a存放第一次輸入的數,b存放第二次輸入的數,c存放計算的結果
        display(0); //初始化顯示
        delay(1000); //延時1000毫秒
        while(1)
        {
        beep=1; //關閉蜂鳴器
        val=keyscan(); //把掃描得到的值賦給val
        if(scan==1) //一旦按下鍵我就對其操作
        {
        scan=0; //把按鍵標志位scan復位
        if(val==10) //如果按下的為復位鍵
        {
        a=0;b=0;c=0;fuhao=0;jie=0;e=0;i=0;j=0;display(0);

        本文引用地址:http://www.104case.com/article/201611/320204.htm

        //復位操作(初始化) (顯示是不能停)
        continue; //直接進入下一次循環
        }
        else if(val>=11&&val<=15&&i==0&&fuhao==0)//如果第一次按下的不是數字鍵
        {
        display(0); //數碼管顯示不能停
        continue; //直接進入下一次循環
        }

        else if(val>=12&&val<=15&&fuhao==0&&i!=0)//輸入數字之后按下的第一個運算符
        {
        fuhao=val; //把掃描得到運算符值賦給fuhao標志位
        i=0; //一旦輸入運算符就把數字輸入計數i清零
        display(0); //數碼管顯示不能停
        }
        else if(fuhao!=0&&val>=11&&val<=15) //只要按下等于或者運算符之前按了數字鍵和運算符就顯示計算結果
        {
        jie=1; //計算結果標志位jie為1(表示要顯示計算結果c)
        if(fuhao==12) //如果輸入的是運算符‘+’
        {
        c=a+b; //把運算的結果賦給c
        if(c>999999)//如果計算結果超出數碼管的顯示范圍
        {
        displayerror(); //顯示出錯信息
        e=1; //出錯信息標志位置1
        }
        else
        {
        display(c);//不超出顯示范圍就顯示結果
        }
        }
        else if(fuhao==13)//如果輸入的運算符是‘-’
        {
        if(a{
        displayerror();
        }
        else
        {
        c=a-b;
        display(c);
        }
        }
        else if(fuhao==14) //如果輸入的運算符是‘*’
        {
        c=a*b;
        if(c>999999)
        {
        displayerror();
        e=1;
        }
        else
        {
        display(c);
        }
        }
        else //如果輸入的運算符是‘/’
        {
        c=a/b;
        display(c);
        }
        }
        else if(val>=0&&val<=9)//如果按下的為數字鍵
        {
        if(fuhao==0)//如果是第一次按下數字鍵
        {
        a=a*10+val;//把前面顯示的值左移一位再加當前輸入的數字存放到a(0到9)
        i++;//每輸入一個數字,數字計數i加1
        if(i>6) //如果連續輸入數字超過六位
        {
        displayerror();e=1;//顯示出錯信息且錯誤標志位置1
        }
        else
        {
        display(a);//顯示得到的a
        continue;//進入下次次循環
        }
        }
        else //第二次按下數字鍵
        {
        b=b*10+val; //把前面顯示的值左移一位再加當前輸入的數字存放到b(0到9)
        j++; //第二次輸入數字的計算變量j加1
        if(j>6) //如果輸入超出數碼管顯示范圍
        {
        displayerror();e=1;
        }
        else
        {
        display(b);
        continue;
        }
        }
        }

        }
        else //如果沒按下鍵(也要顯示)
        {
        if(e==1) displayerror();//如果出錯標志位為1就顯示出錯信息
        else if(fuhao==0) display(a); //如果還沒輸入運算符(到目前為止還只是輸入數字)就顯示a
        else if(fuhao!=0&&jie==0) display(b); //如果輸入數字后又輸了運算符且沒輸入運算符和等于就顯示b
        else if(jie==1) display(c); //如果輸入了結果標志位就顯示計算結果c
        else display(0); //其余就初始化顯示
        }

        }
        }

        void delay(uint z)
        {
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }


        uchar keyscan()
        {
        uchar num,temp1,temp2,temp; //num用于存放掃描到得按鍵值
        P3=0x0f; //給P3口低四位賦0高四位賦1
        temp1=P3; //讀取P3口的值
        if(temp1!=0x0f) //如果P3口發生變化
        {
        delay(10);//延時消斗
        temp1=P3;//再次讀取P3口的值
        if(temp1!=0x0f)//如果確實有按鍵按下
        {
        P3=0xf0;//再給P3口高四位賦1低四位賦0
        temp2=P3;//讀取P3口的值
        temp=temp1|temp2;//把兩次讀取的值或運算賦給temp
        switch(temp)//判斷temp按下的是哪個鍵再對num賦值
        {
        case 0xee:num=0;
        break;
        case 0xde:num=1;
        break;
        case 0xbe:num=2;
        break;
        case 0x7e:num=3;
        break;
        case 0xed:num=4;
        break;
        case 0xdd:num=5;
        break;
        case 0xbd:num=6;
        break;
        case 0x7d:num=7;
        break;
        case 0xeb:num=8;
        break;
        case 0xdb:num=9;
        break;
        case 0xbb:num=10;
        break;
        case 0x7b:num=11;
        break;
        case 0xe7:num=12;
        break;
        case 0xd7:num=13;
        break;
        case 0xb7:num=14;
        break;
        case 0x77:num=15;break;
        default: num=16;break;
        }
        while(temp2!=0xf0) //松手檢測
        {
        temp2=P3;
        }
        beep=0;//每掃描到一個num蜂鳴器就叫一下
        scan=1;//已按下鍵
        }
        }
        return num; //返回掃描得到的值
        }

        void displayerror() //最高位顯示E表示出錯信息
        {
        dula=1;
        P0=table[10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xdf;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;
        }

        void display(long n)
        {
        uchar j=0;
        long quan=1;
        if(n==0) //如果n為0則初始化顯示(最高位顯示0)
        {
        wela=1;
        P0=0xdf;
        wela=0;
        dula=1;
        P0=table[0];
        dula=0;
        P0=0xff;
        delay(1);
        wela=1;
        P0=0xff; //把數碼管全關掉(用于消掉余輝)
        wela=0;
        }
        else
        {
        while(n/quan!=0) //用于判斷long為幾位
        {
        quan=quan*10;
        j++; // j用于存放long的位數
        }
        if(j==1) //如果long為一位
        {
        wela=1;
        P0=0xdf;
        wela=0;
        dula=1;
        P0=table[n];
        dula=0;
        P0=0xff;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;
        }
        else if(j==2)
        {
        dula=1;
        P0=table[n/10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xef;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[n%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xdf;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;
        }
        else if(j==3)
        {
        dula=1;
        P0=table[n/100];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[(n/10)%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xef;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[n%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xdf;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;
        }
        else if(j==4)
        {
        dula=1;
        P0=table[n/1000];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[(n/100)%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[(n/10)%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xef;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[n%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xdf;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;
        }
        else if(j==5)
        {
        dula=1;
        P0=table[n/10000];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[(n/1000)%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[(n/100)%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[(n/10)%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xef;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[n%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xdf;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;
        }
        else
        {
        dula=1;
        P0=table[(n/100000)];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[(n/10000)%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[(n/1000)%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay(1);

        dula=1;
        P0=table[(n/100)%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[(n/10)%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xef;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;

        dula=1;
        P0=table[n%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xdf;
        wela=0;
        delay(1);
        wela=1;
        P0=0xff;
        wela=0;
        }
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 广平县| 行唐县| 新蔡县| 洞口县| 舒兰市| 新化县| 桦南县| 连云港市| 陆丰市| 辽阳市| 内黄县| 德州市| 广汉市| 盐津县| 曲靖市| 荆州市| 集安市| 赞皇县| 晴隆县| 南华县| 六枝特区| 靖远县| 呈贡县| 登封市| 永登县| 安陆市| 襄汾县| 北流市| 汾阳市| 鄄城县| 庆城县| 山西省| 枣阳市| 武陟县| 佛山市| 息烽县| 江达县| 彝良县| 江津市| 化州市| 堆龙德庆县|