久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

用51單片機制作的簡單計算器程序

作者:劉杰   來源:會員發布   點擊數:  更新時間:2014年06月25日   【字體:

一、硬件仿真圖

 

 

件部分比較簡單,當鍵盤按鍵按下時它的那一行、那一列的端口為低電平。因此,只要掃描行、列端口是否都為低電平就可以確定是哪個鍵被按下。

 二、主程序流程圖



程序的主要思想是:將按鍵抽象為字符,然后就是對字符的處理。將操作數分別轉化為字符串存儲,操作符存儲為字符形式。然后調用compute()函數進行計算并返回結果。具體程序及看注釋還有流程圖。


三、程序源代碼

#include <</font>reg51.h>#include <</font>intrins.h>

#include <</font>ctype.h>            

#include <</font>stdlib.h>            

 

#define uchar unsigned char

#define uint unsigned int

 

uchar operand1[9], operand2[9];  

uchar operator;                     

 

void delay(uint);

uchar keyscan();

void disp(void);

void buf(uint value);

uint compute(uint va1,uint va2,uchar optor);

 

uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,

                0x92,0x82,0xf8,0x80,0x90,0xff};     

 

uchar dbuf[8] = {10,10,10,10,10,10,10,10};            

 

        

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

    for(y=110;y>0;y--);

}

 

 

uchar keyscan()

{

    uchar skey;                     

    

 

    P1 = 0xfe;

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

    {

        delay(3);                    

 

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

        {

            switch(P1)                

            {

                case 0xee: skey = '7'; break;

                case 0xde: skey = '8'; break;

                case 0xbe: skey = '9'; break;

                case 0x7e: skey = '/'; break;

                    

                default:   skey = '#';

            }

 

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

                ;

        }

    }

 

 

    P1 = 0xfd;    

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

    {

        delay(3);

 

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

        {

            switch(P1)

            {

                case 0xed: skey = '4'; break;

                case 0xdd: skey = '5'; break;

                case 0xbd: skey = '6'; break;

                case 0x7d: skey = '*'; break;

                    

                default:   skey = '#';

            }

 

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

                ;

        }

    }

 

 

 

    P1 = 0xfb;

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

    {

        delay(3);

        

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

        {

            switch(P1)

            {

                case 0xeb: skey = '1'; break;

                case 0xdb: skey = '2'; break;

                case 0xbb: skey = '3'; break;

                case 0x7b: skey = '-'; break;

                    

                default: skey = '#';

            }

 

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

                ;

        }

    }

 

 

 

    P1 = 0xf7;

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

    {

        delay(3);

 

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

        {

            switch(P1)

            {

                case 0xe7: skey = '$'; break;

                case 0xd7: skey = '0'; break;

                case 0xb7: skey = '='; break;

                case 0x77: skey = '+'; break;

                    

                default:   skey = '#';

            }

 

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

                ;

        }

    }

 

    return skey;

}

 

void main()

{    

    uint value1, value2, value;           

    uchar ckey, cut1 = 0, cut2 = 0;    

    uchar operator;                       

    uchar i, bool = 0;

 

init:                                   

 

    buf(0);                            

    disp();

    value = 0;

    cut1 = cut2 = 0;

    bool = 0;

    for(i = 0;i <</font> 9;i++)

    {

        operand1[i] = '\0';

        operand2[i] = '\0';

    }                                  

 

    while(1)

    {

        ckey = keyscan();             

        if(ckey != '#')

        { 

            if(isdigit(ckey))         

            {

                switch(bool)    

                {

                    case 0:

                            operand1[cut1] = ckey;

                            operand1[cut1+1] = '\0';

                            value1 = atoi(operand1);  

                            cut1++;

                            buf(value1);

                            disp();

                            break;

                    case 1:

                            operand2[cut2] = ckey;

                            operand2[cut2+1] = '\0';

                            value2 = atoi(operand2);

                            cut2++;

                            buf(value2);

                            disp();

                            break;

                            

                    default: break;

                }

            }

            else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')

            {

                bool = 1;    

                operator = ckey;

                buf(0);

                dbuf[7] = 10;

                disp();

            }

            else if(ckey == '=')

            {

                value = compute(value1,value2,operator);

                buf(value);

                disp();

                while(1)                     

                {

                    ckey = keyscan();

                    if(ckey == '$')          

                        goto init;

                    else

                        {

                            buf(value);

                            disp();

                        }

                }

            }

            else if(ckey == '$') 

            {    goto init;}

        }

        disp();

    }

 

}

 

 

uint compute(uint va1,uint va2,uchar optor)

{

    uint value;

 

    switch(optor)

    {

        case '+' : value = va1+va2;    break;

        case '-' : value = va1-va2;    break;

        case '*' : value = va1*va2;    break;

        case '/' : value = va1/va2;    break;

        

        default :  break;

    }

    return value;

}

 

 

void buf(uint val)

{

    uchar i;

    if(val == 0)

    {

        dbuf[7] = 0;

        i = 6;

    }

    

    else

        for(i = 7; val > 0; i--)

        {

            dbuf[i] = val % 10;

            val /= 10;

        }

    

    for( ; i > 0; i--)

        dbuf[i] = 10;

}

 

 

void disp(void)

{

    uchar bsel, n;

    

    bsel=0x01;

    for(n=0;n<</font>8;n++)

    { 

        P2=bsel;

        P0=table[dbuf[n]];

        bsel=_crol_(bsel,1);

        delay(3);

        P0=0xff;

    }

}

關閉窗口

相關文章

主站蜘蛛池模板: 亚洲日本欧美日韩高观看 | 国产精品久久久久久久久大全 | 人人九九精 | 乱码av午夜噜噜噜噜动漫 | 国内自拍偷拍一区 | 日韩一区二区在线视频 | 婷婷国产一区 | 欧美一级做性受免费大片免费 | 日韩国产精品一区二区三区 | 成人午夜性成交 | 亚洲精品日韩精品 | 国产日韩一区二区 | 成人在线播放网址 | 久久精品免费观看 | 国产精品99久久久久久宅男 | 免费观看黄色片视频 | 超碰免费在线观看 | 四虎影院新网址 | 亚洲精品自在在线观看 | av天天操| 中国三级黄色录像 | 丁香久久 | 国产日韩精品在线 | 日韩欧美在线一区 | 日本免费一区二区三区 | 亚洲先锋影音 | 九九99精品 | 亚洲成人一区二区三区 | 色www精品视频在线观看 | 中文字幕不卡在线观看 | 蜜桃毛片 | 日韩欧美国产精品一区二区 | 超碰人人插 | 91精品久久久久久久久中文字幕 | 精品久久久久久久 | 成人av免费 | 91精品国产乱码久久久久久久久 | 天天视频一区二区三区 | 国产亚洲一区二区精品 | 久久久久久久久国产成人免费 | 国产精品久久久久久婷婷天堂 |