久久久久久久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;

    }

}

關閉窗口

相關文章

主站蜘蛛池模板: 日韩综合一区 | 粉嫩国产精品一区二区在线观看 | 日韩中文字幕视频 | 精品国产免费一区二区三区演员表 | 最新国产精品视频 | 国产网站在线播放 | 亚洲国产中文在线 | 日韩毛片| 日日草夜夜草 | www.97国产 | 日本一区二区三区视频在线 | 日屁视频| 欧洲精品视频一区 | 麻豆精品国产91久久久久久 | 欧美一区二区三区在线观看 | 99精品久久| 91精品国产综合久久精品 | 欧美在线视频不卡 | 亚洲成人中文字幕 | 日韩精品视频网 | 国产精品视频专区 | 国产激情偷乱视频一区二区三区 | 亚洲精品短视频 | 黄网站涩免费蜜桃网站 | 91精品欧美久久久久久久 | 一级毛片播放 | 午夜视频精品 | 日本激情一区二区 | 亚洲一区二区三区四区五区午夜 | 精品国产乱码久久久久久蜜臀 | 久久伊人精品一区二区三区 | 日韩精品亚洲专区在线观看 | 午夜亚洲| 国产精品久久久久久久久久久久久 | 欧美久久久网站 | 欧美日韩亚洲一区 | 欧美色视频免费 | 美女天天操 | 久久久久久久国产 | 欧美激情在线播放 | 亚洲欧美日韩久久久 |