新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機設計的帶余數的簡易計算器

        單片機設計的帶余數的簡易計算器

        作者: 時間:2016-11-17 來源:網絡 收藏
        原理圖:

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

        程序設計:

        #include

        #include

        #include

        #define uchar unsigned char

        #define uintunsigned int

        sbit BEEP = P3^6;//蜂鳴器驅動

        unsigned char code disp_code[]={

        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//數碼管顯示

        ucharkey;//鍵盤值

        uchar num;//掃描位數

        int temp1=0;//結果整數部分

        uint temp2=0;//結果余數部分

        int m=0;//

        uchar ss[8];//

        uchar flag;//運算標志位

        bit c_flag=0;//輔助標志位

        unsigned char code key_code[]={

        0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,

        0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 }; //鍵盤編碼

        unsigned char code num_code[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //顯示位數

        /**********************************************************

        延時子函數

        **********************************************************/

        void delayms(uint ms)

        {

        uchar t;

        while(ms--)

        {

        for(t = 0; t < 120; t++);

        }

        }

        /**********************************************************

        x*0.14MS延時子函數

        **********************************************************/

        void delay0(uchar x)

        {

        uchar i;

        while(x--)

        {

        for (i = 0; i<13; i++);

        }

        }

        /**********************************************************

        蜂鳴器驅動子函數

        **********************************************************/

        void beep()

        {

        uchar i;

        for (i=0;i<180;i++)

        {

        delay0(5);

        BEEP=!BEEP;//BEEP取反

        }

        BEEP=1;//關閉蜂鳴器

        delayms(250);//延時

        }

        /**********************************************************

        鍵盤掃描子函數

        **********************************************************/

        ucharkeyscan()

        {

        ucharscan1,scan2,keycode,j;

        P1=0xf0;

        scan1=P1;

        if((scan1&0xf0)!=0xf0)//判鍵是否按下

        {

        delayms(10);//延時30ms

        scan1=P1;

        if((scan1&0xf0)!=0xf0)//二次判鍵是否按下

        {

        P1=0x0f;

        scan2=P1;

        keycode=scan1|scan2;//組合成鍵編碼

        for(j=0;j<=15;j++)

        {

        if(keycode== key_code[j])//查表得鍵值

        {

        key=j;

        return(key);

        }

        }

        }

        }

        elseP1=0xff;

        return (16);

        }

        /*****************************************************

        顯示數據子程序

        ********************************************************/

        void display(int xx,uint yy)

        {uchartt=0;

        uint x1;

        uint y1=yy;

        while(yy!=0)//顯示余數

        {ss[tt]=yy%10;

        yy=yy/10;

        tt++ ;

        num=tt;

        }

        if(y1!=0)//顯示——

        {ss[tt]=16;

        tt++;

        ss[tt]=16;

        tt++;

        }

        x1=abs(xx);//顯示整數

        while(x1!=0)

        {ss[tt]=x1%10;

        x1=x1/10;

        tt++ ;

        num=tt;

        }

        if(xx<0)//顯示符號

        { ss[tt]=16;

        tt++;

        num=tt;}

        for(tt=0;tt

        {

        P0=disp_code[ss[tt]];

        delayms(5);

        if(P2==num_code[num-1])

        P2=0x7f;

        elseP2=_cror_(P2,1);

        }

        }

        /**********************************************************

        判鍵是否按下子函數

        **********************************************************/

        voidkeydown()

        {

        uchar tt=0;

        P1=0xf0;

        if((P1&0xf0)!=0xf0)

        {

        keyscan();

        beep();

        if(key>9&&c_flag==0)

        {switch(key)

        {case 10:flag=1;temp1=m;c_flag=1;m=0;break;

        case 11:flag=2;temp1=m;c_flag=1;m=0;break;

        case 12:flag=3;temp1=m;c_flag=1;m=0;break;

        case 13:flag=4;temp1=m;c_flag=1;m=0;break;

        case 14:m=-m;break;

        case 15:break;

        }

        }

        if(key==14&&c_flag==1)

        m=-m;

        if(key<=9)

        {if(m>=0) m=m*10+key;

        if(m<0) m=m*10-key; }

        if(key<=9&&flag==5)

        {

        flag=0;

        c_flag=0;

        temp1=temp2=0;

        }

        }

        if(key==15)

        {switch(flag)

        {case 1:temp1=temp1+m;break;

        case 2:temp1=temp1-m;break;

        case 3:temp1=temp1*m;break;

        case 4:temp2=abs(temp1)%m;temp1=temp1/m;break;

        default:;

        }

        flag=5;

        m=0;

        }

        }

        void main()

        {

        P0 = 0xc0;

        P2 = 0x7f;//數碼管顯示"0"

        P1 = 0xff;

        while(1)

        {

        keydown();

        if(flag==5)

        display(temp1,temp2);

        else display(m,0);

        }

        }

        實物照片:



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 曲靖市| 土默特左旗| 偃师市| 亳州市| 乳源| 霍山县| 长寿区| 铜山县| 称多县| 清水河县| 绥德县| 华蓥市| 淮北市| 廉江市| 广元市| 大关县| 巴塘县| 平江县| 荥阳市| 双城市| 玉屏| 若尔盖县| 邹城市| 颍上县| 平定县| 旺苍县| 沧州市| 浪卡子县| 成武县| 赤峰市| 德庆县| 荃湾区| 江山市| 银川市| 锡林郭勒盟| 茂名市| 绵阳市| 马公市| 汽车| 吉隆县| 开远市|