新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于51單片機(jī)的計(jì)算器 C語言程序

        基于51單片機(jī)的計(jì)算器 C語言程序

        作者: 時(shí)間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
        前些日子再博客上轉(zhuǎn)載了一篇計(jì)算器的C程序,由于這些日子一直忙于考試,也抽不出時(shí)間來重寫一下基于C51的計(jì)算器,昨晚考完信號(hào)處理,回來就著手寫,一直弄到凌晨3點(diǎn)多,現(xiàn)面把代碼帖出來和大家一起共免,由于時(shí)間倉促,代碼部分可能還有不足,并且程序只是再我的實(shí)驗(yàn)板上調(diào)試,如有不足請多多執(zhí)教,程序時(shí)C和匯編混合編程,匯編部分值用到延時(shí)的處理,其他代碼都用C寫的,希望哪為高人能夠?qū)懗龉δ芨鼮閺?qiáng)大的計(jì)算器程序一起分享,對于我的程序,哪位博友增添了更多功能的話,希望發(fā)到回復(fù)里,以共同進(jìn)步!
        程序代碼如下:

        #include
        #define uchar unsigned char
        #define uint unsigned int
        bit NumSem;//前后操作數(shù)的互斥信號(hào)量
        bit equ;//等號(hào)判斷
        bit clr;//清零標(biāo)志
        bit add;//加標(biāo)志
        bit dec;//減標(biāo)志
        bit mul;//乘標(biāo)志
        bit div;//除標(biāo)志
        bit op;//算術(shù)符號(hào)標(biāo)志
        uchar KeyNum;//鍵值
        uint result;//計(jì)算結(jié)果
        uint PreNum,LatNum;//計(jì)算的兩個(gè)操作數(shù)前操作數(shù),后操作數(shù)
        uchar KeyPos;
        uchar DisLed[]={0xC0,0xF9,0xA4,0xB0,0x99,//LED數(shù)碼七段表
        0x92,0x82,0xF8,0x80,0x90};
        uchar NumBufe[]={0,0,0,0};
        //sbit P10=P1^0;
        //sbit P11=P1^1;
        //sbit P12=P1^2;
        //sbit P13=P1^3;
        void T0Intal(void);//定時(shí)器0初始化程序
        void DisPlay(void);//顯示程序
        void ResultNum(void);//計(jì)算器運(yùn)算結(jié)果
        void Clear(void);//清零程序
        void Delay_510(void);//延時(shí)510us程序用匯編編寫
        void ChangeNum(uchar *p,uchar nCount);//NumBufe[]移位程序
        void main(void)
        {
        T0Intal();
        while(1)
        {
        if(NumSem)
        {
        PreNum=NumBufe[3]*1000+NumBufe[2]*100+NumBufe[1]*10+NumBufe[0];
        NumBufe[4]=0;
        NumSem=0;
        }
        if(op)
        {
        if(PreNum!=0)
        {
        if(NumBufe[4]==0)
        {
        NumSem=1;
        }
        if(equ)
        {
        if(NumBufe[4]!=0)
        {
        LatNum=NumBufe[3]*1000+NumBufe[2]*100+NumBufe[1]*10+NumBufe[0];
        //DisLed[]=0;
        KeyPos=0;
        }
        ResultNum();//計(jì)算器結(jié)果計(jì)算
        //DisPlay();//顯示計(jì)算結(jié)果
        }

        }
        else Clear();

        }
        if(clr)
        {
        Clear();
        }
        DisPlay();//顯示計(jì)算結(jié)果
        }

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

        }
        void T0Intal(void)
        {
        TMOD=0x01;
        TH0=(65536-20000)/256;
        TL0=(65536-20000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        }
        void DisPlay(void)
        {
        //uchar one,two,three,four;
        //one=result/1000;
        P2=DisLed[NumBufe[3]];
        P0=0xFE;
        Delay_510();
        //two=(result-one*1000)/100;
        P2=DisLed[NumBufe[2]];
        P0=0xFD;
        Delay_510();
        //three=(result-one*1000-two*100)/10;
        P2=DisLed[NumBufe[1]];
        P0=0xFB;
        Delay_510();
        //four=(result-one*1000-two*100)%10;
        P2=DisLed[NumBufe[0]];
        P0=0xF7;
        Delay_510();

        }
        void ResultNum(void)
        {
        if(op)
        {
        if(add)
        {
        result=PreNum+LatNum;
        }
        if(dec)
        {
        result=PreNum-LatNum;
        }
        if(mul)
        {
        result=PreNum*LatNum;
        }
        if(div)
        {
        result=PreNum/LatNum;
        }
        }
        //return result;
        //unsigned char
        //uchar one,two,three;
        //one=result/1000;
        NumBufe[3]=result/1000;
        NumBufe[2]=(result-NumBufe[3]*1000)/100;
        //NumBufe[2]=two;
        NumBufe[1]=(result-NumBufe[3]*1000-NumBufe[2]*100)/10;
        //NumBufe[1]=three;
        NumBufe[0]=(result-NumBufe[3]*1000-NumBufe[2]*100)%10;
        }
        void Clear(void)
        {
        // if(Clear)
        //{
        NumBufe[0]=0;
        NumBufe[1]=0;
        NumBufe[2]=0;
        NumBufe[3]=0;
        PreNum=0;
        LatNum=0;
        result=0;
        NumSem=0;
        KeyPos=0;
        clr=0;
        equ=0;
        add=0;
        dec=0;
        mul=0;
        div=0;
        op=0;
        // }
        }


        上一頁 1 2 下一頁

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 河津市| 汕头市| 霍邱县| 马关县| 夹江县| 云梦县| 西安市| 江阴市| 秭归县| 无极县| 龙游县| 荣成市| 夏邑县| 随州市| 龙岩市| 从化市| 冕宁县| 西充县| 夏津县| 凤城市| 宁城县| 广安市| 绵竹市| 新密市| 获嘉县| 香港 | 清新县| 友谊县| 怀柔区| 丹凤县| 衡阳市| 都安| 庐江县| 长阳| 武夷山市| 贡觉县| 鹤岗市| 仁布县| 扎鲁特旗| 南昌市| 莱阳市|